Рейтинг:1

Переадресация IP с помощью IPTables для режима lvs nat

флаг vn

Я изучаю балансировщики нагрузки L3 и сейчас работаю над режимом keepalived NAT. Поток пакетов должен быть клиентом ------> L3 (lvs DNAT) ------> реальные серверы, а обратный поток должен быть точным. напротив потока запроса. Но lvs DNAT изменяет только целевой NAT, это означает, что изменяется только IP-адрес назначения пакета, т.е.) [источник = IP-адрес клиента, пункт назначения = IP-адрес реального сервера]. перенаправляет его на шлюз по умолчанию вместо сервера L3, и пакет сбрасывается. Я не хочу устанавливать сервер L3 в качестве шлюза по умолчанию для реального сервера, вместо этого мне нужно решение, связанное с таблицей IP, для перенаправления трафика с реального сервера на L3 сервер, если речь идет о портах 8443 и 8080.

Таблицы IP обеспечивают способ пересылки трафика перед обработкой пакета через PREROUTING, но я хочу перенаправить трафик на L3 после того, как сервер обработает запрос. Я пробовал с цепочкой OUTPUT, но безуспешно. sudo iptables -t nat -A OUTPUT -p tcp --match multiport --sports 8443,8080 -j DNAT --to 172.24.248.201

172.24.248.201 это ip сервера L3.

Заранее спасибо

Рейтинг:1
флаг cl
A.B

Это маршрутизация проблема. iptables не маршрутизирует, но на маршрутизацию могут влиять адреса, которые он может изменить, и вот почему iptables часто ошибочно предполагается, что он выполняет маршрутизацию. Из-за этого iptables не может быть в решение проблемы (но иногда может быть частью такого решения).

Более того, любая попытка изменить Ответить пакет, использующий NAT Netfilter/iptables, игнорируется: нат table срабатывает только для первого пакета потока: не для ответа: iptables -t nat -A OUTPUT -p tcp --match multiport --sports 8443,8080 -j DNAT --to 172.24.248.201 никогда не совпадет. И если бы можно было сделать так, чтобы это совпадало, это не сработало бы, потому что получателем ответа должен быть источник исходного запроса, видимый реальным сервером: фактический IP-адрес удаленного клиента, а не LB L3.

Ниже приведен простой способ сделать это правильно на реальном сервере: политика маршрутизации.


В этой конкретной проблеме и ответе я предполагаю Ядро Linux >= 4.17 для «Расширяет поддержку соответствия правил fib, чтобы включить соответствие спорту, dport и ip proto», что позволяет избежать сложного использования iptables для маркировки пакетов (но в любом случае потребуется политика маршрутизации).

Необходимо убедиться, что выделенные порты реального сервера не могут перекрывать динамический диапазон портов реального сервера (используется, когда сервер является клиентом, например, для запросов DNS или обновления системы):

# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999

Убедитесь, что нижний порт выше самого высокого порта реального сервера, используемого для службы. Здесь: 32768 > 8443 достаточно.

Добавьте таблицу маршрутизации для определенного трафика, предназначенного для использования L3 LB в качестве шлюза. Таблица 248201 — это произвольно выбранное значение. Я предполагаю, что интерфейс реального сервера называется eth0, пожалуйста, адаптируйте:

ip route добавить по умолчанию через 172.24.248.201 dev eth0 таблица 248201

Добавьте селекторы: по одному на диапазон портов. Это может быть один широкий диапазон (пока нет взаимодействия с динамическими портами, это не имеет значения) или X правил для X отдельных портов. Для одного диапазона:

ip правило добавить iif lo ipproto tcp sport 8000-8443 поиск 248201

куда если ло представляет собой специальный синтаксис для локально инициируемого исходящего трафика и на самом деле не относится к вот интерфейс.

Теперь весь предполагаемый обратный трафик будет маршрутизироваться с использованием L3 LB в качестве шлюза. Любой другой трафик будет использовать обычный шлюз по умолчанию, если это необходимо.


я не думаю СРФ должно быть проблемой, если включено, если обычный шлюз сервера по умолчанию не использует другой интерфейс. Если бы это было проблемой, это могло бы быть установить свободный режим вместо.

Делать только в том случае, если без него не получится (да и то, eth0 может быть достаточно вместо все ниже):

sysctl -w net.ipv4.conf.all.rp_filter=2
chellathurai avatar
флаг vn
это означает, что мы не можем установить исходный IP-адрес на произвольный IP-адрес, верно? Не могли бы вы вкратце объяснить фразу? _Собственный IPv4-адрес L3 LB не отображается в ожидаемом потоке ответов,_
A.B avatar
флаг cl
A.B
Вот пример. Если удаленный клиент с адресом 192.0.2.2 подключается к 172.24.248.201:443, который перенаправляет через NAT на (например, у меня нет информации) реальный сервер с адресом и портом 172.24.248.202:8443, то этот реальный сервер может не отправлять трафик обратно на 172.24.248.201 : он должен быть отправлен обратно на 192.0.2.2 : адрес 172.24.248.201 нигде не появляется. В то же время я вижу, что часть моего описания была неверной. правило DNAT никогда не будет совпадать, потому что в ответе OUTPUT поток не находится в состоянии NEW. Мне придется отредактировать начало моего ответа. Решение не меняется.
A.B avatar
флаг cl
A.B
ответ изменен (само решение не меняется).
chellathurai avatar
флаг vn
Политика маршрутизации решает проблему.
chellathurai avatar
флаг vn
**NAT игнорируется** Кажется, что цепочка OUTPUT работает. Я подтверждаю это, используя LOG, но NAT, выполненный в OUTPUT, кажется, не дает эффекта.
A.B avatar
флаг cl
A.B
Мой ответ не использует NAT. Мой ответ не использует iptables. Мой ответ основан на двух командах: одна начинается с «ip route», другая начинается с «ip rule». Где эти действия сделаны?
chellathurai avatar
флаг vn
Я попробовал цепочку NAT OUPUT, прежде чем публиковать здесь, вот что я упомянул. Не могли бы вы предоставить мне такое же решение для freebsd с использованием ipfw?
A.B avatar
флаг cl
A.B
Нет, я не разбираюсь в FreeBSD. Вопрос был помечен *iptables*, что подразумевало Linux (и попытка iptables также была предпринята для Linux)

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

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