Рейтинг:1

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

флаг ru

У меня был сервер 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)

##### ВПС
23 апреля 20:52:02 vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<мой 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

#### Локальный сервер
<не удалось найти какие-либо соответствующие журналы, выбирающие /var/log/kern.log для NAT1, и вообще не было журналов для tun0>

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

# НАЧАТЬ ПРАВИЛА OPENVPN
# Правила таблицы NAT
*натуральный
: ПРЕДВАРИТЕЛЬНАЯ ПРОВОДКА ПРИНЯТА [0:0]
:ОТПРАВКА ПРИНЯТИЯ [0:0]
# Разрешить трафик от клиента OpenVPN к eth0
-A POSTOUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# ЗАВЕРШИТЬ ПРАВИЛА OPENVPN

-A PREROUTING -i eth0 -d <внешний IP-адрес vps> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <внешний IP-адрес vps> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A РАЗМЕЩЕНИЕ -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j МАСКАРАД
СОВЕРШИТЬ

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

*натуральный
: ПРЕДВАРИТЕЛЬНАЯ ПРОВОДКА ПРИНЯТА [0:0]
:ОТПРАВКА ПРИНЯТИЯ [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --назначение 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --назначение 192.168.1.185:25565
# настроить маршрутизацию
-A POSTOUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j МАСКАРАД
СОВЕРШИТЬ

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

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

TCP-дамп VPS:

# эт 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: флаги [S], seq 1483515507, win 64240, параметры [mss 1460,nop,nop,sackOK], длина 0
# тун0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: флаги [S], seq 1483515507, win 64240, параметры [mss 1460,nop,nop,sackOK], длина 0

TCPdump локального сервера:

#tun0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: флаги [S], seq 1483515507, win 64240, параметры [mss 1356,nop,nop,sackOK], длина 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], длина 0

Рейтинг:0
флаг ru

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

VPS /etc/ufw/before.rules (s и d поменяны местами):
-A РАЗМЕЩЕНИЕ -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j МАСКАРАД -t физ.

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.