Iptables - Маршрутизация происходит перед цепью OUTPUT, когда она включает петлевой трафик

Я внедряю службу высокой доступности (HA) с поддержкой активности (VRRP). Предполагается, что этот HA работает только для приложения, работающего на порте 443, поэтому мы не отказываем по всему серверу, вместо этого, только приложение должно переключаться при сбое.

Чтобы это работало, мне нужно заставить все серверы в подсети отправлять данные на виртуальный IP-адрес (VIP) вместо реального IP-адреса сервера, когда запрашиваемый порт равен 443. Для этого примера представьте следующее:

Основной сервер - частный IP: 10.101.151.59
Вторичный сервер - частный IP: 10.101.151.9
Действительный IP-адрес действителен для обоих серверов: 10.101.251.120

Чтобы принудительно установить связь с VIP, когда трафик идет на порт 443, я использовал следующее правило для каждого из серверов в подсети:

iptables -t nat -A OUTPUT -p tcp -d 10.101.151.59 --dport 443 -j DNAT --to-destination 10.101.251.120:443;

Это правило прекрасно работает, когда VIP не принадлежит серверу, инициирующему запрос. Однако представьте себе ситуацию, когда правило не работает:

1) Сбой приложения на основном сервере.
2) происходит аварийное переключение, и вторичный сервер начинает получать / обрабатывать запросы, и он будет владеть VIP.

Если это приложение, запущенное на вторичном сервере, попытается установить связь с самим собой, оно вызовет запрос к реальному IP-адресу первичного сервера, поскольку этот IP-адрес собирается автоматически посредством разрешения имен.

Теоретически, я ожидаю, что этот трафик будет соответствовать правилу iptables, определенному выше.
Однако, если VIP принадлежит самому вторичному серверу, Iptables должен будет преобразовать реальный IP-адрес в один из локальных IP-адресов сервера, что может привести к возникновению обратной связи. Проблема в том, что он просто не работает.

На практике трафик действительно направляется на основной сервер, и кажется, что это правило никогда не активируется. Поскольку основной сервер не работает, я просто получаю отказ в соединении.

Поэтому возникает вопрос: почему я не вижу эффекта этого правила, когда целевой VIP принадлежит тому же серверу, который инициировал запрос? Это потому, что в этом общении могут участвовать петли? будет ли это иметь значение, если задействуется петля?

Я знаю, что весь трафик, инициированный FW HOST, будет пересекать цепочку OUTBOUND, поэтому не уверен, почему этого не происходит, по-видимому, сначала происходит маршрутизация. Я прочитал, что ядро ​​может блокировать перенаправление локального трафика, поэтому я попробовал следующее:

sysctl -w net.ipv4.conf.all.route_localnet=1

Но этого было недостаточно. Я что-то пропустил?

Я использую Red Hat Enterprise Linux Server версии 6.6 (Сантьяго).

Благодарю. Если вопрос не ясен, дайте мне знать.

0 ответов

Другие вопросы по тегам