Ниже представлена топология сети:
------------------------ 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 |
----------------------- ----------------
Сценарий:
Ниже приведена настройка 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 через туннель).
Надеюсь, поможет.