连接到 VPN WireGuard 服务器时,客户端 (Ubuntu 20.04) 无法解析互联网页面

连接到 VPN WireGuard 服务器时,客户端 (Ubuntu 20.04) 无法解析互联网页面

我已经设置了 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.1DNS = 8.8.8.8DNS = 127.0.0.53(最后一个来自/etc/resolv.conf),但效果是相同的:

  1. 我的网络浏览器无法访问网页
  2. curl类似或ping无法解析域的命令

在 VPN 客户端中,这些是版本:

  • apt-cache show wireguard:版本:1.0.20200513-1~20.04.2
  • lsb_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规则来看看会发生什么。

相关内容