我已经设置了 WireGuard VPN,但是在使用以下命令成功连接后,浏览器无法从互联网加载网页:
wg-quick up `pwd`/myifwg0.conf
我检查了服务器WireGuard 界面 - 看起来不错:
$ sudo wg show wg0
interface: wg0
public key: <SERVER_PUB_KEY>
private key: (hidden)
listening port: 51820
peer: <CLIENT_PUB_KEY>
endpoint: <SERVER_PUBLIC_IP>:45884
allowed ips: 10.0.1.2/32
latest handshake: 4 minutes, 44 seconds ago
transfer: 2.32 KiB received, 3.63 KiB sent
我检查了客户连接时的 WireGuard 接口 - 看起来不错:
$ sudo wg show myifwg0
interface: myifwg0
public key: <CLIENT_PUB_KEY>
private key: (hidden)
listening port: 59386
fwmark: 0xca6c
peer: <SERVER_PUB_KEY>
endpoint: <SERVER_PUBLIC_IP>:51820
allowed ips: 0.0.0.0/0, ::/0
latest handshake: 15 seconds ago
transfer: 124 B received, 8.63 KiB sent
persistent keepalive: every 25 seconds
我注意到,当连接到 Server WireGuard VPN 时,这些命令会永远挂起:
curl google.com
ping google.com
这可能与 DNS 问题有关,因为我能够在连接到 VPN 时nslookup google.com
将解析的 IP 复制/粘贴nslookup
到网络浏览器中,然后我就能够访问google.com
主页。
我尝试在 VPN 客户端配置文件中强制使用 DNS IP,例如DNS = 1.1.1.1
或DNS = 8.8.8.8
或DNS = 127.0.0.53
(最后一个来自/etc/resolv.conf
),但效果是相同的:
- 我的网络浏览器无法访问网页
curl
类似或ping
无法解析域的命令
在 VPN 客户端中,这些是版本:
apt-cache show wireguard
:版本:1.0.20200513-1~20.04.2lsb_release -a
:Ubuntu 20.04.2 LTS 焦点
如何修复 VPN 客户端或 VPN 服务器或两者的配置,以便能够从 VPN 客户端导航互联网?
编辑
我的客户配置myifwg0.config
是这样的:
[Interface]
Address = 10.0.1.2/32
PrivateKey = <CLIENT_PRIV_KEY>
DNS = 1.1.1.1
[Peer]
PublicKey = <SERVER_PUB_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
上服务器/etc/sysctl.conf
我通过使用进行编辑来确保 IP 转发处于活动状态net.ipv4.ip_forward=1
。然后申请sudo sysctl -p
。
上服务器我还确保一些防火墙规则设置如下。 WireGuard 的相关端口/接口为 51820(WG 侦听)、53(DNS 解析)、WireGuard 隧道中涉及的 eth0 和 wg0:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
53 ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
51820/udp (v6) ALLOW Anywhere (v6)
53 (v6) ALLOW Anywhere (v6)
Anywhere on eth0 ALLOW FWD Anywhere on wg0
Anywhere on wg0 ALLOW FWD Anywhere on eth0
Anywhere (v6) on eth0 ALLOW FWD Anywhere (v6) on wg0
Anywhere (v6) on wg0 ALLOW FWD Anywhere (v6) on eth0
这服务器配置文件看起来/etc/wireguard/wg0.conf
像这样:
[Interface]
PrivateKey = <SERVER_PRIV_KEY>
Address = 10.0.1.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
[Peer]
PublicKey = <CLIENT_PUB_KEY>
AllowedIPs = 10.0.1.2/32
我想知道是否iptables
与 发生冲突ufw
。否则我无法弄清楚为什么这个 WireGuard VPN 隧道不应该工作。
答案1
由于您通过 VPN(包括 DNS)路由所有流量,因此您需要指定可以访问的 DNS 服务器。
例如,在您的客户端上添加 DNS 条目:
[Interface]
Address = 10.0.1.2/32
PrivateKey = xxx
DNS = 1.1.1.1
[Peer]
PublicKey = xxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = xxx
如果这不起作用,请发布您的配置(没有密钥)。
答案2
事实证明问题出在其他地方。我正在使用 Ansible 来配置它服务器VM,在配置过程结束时,我必须为 WireGuard 启动 SystemD 服务。
问题在于 被state
设置为started
,而不是restarted
。这意味着当我多次运行 Ansible 脚本以添加更多配置(例如防火墙规则等)时,此 WireGuard 服务从未考虑到新配置...
这是 Ansible 脚本的正确部分,用于始终在 WireGuard 上重新启动 SystemD 服务服务器:
# `systemctl enable wg-quick@wg0`
- name: REStart WireGuard and enable it on boot
systemd:
name: wg-quick@wg0
enabled: yes
state: restarted
此时我怀疑这是必要的:
ufw route allow in on wg0 out on eth0
ufw route allow in on eth0 out on wg0
鉴于iptables
设置已在 WireGuard 的配置文件中就位服务器。但我并没有尝试删除ufw
规则来看看会发生什么。