Mac下WireGuard嵌套路由异常:内层隧道未使用外层隧道而是走主机默认网关
Mac下WireGuard嵌套路由异常:内层隧道未使用外层隧道而是走主机默认网关
我之前在Mac上折腾WireGuard嵌套隧道时也碰到过几乎一模一样的问题,核心矛盾就是wg-quick的自动路由逻辑“好心办坏事”——它会默认给内层隧道的Endpoint地址加一条走主机默认网关的路由,但你的内层服务器IP根本无法从主机直接访问,必须走外层隧道才行。结合你提供的信息,咱们一步步来解决:
问题拆解
你已经确认了几个关键信息:
- 外层隧道配置正确,能正常访问内层服务器IP(因为外层客户端的
AllowedIPs已经包含了内层公网IP,启动后这条路由会自动指向utun3) - 内层隧道本身能建立连接(
wg show能看到握手记录) - 手动给单个网站加路由到utun4能正常工作,说明只是全局路由的配置出了问题
具体解决方案
1. 完善外层客户端配置细节
外层客户端里你已经加了内层公网IP到AllowedIPs,这一步非常关键要保留。另外建议给外层隧道加上MTU配置,避免后续内层隧道的数据包分片出问题:
[Interface] PrivateKey = ... Address = 10.0.0.2/32 MTU = 1440 # 新增:适配WireGuard的封装开销,给内层留足空间 # FwMark = 51820 [Peer] PublicKey = ... AllowedIPs = <inner external ip>/32, 10.0.0.1/32 Endpoint = <outer external ip>:51820
启动外层隧道后,用route -n get <inner external ip>验证,输出里的interface应该是utun3,确认这条路由生效。
2. 修改内层客户端配置,禁用自动路由
wg-quick自动添加的那条内层IP→主机默认网关的路由是罪魁祸首,所以必须禁用它的自动路由功能,加上Table = off:
[Interface] PrivateKey = ... Address = 10.1.0.2/32 MTU = 1380 # 保持这个设置,1440-60=1380,适配外层MTU Table = off # 关键:阻止wg-quick自动生成错误路由 [Peer] PublicKey = ... AllowedIPs = 0.0.0.0/0 Endpoint = <inner external ip>:51820
3. 手动添加全局路由到内层隧道
先启动外层隧道(wg-quick up ./outer.conf),再启动内层隧道(wg-quick up ./inner.conf),然后执行以下命令把所有IPv4流量导向内层隧道:
# 方式一:直接添加默认路由 sudo route -q -n add -inet 0.0.0.0/0 -interface utun4 # 或者用wg-quick默认的分段方式,效果一致 # sudo route -q -n add -inet 0.0.0.0/1 -interface utun4 # sudo route -q -n add -inet 128.0.0.0/1 -interface utun4
4. 验证配置是否生效
- 检查默认路由:
route -n get 8.8.8.8,输出的interface应该是utun4 - 检查内层服务器IP的路由:
route -n get <inner external ip>,输出的interface应该是utun3 - 测试互联网访问:随便打开个网站,或者用
curl https://example.com,同时用wg show utun4 transfer看流量是否增加,确认走的是内层隧道
为什么之前手动加路由会失败?
大概率是MTU的问题——你之前外层隧道没设置MTU,默认的1500会导致内层隧道的数据包(1380字节)加上WireGuard的封装后超过外层的MTU,触发分片甚至丢包。给外层加上1440的MTU后,就能完美适配内层的1380了。
备注:内容来源于stack exchange,提问作者Romeo
相关产品推荐
相关产品推荐

