我目前有一個以「tap」模式設定的 OpenVPN 網路,其中 Google VM 作為伺服器,Raspberry Pi 3 用戶端運行 Minecraft 伺服器。
使用者目前可以透過在自己的電腦上執行 OpenVPN 用戶端並將 Pi 的 OpenVPN IP 輸入 Minecraft 用戶端(例如 10.8.0.2)來連接到 Minecraft 伺服器。
但是,我希望能夠讓使用者使用 Google VM 的外部 IP 存取 Minecraft 伺服器(無需安裝 OpenVPN)。由於ISP雙層NAT,使用者無法直接使用Pi的位址。
我試過以下這個答案。具體來說我執行了:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565
iptables -A FORWARD -p tcp -d 10.8.0.2 --dport 25565 -j ACCEPT
iptables -A POSTROUTING -t nat -s 10.8.0.2 -o eth0 -j MASQUERADE
VM的介面是eth0和tap0。在控制台中啟用 IP 轉送。
伺服器防火牆設定為允許來自 0.0.0.0/0 TCP:25565 和 UDP:25565 的流量
但是,當嘗試使用 Google VM 的外部 IP 進行連線時,我收到「連線逾時」訊息。 NMAP 告訴我連接埠 25565 已被“過濾”
附加信息,iptables-save
:
# Generated by iptables-save v1.6.0 on Thu Sep 26 11:42:02 2019
*nat
:PREROUTING ACCEPT [106:35257]
:INPUT ACCEPT [75:15902]
:OUTPUT ACCEPT [111:6692]
:POSTROUTING ACCEPT [6:328]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -d 35.197.47.71/32 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -d 35.197.47.71/32 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.3/32 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.2/32 -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Sep 26 11:42:02 2019
# Generated by iptables-save v1.6.0 on Thu Sep 26 11:42:02 2019
*filter
:INPUT ACCEPT [1822:367429]
:FORWARD ACCEPT [13:700]
:OUTPUT ACCEPT [1610:231716]
-A FORWARD -d 10.8.0.2/32 -p tcp -m tcp --dport 25565 -j ACCEPT
COMMIT
# Completed on Thu Sep 26 11:42:02 2019
--list-rules
:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 10.8.0.3/32 -p tcp -m tcp --dport 25565 -j ACCEPT
答案1
我認為問題可能是,您沒有偽裝路由到 pi 的資料包,並且並非來自 pi 的所有流量都被路由到隧道中。
這意味著雖然來自外部世界的資料包可以到達 pi,但當 pi 回應它們時,回應資料包不會首先路由到 Google VM(但可能直接發送到客戶端(如透過其互聯網網關),因此不會被客戶認可)。
此外,如果 pi 有防火牆過濾來自隧道的傳入封包(這樣只接受來自其他 VPN 主機的封包),則未偽裝成來自 VM 的封包將會被過濾。
因此,您可能需要:
iptables -t nat -A POSTROUTING -d 10.8.0.x -o tap0 -j MASQUERADE
答案2
您可以在Google防火牆雲端選單上開啟該連接埠。而且,經過測試,如果它不起作用,我會告訴你另一種選擇。
問候