Networking

Wireguard 無法在僅限 Android 的 4G 網路上完成握手

  • August 20, 2021

我的家庭網路上有一個 Wireguard 伺服器,它可以在我的所有設備上正常工作,包括連接到 Wi-Fi 的手機。當我斷開 Wi-Fi 並繼續使用 4G 時,問題就出現了,現在我的手機無法完成與伺服器的握手。

在我的路由器上,我將 UDP 埠 51820 轉發到我的 Wireguard 伺服器。在我的手機上,我使用 DNS 名稱 (vpn.mydomain.tld:51820) 連接到 VPN

我已經為 Wireguard 啟用了核心日誌記錄來幫助我解決這個問題,但遺憾的是我無法找到我的設置有什麼問題。

以下是我嘗試從手機連接時出現的伺服器日誌(通過 4G)

Mar 23 17:49:36 wireguard kernel: [448095.663902] wireguard: wg0: Keypair 9893 created for peer 16
Mar 23 17:49:45 wireguard kernel: [448104.009541] wireguard: wg0: Receiving handshake initiation from peer 16 (xxx.xxx.xxx.xxx:40061)
Mar 23 17:49:45 wireguard kernel: [448104.009546] wireguard: wg0: Sending handshake response to peer 16 (xxx.xxx.xxx.xxx:40061)
Mar 23 17:49:45 wireguard kernel: [448104.010284] wireguard: wg0: Keypair 9893 destroyed for peer 16
Mar 23 17:49:45 wireguard kernel: [448104.010286] wireguard: wg0: Keypair 9894 created for peer 16
Mar 23 17:49:50 wireguard kernel: [448109.069901] wireguard: wg0: Receiving handshake initiation from peer 16 (xxx.xxx.xxx.xxx:40061)
Mar 23 17:49:50 wireguard kernel: [448109.069903] wireguard: wg0: Sending handshake response to peer 16 (xxx.xxx.xxx.xxx:40061)
Mar 23 17:49:50 wireguard kernel: [448109.070073] wireguard: wg0: Keypair 9894 destroyed for peer 16

在我的手機上,我看到以下內容:

peer(...) - Sending handshake initiation
peer(...) - Handshake did not complete after 5 seconds, retrying (try 2)
peer(...) - Sending handshake initiation
peer(...) - Handshake did not complete after 5 seconds, retrying (try 2)
peer(...) - Sending handshake initiation

因為當我連接到我的家庭 Wi-Fi 時它工作正常,所以我不知道要尋找什麼其他埠轉發,但據我所知,它工作正常。

這是我伺服器上的 wg0.conf:

[Interface]
Address = 10.10.10.3/32
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT;  iptables -t nat -A POSTROUTING -d 10.10.10.0/24 -o eth0 -j MASQUERADE; iptables -t nat -A POSTROUTING ! -d 10.10.10.0/24 -o pia -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -d 10.10.10.0/24 -o eth0 -j MASQUERADE; iptables -t nat -D POSTROUTING ! -d 10.10.10.0/24 -o pia -j MASQUERADE
ListenPort = 51820
PrivateKey = [removed]

[Peer]
PublicKey = [removed]
AllowedIPs = 10.10.10.245/32
Endpoint = 10.10.10.147:60743

以及我手機上的連接文件(執行 Android 11):

[Interface]
Address = 10.10.10.245/24
DNS = 10.10.10.2
PrivateKey = [removed]

[Peer]
AllowedIPs = 0.0.0.0/0
Endpoint = vpn.mydomain.tld:51820
PersistentKeepalive = 25
PublicKey = [removed]

我已確保密鑰匹配,但由於連接到我的 Wi-Fi 時連接工作正常,我不認為配置文件是罪魁禍首。

我在伺服器上安裝了 UFW,配置如下:

To                         Action      From
--                         ------      ----
51820/udp                  ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
10050                      ALLOW       Anywhere
51820/udp (v6)             ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)
10050 (v6)                 ALLOW       Anywhere (v6)

但是我禁用了它以確保它沒有乾擾,並且它沒有改變任何東西。在這一點上,我不知道出了什麼問題,也不知道要搜尋什麼來幫助我解決這個問題,所以歡迎任何幫助

**編輯:**我有點弄清楚問題出在哪裡。我的 wg0.conf,我的 PostUp 中有以下部分:iptables -t nat -A POSTROUTING ! -d 10.10.10.0/24 -o pia -j MASQUERADE 這條線旨在通過另一個隧道路由所有傳出流量,但是,它也具有使我的 WireGuard 伺服器通過另一個 IP 響應我的外部客戶端的副作用(即我正在從 4G 上的手機連接到 xxx.xxx。 xxx.xxx,並且由於該行,它通過 yyy.yyy.yyy.yyy 響應連接請求),這就是我的客戶端無法連接的原因。當我刪除此路由規則時,我可以從我的網路外部正常連接,但現在當然,我的流量不會通過我的第二個隧道重新路由。有沒有辦法我可以保留這條規則,或者至少一條類似的規則可以通過另一個 VPN 路由外部流量,同時通過我的 eth0 設備響應我的手機的連接請求?由於我的手機將從 4G 連接,我不能指望它將連接的 IP 地址,sp 我可以'

MASQUERADE/POSTROUTING規則不會改變某些流量的去向。路線可以。問題是您有一條預設路由(或等效路由)將流量引導至pia隧道。

您需要使用策略路由來處理來自wireguard 伺服器的回复流量:

# ip r add 192.168.1.1 dev eth0 table 123
# ip r add default via 192.168.1.1 table 123
# ip rule add iif lo ipproto udp sport 51820 lookup 123

第一個命令可以是可選的。確保將192.168.1.1和替換eth0為路由器的 LAN IP 和相應的乙太網 NIC 的介面名稱。(您可以從 的輸出中複製它們ip r,即主表中的路由。)數量123是任意的。iif lo將規則限制為源埠為51820來自主機本身的 UDP 流量(但不是來自其他主機的此類流量)。

引用自:https://serverfault.com/questions/1058060