Двунаправленный NAT с iptables

Двунаправленный NAT с iptables

Короче говоря, у меня на руках кластерная система, для которой мне нужно направить трафик через ее хозяина. Маршрутизация трафика от узлов во внешний мир работает, но маршрутизация трафика из подсети нашего отдела к узлам не работает. К сожалению, добавить узлы в нашу подсеть не представляется возможным.

Установка

настройка кластера, без простых переключателей для простоты

Кластер состоит из главного узла и нескольких узлов, а также некоторой периферии. Узлы находятся во внутренней сети, скрытой от нашей интрасети или интернета. 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 теряется.

Как нам заставить это работать?

Дайте мне знать, если понадобятся дополнительные конфигурации/логи.

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