Назад | Перейти на главную страницу

iptables перенаправляет трафик из туннеля openvpn в локальную сеть

Ниже представлена ​​топология сети:

------------------------ 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. Публичный клиент обращается к pfSense по IP-адресу WAN и порту 5900
  2. Трафик направляется pfSense на OpenVPN ip 10.1.1.2:5900 (RPi)
  3. RPi выполняет SNAT и DNAT и перенаправляет на 192.168.0.3:5900 (VNC Server)
  4. VNC Server отвечает на исходный IP-адрес, то есть 192.168.0.2
  5. ПРОБЛЕМА: Ответ не пересылается в pfSense через RPi, если я не настроил его так, чтобы весь трафик проходил через tun (с использованием маршрутов). Однако я бы хотел, чтобы через интерфейс tun проходили только ответы от VNC Server, связанные с трафиком VNC.

Ниже приведена настройка iptables на RPi.

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 Server не знает, как маршрутизировать эту подсеть, я получил асимметричную маршрутизацию.

Ниже не работает таблица маршрутизации:

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

Ниже работает таблица маршрутизации (весь трафик проходит через тун):

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

Вопрос: Как перенаправить трафик, поступающий на 192.168.0.2 с сервера VNC, на tun?

Спасибо

С помощью tcpdump на RPi мне удалось лучше разобраться в проблеме и решить ее. Я публикую здесь решение для всех, кто может столкнуться с той же проблемой.

Решение Чтобы добиться того, чего я хотел, мне пришлось выполнить SNAT на pfSense для трафика, выходящего из интерфейса OpenVPN для портов, используемых для VNC.

Объяснение Я понял, используя tcpdump, что исходный адрес пакетов, идущих на VNC Server, был IP-адресом Публичный клиент (IP-адрес в Интернете). Поэтому, когда RPi получил ответ от сервера VNC, он пытался направить трафик на Публичный клиент IP-адрес (IP-адрес в Интернете). Маршрут к этому общедоступному IP-адресу проходил через шлюз LAN (т.е. не через туннель).

Выполнив SNAT на pfSense и заменив IP-адрес общедоступного клиента (в источнике) на адрес VPN pfSense, RPi теперь знает, куда отправлять ответы (в pfSense через туннель).

Надеюсь, поможет.