我不确定我的服务器端这个是不是正确的。
WireGuard VPN 连接问题解决
导出时间:2026/5/27 19:59:05
来源地址:https://www.doubao.com/chat/38413759169925890
消息数量:4
从你贴的
iptables 输出来看,整体是正确的,但有一个小细节需要确认,我帮你逐条分析:1. 先看你的 iptables 规则
① filter 表(基础过滤)
plaintext
-A INPUT -i wg0 -j ACCEPT
-A FORWARD -i wg0 -j ACCEPT
-A FORWARD -o wg0 -j ACCEPT
INPUT -i wg0 -j ACCEPT:放行从wg0进入的所有流量,保证你能 ping 通服务器内网 IP(10.3.0.1)。FORWARD -i wg0 -j ACCEPT和FORWARD -o wg0 -j ACCEPT:放行wg0接口的转发流量,这是隧道内客户端访问公网的关键。- 从
iptables --list看,INPUT、FORWARD、OUTPUT的默认策略都是ACCEPT,这在测试环境下没问题,但生产环境建议收紧。
② nat 表(NAT 转发)
plaintext
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.3.0.0/24 -o eth0 -j MASQUERADE
- 这两条规则都在做同样的事:把从
wg0来的 10.3.0.0/24 段流量,伪装成服务器公网 IP 发出去。 - 第二条
-s 10.3.0.0/24更精准,是我们之前建议的 “只对隧道流量做 NAT”,这是正确的。
2. 为什么客户端还是访问不了谷歌?
既然 iptables 规则没问题,那问题大概率出在以下两点:
① 内核 IPv4 转发是否永久开启?
你之前可能只临时开启了转发,重启后就失效了。请在服务器上执行:
bash
运行
sudo sysctl net.ipv4.ip_forward
如果输出是
1,说明转发已开启;如果是 0,请执行:bash
运行
sudo sysctl -w net.ipv4.ip_forward=1
sudo nano /etc/sysctl.conf
# 找到并修改为 net.ipv4.ip_forward = 1
sudo sysctl -p
② 客户端 DNS 解析是否走隧道?
你现在的问题是 “能 ping 通服务器,但 ping 不通谷歌域名”,这是典型的 DNS 污染或 DNS 没走隧道的表现。
请在客户端执行:
bash
运行
ping 8.8.8.8 -c 5
- 如果能 ping 通 8.8.8.8(谷歌 DNS IP),说明隧道转发没问题,问题在 DNS。
- 如果 ping 不通 8.8.8.8,说明转发或防火墙还有问题。
如果是 DNS 问题,请检查客户端
wg2.conf,确保有以下配置:ini
[Interface]
...
DNS = 8.8.8.8, 1.1.1.1
DNSDefaultRoute yes
Table = auto
...
[Peer]
...
AllowedIPs = 0.0.0.0/0, ::/0
...
重启客户端 WireGuard 后,再尝试访问谷歌。
3. 总结
你的服务器端 iptables 配置是正确的,它能保证隧道内流量正常转发。现在无法访问谷歌,核心排查方向是:
- 确认服务器内核
net.ipv4.ip_forward=1已永久开启。 - 确认客户端 DNS 请求是通过隧道(8.8.8.8)进行的,而不是被本地 DNS 污染。
你可以先在客户端测试
ping 8.8.8.8,把结果告诉我,我就能帮你精准定位。需要我帮你生成一份客户端
wg2.conf 的最终配置模板吗?直接替换就能用。服务器端确实是开启了 IPv 四的转发,客户端也能 ping 到 8.8.8,都没有问题,但是还是 ping 不到谷歌点 com。
你现在的情况非常典型:
- 客户端能 ping 通 8.8.8.8 → 说明隧道转发、NAT、内核转发都没问题;
- 客户端能 ping 通服务器内网 IP → 隧道本身是通的;
- 但就是 ping 不通
google.com→ 这是纯 DNS 解析问题,而且是「客户端本地 DNS 没走隧道」导致的污染。
核心原因:客户端的 DNS 请求没有走 WireGuard 隧道
即使你在
wg2.conf 里写了 DNS = 8.8.8.8,如果系统(如 systemd-resolved、NetworkManager)没有把这个配置接管,DNS 请求还是会走物理网卡,被 GFW 污染,返回错误的 IP,导致你 ping 不通。解决步骤(按顺序执行)
1. 检查客户端当前使用的 DNS 服务器
在客户端执行:
bash
运行
cat /etc/resolv.conf
如果输出的
nameserver 不是 8.8.8.8 或 1.1.1.1,而是本地路由器或 ISP 的 DNS,说明 DNS 没走隧道。2. 强制客户端 DNS 走隧道(两种方法)
方法 A:使用 resolvconf 接管(推荐,最干净)
bash
运行
# 安装 resolvconf
sudo apt update && sudo apt install -y resolvconf
# 编辑 wg2.conf,添加 Table = off,让 wg-quick 接管 DNS
sudo nano /etc/wireguard/wg2.conf
在
[Interface] 段添加:ini
Table = off
PostUp = resolvconf -a tun.wg2 -m 0 -x <<-'EOF'
nameserver 8.8.8.8
nameserver 1.1.1.1
EOF
PostDown = resolvconf -d tun.wg2 -f
重启客户端 WireGuard:
bash
运行
sudo wg-quick down wg2 && sudo wg-quick up wg2
方法 B:临时覆盖 resolv.conf(快速测试)
bash
运行
# 备份原文件
sudo cp /etc/resolv.conf /etc/resolv.conf.bak
# 强制使用谷歌 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf
测试
ping google.com,如果通了,说明就是 DNS 没走隧道的问题。3. 验证 DNS 解析是否走隧道
在客户端执行:
bash
运行
nslookup google.com
正常输出应该是:
plaintext
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: google.com
Address: 142.250.185.142
...
如果
Server 不是 8.8.8.8,说明 DNS 还是没走隧道。最终结论
你的服务器配置(iptables、转发、NAT)完全正确,问题出在客户端的 DNS 解析没有走 WireGuard 隧道,导致域名被污染。
只要强制客户端的 DNS 请求通过隧道(8.8.8.8),就能正常访问谷歌了。
要不要我帮你生成一份客户端
wg2.conf 的最终配置模板,直接复制替换就能确保 DNS 走隧道?