Правильная настройка iptables для двух уровней переадресации портов: внешний сервер, подключенный к локальному серверу через VPN

Правильная настройка iptables для двух уровней переадресации портов: внешний сервер, подключенный к локальному серверу через VPN

У меня был сервер minecraft, работающий на VPS (Debian 10), но VPS был слишком слаб, чтобы справиться с ним, поэтому я хотел использовать более мощный локальный сервер для его запуска (Ubuntu 22.04). VPS размещает сервер OpenVPN, и локальный сервер подключается как единственный клиент. VPS находится на 10.8.0.1, а локальный сервер — на 10.8.0.6 (192.168.1.185 в локальной сети).

Я использовал правила iptables для пересылки пакетов VPN tun0 на 10.8.0.6:25565 на IP локального сервера. Это работает нормально: я могу запросить сервер Minecraft с VPS. Затем я настроил тот же набор правил (конечно, поменяв соответствующие IP-адреса) на VPS для пересылки соединений с vps_external_ip:25565 на 10.8.0.6:25565. Это правило пересылает пакеты на весь путь до локального сервера, но соединение всегда прерывается по тайм-ауту. Странно то, что ни рабочие соединения с VPS -> локальный сервер, ни внешние -> VPS -> локальный сервер не увеличивают счетчики пакетов для любых правил POSTROUTING MASQUERADE, но они увеличивают для правил PREROUTING. Там соединения TCP/UDP просто прерываются по тайм-ауту при обращении к VPS на eth0:25565, ошибок отказа в соединении нет.

Переадресация IPV4 включена на обеих машинах, и я пробовал отключить UFW, но безуспешно.

Я настроил правило ведения журнала на NAT POSTROUTE обоих серверов, но не совсем понимаю, как исправить эту проблему, поскольку не смог ничего найти.

Вывод журнала POSTROUTE (iptables -t nat -I POSTROUTING -j LOG --log-prefix "NAT:" --log-level 7)

##### VPS
Apr 23 20:52:02 vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<my ip> DST=10.8.0.6 LEN=48 TOS=0x08 PREC=0x20 TTL=114 ID=21284 DF PROTO=TCP SPT=1806 DPT=25565 WINDOW=64240 RES=0x00 SYN URGP=0

#### Local server
<could not find any relevant logs grepping /var/log/kern.log for NAT1 and there were no logs at all for tun0>

Я использовал /etc/ufw/before.rules для каждого сервера, чтобы настроить правила iptables.
VPS /etc/ufw/before.rules:

# START OPENVPN RULES
# NAT table rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# END OPENVPN RULES

-A PREROUTING -i eth0 -d <vps external IP> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <vps external IP> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A POSTROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j MASQUERADE
COMMIT

Локальный сервер /etc/ufw/before.rules:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
# setup routing
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
COMMIT

Правила PREROUTING работают, но счетчики правил POSTROUTING не увеличиваются.

Я запустил tcpdump на 25565 для отладки. Я вижу, что пакеты приходят, но не вижу возврата на интерфейсах при внешнем подключении. При прямом запросе с VPS я вижу, что локальный сервер отвечает на tun0. Похоже, проблема в том, что локальный сервер пытается ответить напрямую на мой IP на en01 вместо VPS на tun0, но я не уверен, как это исправить.

VPS-tcpdump:

# eth 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0
# tun0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0

Локальный сервер tcpdump:

#tun0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1356,nop,nop,sackOK], length 0

#en01
21:43:39.972618 IP 10.8.0.6.25565 > my_ip.2729: Flags [S.], seq 2141764446, ack 1483515508, win 64240, options [mss 1460,nop,nop,sackOK], length 0

решение1

Наконец-то разобрался. Большинство руководств по переадресации портов в сети содержали правило POSTROUTING, которое не работает для OpenVPN (или для моей ситуации). Вместо того, чтобы разрешить локальные IP-адреса в качестве источника с пунктом назначения, который не был локальным IP-адресом, мне пришлось сделать правило postrouting для всего, кроме локального IP-адреса, чтобы оно было переписано как tun0 VPS IP.

VPS /etc/ufw/before.rules (поменяны местами s и d):
-A POSTROUTING -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j MASQUERADE -t nat

Кроме того, правило POSTROUTING требовалось только на VPS.

Связанный контент