Wireguard 無法在僅限 Android 的 4G 網路上完成握手
我的家庭網路上有一個 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 流量(但不是來自其他主機的此類流量)。