Я пытаюсь настроить балансировщик нагрузки udp с прозрачным прокси-сервером IP и порта. Моя среда работает на докере. Мы используем mesos + marathon для управления контейнерами. Для балансировки нагрузки UDP я использую Nginx. Приложение и 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: `
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 по умолчанию на IP-адрес Nginx.
На 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?