Прозрачный баланс нагрузки прокси и udp с Nginx в Docker
Я пытаюсь настроить балансировщик нагрузки с IP-адресом и прозрачным прокси порта. Моя среда работает на докере. Мы используем mesos + marathon для управления контейнерами. Для балансировки нагрузки UDP я использую Nginx. App и Nginx работают в док-контейнерах. У меня есть несколько требований: 1. Один клиент должен всегда подключаться к одному и тому же узлу приложения во время сеанса. 2. Приложение, стоящее за nginx, должно предполагать, что оно взаимодействует с клиентом напрямую.
Я использовал эту статью для моей настройки: https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/
Итак, nginx работает с пользователем root. Контейнеры находятся в одной сети. Я включил несколько модулей для nginx, таких как stream, nginx-sticky-module-ng и т. Д.
Nginx Stream conf: `
upstream app-server {
sticky;
server some-app:5684;
server some-app:5684;
}
server {
listen 5684 udp;
proxy_pass app-server:5684;
proxy_bind $remote_addr:$remote_port transparent;
proxy_responses 1;
proxy_timeout 1s;
}
На каждом вышестоящем сервере я установил gw по умолчанию на Nginx IP.
На nginx я установил следующие правила iptables.
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p udp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p udp -s 172.16.0.0/16 --sport 5684 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 0 #I assume this should be 0,because there could be different ports
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Но клиент не может добраться до сервера, кажется. Похоже, пакеты только что застряли на Nginx. Я пропустил какую-то конфигурацию или что-то не так с правилами iptables?