У меня есть два интерфейса, скажем eth0
и eth0.4000
как влан.
У обоих есть шлюз по умолчанию.
Все работает так, как ожидалось, когда процесс напрямую слушает интерфейс.
Но не для hostPort
привязки Kubernetes.
vlan.gw-mac > eth0-mac, ethertype 802.1Q (0x8100), длина 78: vlan 4000, p 0, ethertype IPv4 (0x0800), clientIP.38712 > vlanIP.80: Flags [S]
eth0-mac > eth0.gw-mac, ethertype IPv4 (0x0800), длина 74: vlanIP.80 > clientIP.38712: Флаги [S.]
SYN происходит от vlan.шлюз
, перенаправляется в Контейнер, но ответ SYN-ACK покидает стек через eth0.gw
и не правильный vlan.gw
но tcpdump показывает, что sourceIP vlanIP
.
Таблицы маршрутизации выглядят хорошо:
# ip маршрут к <clientIP> от <vlanIP> dev eth0.4000
<clientIP> из <vlanIP> через <vlan.gw> dev eth0.4000 table 1 uid 0
Отображение hostPort создается через Карта порта CNI-плагина который использует DNAT и SNAT (подробности связаны). Таким образом, поиск шлюза происходит слишком рано.
Когда я вручную добавляю маршрут из container-ip в таблицу поиска 1, он работает с использованием интерфейса vlan, но ломает eth0.
Так вот вопросы - что надо сделать чтобы маршрутизация происходила после NAT заменил ip-контейнера на ip-интерфейс?