У меня есть странный вариант использования, когда модуль, работающий в 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.
Есть ли другое решение, кроме маркировки пакетов? Или чего-то еще не хватает в маркировке пакетов?