iptables: как объединить DNAT и SNAT для использования вторичного IP-адреса?

iptables: как объединить DNAT и SNAT для использования вторичного IP-адреса?

Здесь много вопросов о настройках iptables DNAT/SNAT, но я не нашел ни одного, который бы решал мою текущую проблему.
У меня есть службы, привязанные к IP-адресу eth0 (например, 192.168.0.20), и у меня также есть IP-адрес на eth0:0 (192.168.0.40), который используется совместно с другим сервером. Активен только один сервер, поэтому этот интерфейс псевдонима появляется и исчезает в зависимости от того, какой сервер активен. Чтобы трафик принимался службой, используется правило DNAT для изменения IP-адреса назначения.

iptables -t nat -A PREROUTING -d 192.168.0.40 -p udp --dport 7100 -j DNAT --to-destination 192.168.0.20

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

iptables -t nat -A POSTROUTING -p udp --sport 7100 -j SNAT --to-source 192.168.0.40

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

[root]# conntrack -L -p udp
udp      17 170 src=192.168.0.185 dst=192.168.0.40 sport=7100 dport=7100 src=192.168.0.20 dst=192.168.0.185 sport=7100 dport=7100 [ASSURED] mark=0 secmark=0 use=2

это означает, что цепочка POSTROUTING не запускается, а исходящий трафик уходит с реальным IP-адресом в качестве источника.

Я думаю, что могу настроить правило NOTRACK в таблице raw, чтобы предотвратить отслеживание соединений для этого номера порта, но есть ли лучший или более эффективный способ заставить это работать?

Редактировать - Альтернативный вопрос: есть ли способ (в CentOS/Linux) иметь интерфейс, к которому можно привязаться, но не использовать, чтобы его можно было подключить к сети или отсоединить при обмене общим IP-адресом между серверами?

решение1

Я нашел решение своей проблемы.
Используя параметр ядраnet.ipv4.ip_nonlocal_bind=1, я могу заставить свою службу привязываться к адресам, которые еще не существуют.
Когда интерфейс eth0:0 поднят, трафик принимается службой. ARP и т. д. обрабатывается ucarp/networking. При таком подходе правила DNAT/SNAT вообще не нужны.

решение2

Я могу предложить два варианта, вы можете выбрать один из них или свой собственный.

Вы можете настроить свой сервис на прослушивание wildcard-адреса и, таким образом, полностью обойти правило DNAT. Правило SNAT будет затем применено к исходящим пакетам.

Или, в зависимости от того, какое решение высокой доступности вы используете, вы можете настроить его так, чтобы ваша служба прослушивала плавающий IP-адрес (192.168.0.40) по мере его миграции.

Не очень по теме, но такого рода неприятности не существует вOpenBSD КАРП. С CARP у вас есть виртуальный IP, настроенный на всех узлах, но активный только на одном. Это, конечно, означает, что вы можете заставить свою службу прослушивать виртуальный IP на всех узлах.

Это не очень красиво, но вы можете настроить виртуальный IP на всех узлах (и даже поднять его) и использовать arptablesдля отключения ответов или объявлений ARP для этого IP. Затем вы можете заставить ucarp включить или отключить правило ARP, когда узел становится главным или подчиненным.

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