内网访问第三季:在运营商的CGNAT网络下

原文约2000字,阅读约需5分钟。发表于:

是的,在这次和这次之后,在酒店里百无聊赖的现在,我又开始折腾起VPN来了。 是的,在酒店里仍然没有IPv6地址。 为什么 正如前文所述,无论是Tailscale/Headscale、Nebula或Netmaker,原理均大同小异,都是在Wireguard基础上,用类STUN协议来穿越NAT,或利用TURN(DERP)服务器进行转发。在国内家庭宽带网络环境下,一般存在路由器、光猫、运营商三重NAT防火墙,STUN需要跨越多重阻碍,自动穿越希望渺茫;另一方面,公开转发服务多在国外,延迟高居不下,而国内私有云价格亦是高不可攀,自建服务并非经济的选择。 然而,三重NAT也并非坚不可摧。光猫一级,只要改为桥接,便可迎刃而解;路由一级,可以通过端口映射来绕过;而运营商级多为NAT1,通过Natter或natmap,可以获得近似公网的效果。这样,使用纯粹的Wireguard,也能够直接回到家庭网络内部,免去国外中转的烦恼。 从广东联通到北京联通。 从广东联通经北京联通到甘肃移动。个人觉得,在这种延迟下追求Full Mesh也不再重要了。 怎么做 在开始之前,首先检查是否满足以下要求: 一台长期开启的设备。 既然有远程访问的要求,远处有一台服务器是很自然的吧。 光猫处于桥接状态。 主路由是OpenWRT,或者内网里有DMZ主机。 或者,你是端口转发专家,可以从光猫外侧一路转发到最内部。 没有公网IPv4,但在路由器处测试NAT类型为NAT1。 这里可以用Natter自带的功能来测试。如果你有公网IPv4的话,直接打开端口就好,而且我会很羡慕你。 一个自己的域名,最好是在Cloudflare上托管的。 需要DDNS功能实时更新域名。如果没有域名的话,可能需要一些别的手段来实时得到端口。 具体配置部分已经有人写的很详细了。首先按照WireGuard Point to Site Configuration设置点到站点的连接,然后按照natmap Wiki设置NATMap即可。注意,在路由器上操作的时候,一定要记得在防火墙中打开对应端口。 完成以上步骤之后,应该已经可以从移动网络访问内网的Wireguard Peer了。 一点问题 由于运营商网关不受我们控制,外网的IP和端口号都是随机分配的,每当地址变化时,NATMap将执行自定义脚本。在上面的Wiki中,利用DDNS,把IPv4地址和端口编码进IPv6的AAAA记录中。这并不是一种标准的技术,不过既然2001::就是给teredo使用的,在这里随便用用也无所谓。 对于Windows下的Wireguard客户端,我(和ChatGPT一起)写了一个PowerShell脚本,能够自动修改配置文件的Endpoint并调用wireguard.exe进行连接。 使用方法: 安装wireguard-windows,用客户端连接测试成功。 在文件夹C:\example下建立wg.ps1和nat.conf,粘贴Gist内容。 按照实际情况修改nat.conf,以及wg.ps1中$Hostname部分。Endpoint不必修改。 以管理员身份运行PowerShell 设置ps1脚本运行权限:Set-ExecutionPolicy RemoteSigned(或Unrestricted) 启动、重启Wireguard:C:\example\wg.ps1 -up 停止Wireguard:C:\example\wg.ps1 -down 在Windows 11, Powershell 5.1.22621.963测试通过,也可以配合Windows下的sudo使用。 另外,在Android下,也可以用termux运行nm-echo.sh来获得IP地址,手动修改Wireguard官方客户端中的IP。甚至,可以使用你喜欢的代理客户端(比如NB4A),配置好Wireguard Outbond和路由就可以了~ 我这里最近一次分配的端口坚持了18天,所以应该不必时常刷新。 如果需要更为稳定的访问,可以参考reresolve-dns.ps1,这个脚本可以在上一次握手时间过久时刷新DNS,但是因为要添加计划任务,有一点过于复杂了。 Bonus Natmap的另一种用法是映射BT客户端,从而使外来连接能够主动发起连接,获得所谓的High ID。见wits-fe/bittorrent-NAT-hole-punching。在PT站做种的时候应该会很有用。 附:性能测试 随便找了一个公共WiFi,用手机(一加7T)上Termux中的iperf3测速。 由于多层NAT的限制,Nebula类组网工具必须部署在路由器位置。可以看出,对路由器(万元级,K3)带来的压力还是比较大的。 WireGuard for Android NB4A提供的Wireguard Outbound Nebula,对端部署在路由器上 很难想象,对于访问内网这样一个简单的需求,我居然花费了如此多的精力。不过,这次应该算是当前比较满意的方案,应该能坚持到下次水逆开始。

本文介绍了如何在三重NAT防火墙下使用Wireguard实现内网访问,通过改变光猫为桥接状态、端口映射和使用Natter或natmap等方法,可以绕过NAT防火墙。作者分享了一个PowerShell脚本,可以自动修改配置文件的Endpoint并连接Wireguard。Natmap的另一种用法是映射BT客户端,使外来连接能够主动发起连接。这是一个比较满意的方案,可以坚持到下次水逆开始。

内网访问第三季:在运营商的CGNAT网络下
相关推荐 去reddit讨论