iptables 将来自 openvpn 隧道的流量转发到 lan

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

设想:

  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 响应源 IP,即 192.168.0.2
  5. 问题:除非我设置所有流量都通过 tun(使用路由),否则 RPi 不会将响应转发到 pfSense。但是,我希望只有与 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 ?

谢谢

答案1

使用tcpdumpRPi,我设法更好地理解了这个问题并解决了它。我在这里发布了解决方案,供任何可能遇到同样问题的人使用。

解决方案 为了实现我的目标,我必须在 pfSense 上对从 VNC 使用的端口的 OpenVPN 接口传出的流量执行 SNAT。

解释 我意识到使用tcpdump,到 VNC 服务器的数据包的源地址是公共客户端(互联网 IP 地址)。因此,当 RPi 收到来自 VNC 服务器的响应时,它正在尝试将流量路由到公共客户IP 地址(互联网 IP 地址)。到此公共 IP 的路由是通过 LAN 网关(即,不是通过隧道)。

通过在 pfSense 上执行 SNAT 并将公共客户端的 IP 地址(在源中)替换为 pfSense VPN 地址,RPi 现在知道将响应发送到哪里(通过隧道发送到 pfSense)。

希望能帮助到你。

相关内容