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 ACCEPTFORWARD -o wg0 -j ACCEPT:放行 wg0 接口的转发流量,这是隧道内客户端访问公网的关键。
  • iptables --list 看,INPUTFORWARDOUTPUT 的默认策略都是 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 配置是正确的,它能保证隧道内流量正常转发。现在无法访问谷歌,核心排查方向是:
  1. 确认服务器内核 net.ipv4.ip_forward=1 已永久开启。
  2. 确认客户端 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-resolvedNetworkManager)没有把这个配置接管,DNS 请求还是会走物理网卡,被 GFW 污染,返回错误的 IP,导致你 ping 不通。

解决步骤(按顺序执行)

1. 检查客户端当前使用的 DNS 服务器

在客户端执行:
bash
运行
cat /etc/resolv.conf
如果输出的 nameserver 不是 8.8.8.81.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 走隧道?