Dns

客戶端 (Ubuntu 20.04) 在連接到 VPN WireGuard 伺服器時無法解析網際網路頁面

  • April 10, 2021

我已經設置了 WireGuard VPN,但是在使用以下命令成功連接後,瀏覽器沒有從 Internet 載入網頁:

wg-quick up `pwd`/myifwg0.conf

我檢查了Server 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

我注意到當連接到伺服器 WireGuard VPN 時,這些命令永遠掛起:

curl google.com
ping google.com

這可能與 DNS 問題有關,因為我能夠nslookup google.com並且如果我在連接到 VPN 時將解析的 IP 從 Web 瀏覽器複製/粘貼nslookup到 Web 瀏覽器中,那麼我就可以訪問google.com首頁。

我嘗試在 VPN 客戶端配置文件中強制使用 DNS IP,例如DNS = 1.1.1.1orDNS = 8.8.8.8DNS = 127.0.0.53(最後一個來自/etc/resolv.conf),但效果是一樣的:

  1. 我的網路瀏覽器無法訪問網頁
  2. 命令喜歡curlping不能解析域

在 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 解析)、eth0 和 wg0 參與 WireGuard 隧道:

$ 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

我想知道是否iptablesufw. 否則我無法弄清楚為什麼這個 WireGuard VPN 隧道不應該工作。

原來問題出在其他地方。我正在使用 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

由於您要通過 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

如果這不起作用發布您的配置(沒有密鑰)。

引用自:https://unix.stackexchange.com/questions/643726