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

推荐订阅源

B
Blog
Microsoft Security Blog
Microsoft Security Blog
Jina AI
Jina AI
博客园 - 叶小钗
J
Java Code Geeks
博客园 - 聂微东
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
美团技术团队
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
罗磊的独立博客
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
小众软件
小众软件

林中阴影

林中阴影 | 关于蓝光刻录的一些调查 林中阴影 | 与IPv6地址战斗 林中阴影 | 半年前的NAS升级 林中阴影 | “智能” 家居笔记:一→两年后的回顾 林中阴影 | 旧手机做RDP客户端的一些尝试 林中阴影 | 一些矿渣的耗电量 林中阴影 | 穷人的IP-KVM远程访问 林中阴影 | “智能”家居笔记,其之二 林中阴影 | “智能”家居笔记,其之一 林中阴影 | 仅IPv6家庭内网服务实现v6+v4双栈访问 林中阴影 | 下载装小蜜监理拍摄的图片 林中阴影 | 几物互联 林中阴影 | 整了个“新”平板 林中阴影 | 获取招商信用卡账单的另一种方法 林中阴影 | 我在GitHub的⭐ 林中阴影 | Python与光学计算,2021 林中阴影 | 你可能并不需要内网穿透 林中阴影 | 2020 林中阴影 | 和(基本上)什么也不能连的电脑传递信息 林中阴影 | 我将贻笑于大方之家 林中阴影 | 一个新主题 林中阴影 | 2019过去了,我…… 林中阴影 | Beancount试用,半年后 林中阴影 | 自动输入剪贴板中的内容 林中阴影 | Unicode与数学公式 林中阴影 | Python中光学计算相关的库/Awesome Python for Optics 林中阴影 | 一本厕纸小说 林中阴影 | 震惊!为了在Windows上访问EXT4分区,他竟然做出了这样的事! 林中阴影 | 我的2018 林中阴影 | 笔记软件踩雷
林中阴影 | 内网访问第三季:在运营商的CGNAT网络下
2023-05-10 · via 林中阴影

是的,在这次这次之后,在酒店里百无聊赖的现在,我又开始折腾起VPN来了。

是的,在酒店里仍然没有IPv6地址。

为什么

正如前文所述,无论是Tailscale/Headscale、Nebula或Netmaker,原理均大同小异,都是在Wireguard基础上,用类STUN协议来穿越NAT,或利用TURN(DERP)服务器进行转发。在国内家庭宽带网络环境下,一般存在路由器、光猫、运营商三重NAT防火墙,STUN需要跨越多重阻碍,自动穿越希望渺茫;另一方面,公开转发服务多在国外,延迟高居不下,而国内私有云价格亦是高不可攀,自建服务并非经济的选择。

然而,三重NAT也并非坚不可摧。光猫一级,只要改为桥接,便可迎刃而解;路由一级,可以通过端口映射来绕过;而运营商级多为NAT1,通过Natternatmap,可以获得近似公网的效果。这样,使用纯粹的Wireguard,也能够直接回到家庭网络内部,免去国外中转的烦恼。

从广东联通到北京联通。

从广东联通到北京联通。

从广东联通经北京联通到甘肃移动。个人觉得,在这种延迟下追求Full Mesh也不再重要了。

从广东联通经北京联通到甘肃移动。个人觉得,在这种延迟下追求Full Mesh也不再重要了。

怎么做

在开始之前,首先检查是否满足以下要求:

  1. 一台长期开启的设备。

    既然有远程访问的要求,远处有一台服务器是很自然的吧。

  2. 光猫处于桥接状态。
  3. 主路由是OpenWRT,或者内网里有DMZ主机。

    或者,你是端口转发专家,可以从光猫外侧一路转发到最内部。

  4. 没有公网IPv4,但在路由器处测试NAT类型为NAT1。

    这里可以用Natter自带的功能来测试。如果你有公网IPv4的话,直接打开端口就好,而且我会很羡慕你。

  5. 一个自己的域名,最好是在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进行连接。

使用方法:

  1. 安装wireguard-windows,用客户端连接测试成功。
  2. 在文件夹C:\example下建立wg.ps1nat.conf,粘贴Gist内容。
  3. 按照实际情况修改nat.conf,以及wg.ps1$Hostname部分。Endpoint不必修改。
  4. 以管理员身份运行PowerShell
  5. 设置ps1脚本运行权限:Set-ExecutionPolicy RemoteSigned(或Unrestricted)
  6. 启动、重启Wireguard:C:\example\wg.ps1 -up
  7. 停止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天,所以应该不必时常刷新。

我这里最近一次分配的端口坚持了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

WireGuard for Android

NB4A提供的Wireguard Outbound

NB4A提供的Wireguard Outbound

Nebula,对端部署在路由器上

Nebula,对端部署在路由器上

很难想象,对于访问内网这样一个简单的需求,我居然花费了如此多的精力。不过,这次应该算是当前比较满意的方案,应该能坚持到下次水逆开始。