Iptables

iptables 將來自 openvpn 隧道的流量轉發到 lan

  • March 5, 2020

下面是網路拓撲:

------------------------ 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  | 
-----------------------                                      ----------------

設想:

  1. 公共客戶端在 WAN ip 和埠 5900 上訪問 pfSense
  2. 流量由 pfSense 轉發到 OpenVPN ip 10.1.1.2:5900 (RPi)
  3. RPi 執行 SNAT 和 DNAT 並轉發到 192.168.0.3:5900(VNC 伺服器)
  4. VNC Server響應Source IP,即192.168.0.2
  5. 問題: 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)。

希望能幫助到你。

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