WireGuard双跳配置后客户端无法访问互联网的问题求助
WireGuard双跳配置后客户端无法访问互联网的问题求助
Hey,我完全懂你这种按了一堆教程还是搞不定的挫败感!我之前在多跳WireGuard配置上也踩过不少坑,结合你的情况(DigitalOcean Debian 10 droplets),给你梳理一套一步步排查+配置的实操方案,你可以跟着走一遍试试:
一、先确认核心的IP转发与NAT配置
这是双跳上网最容易忽略的基础项:
开启IP转发(两台服务器都要做)
临时生效:echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv6/conf/all/forwarding # 用IPv6的话才需要永久生效:编辑
/etc/sysctl.conf,把以下两行的注释去掉,然后执行sysctl -p加载配置:net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 # 用IPv6的话保留配置NAT(仅出口节点Server2操作)
假设Server2的公网网卡是eth0(DigitalOcean默认网卡名),WireGuard子网是10.0.0.0/24,执行以下命令让出口节点做地址转换:iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE # IPv6版本(如果用的话): # ip6tables -t nat -A POSTROUTING -o eth0 -s fd42:42:42::/64 -j MASQUERADE为了让规则重启后不丢失,安装
iptables-persistent:apt install iptables-persistent安装时会提示保存当前规则,选
Yes即可。
二、检查WireGuard配置文件的关键参数
假设你的拓扑是:客户端 → Server1(中间节点) → Server2(出口节点),重点核对以下配置:
1. 客户端配置
[Interface] PrivateKey = 你的客户端私钥 Address = 10.0.0.2/32 # 客户端WireGuard IP DNS = 8.8.8.8 # 可选,防止DNS泄漏 [Peer] PublicKey = Server1的公钥 Endpoint = Server1的公网IP:51820 # Server1的WireGuard监听端口 AllowedIPs = 0.0.0.0/0, ::/0 # 所有流量走WireGuard PersistentKeepalive = 25 # 保持NAT会话
2. Server1(中间节点)配置
重点解决你提到的「启动后断连」问题:
[Interface] PrivateKey = Server1的私钥 Address = 10.0.0.1/32, 10.0.1.2/32 # 同时加入客户端子网和Server2的子网 ListenPort = 51820 PostUp = ip route add 10.0.0.0/24 dev wg0 # 手动添加客户端子网路由到WireGuard接口 PostDown = ip route del 10.0.0.0/24 dev wg0 [Peer] # 客户端Peer PublicKey = 客户端的公钥 AllowedIPs = 10.0.0.2/32 # 仅允许客户端IP的流量 [Peer] # Server2的Peer PublicKey = Server2的公钥 Endpoint = Server2的公网IP:51821 AllowedIPs = 0.0.0.0/0, ::/0 # 把所有流量转发到Server2 RouteAllowedIPs = false # 关键!禁止自动修改默认路由,防止Server1自己断网 PersistentKeepalive = 25
3. Server2(出口节点)配置
[Interface] PrivateKey = Server2的私钥 Address = 10.0.1.1/32 ListenPort = 51821 [Peer] # Server1的Peer PublicKey = Server1的公钥 AllowedIPs = 10.0.1.2/32, 10.0.0.0/24 # 允许Server1和客户端子网的流量 PersistentKeepalive = 25
三、启动与测试步骤
- 先启动Server2:
wg-quick up wg0 - 再启动Server1:
wg-quick up wg0(现在应该不会断连了) - 最后启动客户端:
wg-quick up wg0 - 测试顺序:
- 客户端ping Server1的WireGuard IP(10.0.0.1),确认通
- 客户端ping Server2的WireGuard IP(10.0.1.1),确认通
- 客户端ping
8.8.8.8,如果通了再测试网页访问
- 若还是不通,在Server2上抓包排查:
tcpdump -i eth0 icmp,看有没有来自客户端的ICMP包:- 没包:说明路由转发没生效,检查Server1的路由和AllowedIPs
- 有包但没回包:说明NAT配置有问题,重新核对iptables规则
备注:内容来源于stack exchange,提问作者Maks




