惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
Martin Fowler
Martin Fowler
A
About on SuperTechFans
H
Help Net Security
F
Full Disclosure
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
H
Heimdal Security Blog
博客园_首页
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
B
Blog RSS Feed
Last Week in AI
Last Week in AI
V2EX - 技术
V2EX - 技术
The Register - Security
The Register - Security
Security Archives - TechRepublic
Security Archives - TechRepublic
G
GRAHAM CLULEY
美团技术团队
S
Securelist
MyScale Blog
MyScale Blog
Vercel News
Vercel News
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
W
WeLiveSecurity
M
MIT News - Artificial intelligence
宝玉的分享
宝玉的分享
月光博客
月光博客
Attack and Defense Labs
Attack and Defense Labs
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Forbes - Security
Forbes - Security
罗磊的独立博客
O
OpenAI News
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
雷峰网
雷峰网
S
Security @ Cisco Blogs
MongoDB | Blog
MongoDB | Blog
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
V
Visual Studio Blog

方永、南天紫雲

linux透明代理 技术的边界 停机问题通俗说明 Rust与oracle、redis集群的纠结 学习能力的增长 微信调试的原语 mac外接移动硬盘安装ArchLinux linux的死机问题 linux下全键盘操作 漂亮又好用的bspwm linux本机透明代理 ssh、mosh、autossh linux不能待机又一例 从WordPress切换到Hugo 折腾电脑开机 linux系统QQ新思路 Arch Linux的字体渲染 svn管理之submin OpenWrt自动fucking墙記錄 二维码(qrcode)名片的一些事儿 用lua nginx module搭建一个二维码(qr code)生成器 CentOS 7 安裝註記 php程序連接MySQL时只能127.0.0.1而localhost無法連接的問題 ThinkPad之FAN_ERROR、hi fi聲卡 jetty多端口部署 OpenWrt簡單暴力限網 linux中cron之PATH变量 OpenWrt的WDS無線橋接模式 再敘OpenWrt下的rtl8187無線中繼 sed之模擬tail 終端進化之二零一三 linux下的郵件服務器:postfix_dovecot_roundcube 一次性密碼/動態口令卡原理 xl2tp之VPN靜態地址分配 rtl2838U2832试用记 linux中pptp协议VPN搭建 glances监控工具安装 CentOS6.4硬盘安装 Debian Wheezy硬盤/U盤安裝小記 Kirby小試 zsh shell怎么打开常用的目录? OpenWrt SSH免密码使用密钥登录 linux中的vsftpd的匿名(anonymous)用户配置 無光驅無USB無軟驅,怎麼修復硬盤MBR? 那些個人網站 linuxFreeBSD下的dnspod动态域名客户端 Windows系统盘的32K之殇 一枚Chrome插件引起的大量磁盤IO問題 用批處理切換網卡的IP(適用Win7、Win8) Windows中的DHCP服务器 Win8啓動時出現“您的電腦需要修復”問題的解決辦法 Windows8睡眠(待机)模式异常处理 最强大好用而又小巧的计算器 Windows8運行不能保存歷史命令 Win8下的红警2尤里复仇 为cmd添加readline,如Bash Shell般使用cmd 手动添加修改win8 win+x菜单 Win8運行卸載程序時提示2503之解決一法 烽火HG110提权一法 缓解眼疲劳有效的办法 mintty乱码解决办法 糟糠美妾 免费易用的Win8 ArchLinux的類box環境音量調節二三事 使用OpenWrt与curl挂QQ OpenWrt的安全 OpenWrt BCM63xx rtl8187使用注意事项 Arch Linux之systmed使用简介 Archlinux 2012.07.15之后发布的镜像新手安装完全向导 FreeBSD 9.0 安装简记 记一由FreeBSD引发的午夜惊魂 Jekyll or handmade wi-fi无线破解过程与原理简要介绍 修复QQ影音异常卸载后的文件关联 吐槽一下000webhost 为OpenWrt的luci Web界面加速 最小的sed for Windows linux的磁盘自动挂载 OpenWrt中crontab -e的使用 sddns(dnspod client for OpenWrt)使用说明 OpenWrt中vsftp添加新用户 php+markdown写博客 linux arp防火墙之p2p终结者 墙外的世界很精彩 OpenWrt使用dnspod的动态域名解析(ddns)功能 OpenWrt架设nginx php网站 openwrt架设uhttpd+php+sqlite网站 vim自动跳到上次离开的光标位置 OpenWrt无线中继配置文件 修行八支 漫步者R201T打摩升级改造 阿里(Ali)3328系dvb接收机软件升级方法 db120刷OpenWrt固件并使用ppp方式ADSL拨号 移动短信助手 chrome tips一则 cdate,显示中国传统农历日期 更改硬盘模式为AHCI后Windows及linux的调整 使用grub2加载软盘和光盘镜像 电脑用数据线连接手机上网 电脑通过蓝牙连接手机GPRS上网
NAT穿透的问题
zola · 2022-03-29 · via 方永、南天紫雲

之前在 WireGuard使用记录 里提到 full mesh 网络的组建,但有一个关键之处, NAT的穿透问题,并未展开。

只是在文中提到,用wg set ...手动更新了 endpoint 后两个NAT之后的机器可以互相 ping 通。 是什么原理呢,在这里详述一下。

大家知道,NAT的出现是为了应对IPv4地址短缺的问题,顺便也会带来一点安全上的提升。 NAT是IP网络上的一个节点,它会把内部主机发起的连接的IP地址,替换为自己的IP地址, 而端口号,替换为自己的按一定规则生成的端口号。

由此知道,NAT上最重要的资源是65536个端口号,这些端口耗尽了,NAT也就处于不可用状态了(假设此NAT只有一个IP)。

NAT可以分为两类、4种类型,这两类是锥型和对称型,锥型里根据对外部地址和端口的限制,又有3种类型,如下表:

编号名称
1完全锥型NAT(Full cone NAT)
2受限锥型NAT((Address-)Restricted cone NAT)
3端口受限锥型NAT(Port-Restricted cone NAT)
4对称型NAT(Symmetric NAT)

顾名思义,锥型和对称型是 NAT 的 形状,锥型,内部主机经NAT到外部主机的所有连接, 都会通过NAT上面的1个端口,画张图,会看到很多条线汇聚到了一个端点上,也就是锥型的形状; 而对称型,不同的IP地址和端口,会映射到NAT上面的不同端口,画成图形,是很多的平行线。

NAT穿透

有3台主机,如下表,现在需要 A 和 C 直接连接。

名称描述
A锥型NAT之后
B有公网IP
C锥型NAT之后
  1. A首先连接B,于是B知道了A的NAT的IP地址和A在NAT上映射的端口号;
  2. 同理,C连接B,B也知道了C的NAT的IP地址和端口号;
  3. B告诉A,C的NAT的IP地址和端口号,B告诉C,A的NAT的IP地址和端口号;
  4. 对于NAT1型,即完全锥型,A向C的NAT IP地址和端口号发送数据,C会顺利接收到,C向A发数据同样如此,NAT穿透成功。
  5. 对于NAT2或NAT3型,C接收不了A发送的数据,原因是A发送到C的数据, NAT会认为这是一个无效的数据,它的连接表里没有A的NAT的IP地址和端口号的记录。 处理也很简单,即C向A的NAT的IP地址和端口号发送一次数据。同理,A接收C发送的数据也是如此,A和C直连成功。
  6. 对于NAT4型即对称型,A向C的NAT IP地址和端口号发数据,C接收不到,原因是NAT重新分配了端口号。 先假定A的NAT是NAT4型,C的NAT是NAT2或3型,A向B和A向C分别发送数据时,A的NAT上映射的端口号是不同的, A向C发送数据时NAT映射的端口号B和C都不知道,怎么办,暴力猜解!没错,尝试2048次,成功率可以达到99.9%(参见文末"How NAT traversal works"链接)

现实情况

真实的网络情况,要复杂一些,比如A和C之间有多个NAT,如果其中之一是NAT4型,那么穿透的难度将大大增加。 如果A和C处于同一个NAT之后,但是A和C因为各种原因隔离在了不同的网络中,它们之间还是不能直连的。

所以,NAT穿透的备用项就是中继(relay),常见是的 TURN,当然也可以自己实现。

总结

NAT的穿透,是受限于诸多因素的,要形成一个通用的、高成功率的解决办法,是需要做很多工作的。

参考

  1. 网络地址转换
  2. How NAT traversal works