
Короче говоря, у меня на руках кластерная система, для которой мне нужно направить трафик через ее хозяина. Маршрутизация трафика от узлов во внешний мир работает, но маршрутизация трафика из подсети нашего отдела к узлам не работает. К сожалению, добавить узлы в нашу подсеть не представляется возможным.
Установка
Кластер состоит из главного узла и нескольких узлов, а также некоторой периферии. Узлы находятся во внутренней сети, скрытой от нашей интрасети или интернета. NAT уже установлен на главном узле, поэтому узлы имеют доступ к внутренним и внешним серверам. Эта часть работает.
Внешний интерфейс главного компьютера находится в той же подсети, что и наши рабочие станции, которые используют шлюз вне нашего контроля.
Редактировать: Кластер работает под управлением CentOS 7, ПК работают под управлением дистрибутива Ubuntu на базе Xenial.
Задание
Некоторым нашим программным пакетам нужен прямой доступ к узлам. Для этого мы хотели настроить второй NAT на главном компьютере с помощью iptables и добавить ip-маршрут на ПК для отправки трафика на 10.10.1.0/24 через главный компьютер.
Конфигурация
мастер: ip маршрут
default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.0.1
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.204 metric 100
мастер: iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 7356 packets, 880K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 4884 packets, 687K bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3445 packets, 225K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 3445 packets, 225K bytes)
pkts bytes target prot opt in out source destination
439 33324 MASQUERADE all -- * eth0 10.10.1.0/24 0.0.0.0/0
61828 3710K MASQUERADE all -- * eth1 123.45.67.0/23 10.10.1.0/24
Использование SNAT вместо MASQUERADE не имеет значения.
узел: ip-маршрут
default via 10.10.0.1 dev eth1
10.10.0.0/16 dev eth1 proto kernel scope link src 10.10.1.1
ПК: IP-маршрут
default via 123.45.67.254 dev eth0 proto static metric 100
10.10.0.0/16 via 123.45.67.204 dev eth0
123.45.67.0/23 dev eth0 proto kernel scope link src 123.45.67.191 metric 100
Диагноз на данный момент
- NAT от node01 до интернета/интранета/ПК работает безупречно.
- NAT от pc1 до node01 дает сбой во время TCP-рукопожатия:
- SYN передается через master на node01, помечается как SYN_RECV в tcpdump
- SYN+ACK отправляется от node01 к master
- SYN+ACK появляется в tcpdump на главном устройстве, передается в фильтр
- tcpdump показывает, что SYN+ACK проходит через фильтр
- iptables показывает пакеты SYN+ACK, проходящие через фильтр FORWARD, mangle FORWARD + POSTROUTING
- Пакеты SYN+ACK никогда не проходят через nat POSTROUTING (а должны ли?)
- Пакеты SYN+ACK никогда не приходят на ПК1
- Конечно, рукопожатие не удалось
- ПК1 застрял в состоянии SYN_SENT
- node01 застрял в SYN_RECV
- в конце концов, соединение истекает
- У меня нет возможности отслеживать пакеты на шлюзе.
По моим предположениям, маршрутизатор с отслеживанием состояния на пути теряет пакет SYN+ACK из-за того, что его исходный адрес перезаписывается на главном устройстве, поэтому его связь с исходным пакетом SYN теряется.
Как нам заставить это работать?
Дайте мне знать, если понадобятся дополнительные конфигурации/логи.