Виртуальный сервер Linux: путь возврата NAT
Я пытаюсь настроить балансировщик нагрузки LVS перед моим Kubernetes: Calico используется в качестве контейнерной сети, поэтому каждый модуль имеет свой собственный сетевой интерфейс на своем хосте. Внешние IP-адреса, маршруты и правила маршрутизации управляются с помощью keepalived. Каждая подсеть, назначенная моим хостинг-провайдером, имеет свой собственный маршрутизатор. Серверы имеют два физических интерфейса, подключенных к Интернету. Внешние IP-адреса доступны на втором интерфейсе.
Конфигурация такова: первый интерфейс имеет глобальный IP-адрес и маршрут по умолчанию. Второй интерфейс имеет частный IP. Он также имеет все дополнительные IP-адреса от моего хостинг-провайдера. Поскольку все пакеты с дополнительных IP-адресов должны маршрутизироваться через специальный шлюз по умолчанию, я добавил таблицы и правила маршрутизации.
До этого момента все работает как положено. Чтобы сделать сервисы Kubernetes доступными по IP-адресам, я добавил LVS на некоторых узлах.
Моя проблема заключается в следующем: пакеты из Интернета приходят на мои стручки Kubernetes, но их ответы не возвращаются в Интернет. Пакеты исчезают где-то в моем узле Kubernetes. Пакеты ответов от моих модулей используют IP-адрес модуля в качестве источника и должны быть перезаписаны NAT.
При просмотре правил iptables я не вижу правил для LVS. Где они? Когда выполняются правила LVS NAT? Они связаны с интерфейсом? Определяется ли путь переадресации и интерфейс до того, как NAT для ответных пакетов будет готов?
1 ответ
Мне не хватало включения поддержки conntrack netfilter для соединений LVS. См. http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.filter_rules.html для описания взаимодействия с сетевым фильтром LVS.
Это можно сделать с помощью:
sysctl net.ipv4.vs.conntrack=1