Рейтинг:0

Используйте fwmark в iptables для контейнера, работающего в Azure K8S.

флаг gl

У меня есть странный вариант использования, когда модуль, работающий в Azure Kubernetes, должен направлять трафик с определенных портов на определенные цели через выделенный туннель VPN. Но эти цели являются частными IP-адресами и поэтому могут иметь один и тот же IP-адрес для разных целей. Под, помимо маршрутизации, также является сервером OpenVPN, к которому подключаются цели. Пример:

Сообщения, поступающие на порт 10, направляются на IP 10.0.0.4:80 через VPN IP 10.118.0.2.

и в то же время мы можем иметь:

Сообщения, поступающие на порт 20, направляются на IP 10.0.0.4:80 через VPN IP 10.118.0.3.

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

/sbin/iptables --table mangle --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump MARK --set-mark "10"
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
Правило /sbin/ip добавляет приоритет "10" из всех fwmark "10" поиск "10"
/sbin/ip маршрут добавить "10.0.0.4" через "10.118.0.2" таблица 10

Это позволило бы обеим коммуникациям работать одновременно с маршрутизацией трафика на правильный компьютер. Но я вижу, что пакеты помечены в таблице mangle. Но тогда никогда не добраться до таблиц NAT. Я узнал, что это связано с файлом rt_filter. Подробнее об этом ниже. На данный момент, и это работает, вот так:

/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip маршрут добавить "10.0.0.4" через "10.118.0.2"

Однако, если установлен второй маршрут, как в первом примере, команда будет выглядеть так:

/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "20" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip маршрут добавить "10.0.0.4" через "10.118.0.3"

Это создаст другой маршрут в основной таблице маршрутов для той же цели. Но тогда пользователь при доступе к 192.168.0.100 может быть перенаправлен либо на машину, подключенную к 10.118.0.3, либо к 10.118.0.2.

Помимо этого правила, для всех из них всегда было включено это, чтобы разрешить трафику возвращаться на интерфейс tap0, где идет связь с 10.118.0.X:

iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE

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

Я видел в других темах, что для того, чтобы пометить входящие пакеты в контейнере/поде, мне нужно отключить rt_filter. Однако я не могу этого сделать, он говорит, что это файловая система только для чтения, и я не знаю, возможно ли вообще изменить это в кластерах Azure Kubernetes.

Есть ли другое решение, кроме маркировки пакетов? Или чего-то еще не хватает в маркировке пакетов?

neomax avatar
флаг gl
Просто хотел добавить, что с первым набором правил/решений я вижу, что трафик с tcpdump на интерфейсе tap0 идет с 10.118.0.1 на 10.0.0.4, но не идет к машине, которая вызывает 192.168.0.100:10. он просто не получает никакого ответа.
Рейтинг:1
флаг gl

Итак, я наконец добрался до решения. Проблема заключалась в искажении пакетов в PREROUTING. Коверкая пакеты в POSTROUTING (то есть на выходе из eth0), они затем смогли вернуться из tap0 в eth0, а затем к клиенту. Конечный результат выглядит так:

/sbin/iptables --table mangle --insert POSTROUTING --destination "192.168.0.100" -o eth0 -p tcp --dport "10" --jump MARK --set-mark "10"
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
Правило /sbin/ip добавляет приоритет "10" из всех fwmark "10" поиск "10"
/sbin/ip маршрут добавить "10.0.0.4" через "10.118.0.2" таблица 10

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

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