You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

三、启动与测试步骤

  1. 先启动Server2:wg-quick up wg0
  2. 再启动Server1:wg-quick up wg0(现在应该不会断连了)
  3. 最后启动客户端:wg-quick up wg0
  4. 测试顺序:
    • 客户端ping Server1的WireGuard IP(10.0.0.1),确认通
    • 客户端ping Server2的WireGuard IP(10.0.1.1),确认通
    • 客户端ping 8.8.8.8,如果通了再测试网页访问
  5. 若还是不通,在Server2上抓包排查:tcpdump -i eth0 icmp,看有没有来自客户端的ICMP包:
    • 没包:说明路由转发没生效,检查Server1的路由和AllowedIPs
    • 有包但没回包:说明NAT配置有问题,重新核对iptables规则

备注:内容来源于stack exchange,提问作者Maks

火山引擎 最新活动