Iptables
iptables 將來自 openvpn 隧道的流量轉發到 lan
下面是網路拓撲:
------------------------ 123.45.67.89 (WAN) ---------------------- | pfSense |-------------------------| Public client | ------------------------ ---------------------- | 10.1.1.1 (tun) | | | 10.1.1.2 (tun) ----------------------- 192.168.0.2 (LAN) 192.168.0.3 (LAN)---------------- | RPi | -------------------------------------| VNC Server | ----------------------- ----------------
設想:
- 公共客戶端在 WAN ip 和埠 5900 上訪問 pfSense
- 流量由 pfSense 轉發到 OpenVPN ip 10.1.1.2:5900 (RPi)
- RPi 執行 SNAT 和 DNAT 並轉發到 192.168.0.3:5900(VNC 伺服器)
- VNC Server響應Source IP,即192.168.0.2
- 問題: RPi 不會將響應轉發到 pfSense,除非我將其設置為所有流量都通過 tun(使用路由)。但是,我只希望來自 VNC 伺服器的與 VNC 流量相關的響應通過 tun 介面。
以下是 RPi 上的 iptables 設置
pi@raspberrypi:~ $ sudo iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere anywhere tcp dpts:5900:5905 to:192.168.0.3:5900-5905 Chain INPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT tcp -- anywhere anywhere tcp dpts:5900:5905 to:192.168.0.2 Chain OUTPUT (policy ACCEPT) target prot opt source destination
我雖然將 ip 10.1.1.2 放在 SNAT 中,但由於 VNC 伺服器不知道如何路由這個子網,我最終得到了非對稱路由。
下面是不工作的路由表:
pi@raspberrypi:~ $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default speedport-entry 0.0.0.0 UG 202 0 0 eth0 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
下面是工作路由表(所有流量都通過 tun):
pi@raspberrypi:~ $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.1.1.1 128.0.0.0 UG 0 0 0 tun0 default speedport-entry 0.0.0.0 UG 202 0 0 eth0 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 static.89.67.45 speedport-entry 255.255.255.255 UGH 0 0 0 eth0 128.0.0.0 10.1.1.1 128.0.0.0 UG 0 0 0 tun0 192.168.0.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
問題: 如何將來自 VNC 伺服器的 192.168.0.2 流量轉發到 tun ?
謝謝
在 RPi 上使用
tcpdump
時,我設法更好地理解了問題並解決了它。我在這里為可能面臨同樣問題的任何人發布解決方案。解決方案 為了達到我想要的效果,我必須在 pfSense 上執行 SNAT,以處理從 OpenVPN 介面流出的用於 VNC 的埠的流量。
解釋 我意識到使用
tcpdump
,到 VNC 伺服器的數據包的源地址是公共客戶端的 IP 地址(網際網路 IP 地址)。因此,當 RPi 收到來自 VNC 伺服器的響應時,它正在嘗試將流量路由到公共客戶端的IP 地址(網際網路 IP 地址)。到這個公共 IP 的路由是通過 LAN 網關(即不通過隧道)。通過在 pfSense 上執行 SNAT 並將公共客戶端的 IP 地址(在源中)替換為 pfSense VPN 地址,RPi 現在知道將響應發送到哪裡(通過隧道發送到 pfSense)。
希望能幫助到你。