Nginx Transparent IP - ответ сервера маршрутизации через балансировщик нагрузки, а не напрямую клиенту
Мне было поручено настроить прозрачный IP на Nginx, чтобы передать адрес и порт клиента на вышестоящий сервер. Настройка выглядит следующим образом:
Client --> Nginx (listens for udp on 90009) --> Service (listens on localhost:59153)
Nginx и Service настроены на одном хосте.
Базовая настройка работает без каких-либо проблем - запрос перехватывается nginx, направляется в службу, служба отвечает обратно в nginx и обратно в клиент.
Предполагаемое поведение - передать ip источника запроса в службу, поэтому я настраиваю nginx следующим образом:
stream {
upstream upstream_servers {
server 127.0.0.1:59153;
}
server {
listen 90009 udp;
proxy_bind $remote_addr:$remote_port transparent;
proxy_pass upstream_servers;
}
}
proxy_bind $remote_addr:$remote_port transparent;
делает свою работу правильно - ip/port
передается за nginx в сервис. Тем не менее, служба (что не удивительно) пытается ответить прямо на данный ip/port
, Связь с внешним миром разрешена только через порт 90009, поэтому ответ никогда не доставляется.
Я попытался направить ответ на основе прозрачности IP и прямого возврата сервера с NGINX и NGINX Plus в качестве прозрачного прокси. Итак, я сделал следующее:
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 -m socket -j TPROXY --tproxy-mark 1 --on-port 90009
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Но это приводит к любому из двух результатов, в зависимости от того, как я определяю iptables -t mangle -A PREROUTING -p udp -m socket -j TPROXY --tproxy-mark 1 --on-port 90009
:
- Входящие UDP-пакеты маршрутизируются, и запрос никогда не достигает nginx
- Ни один из пакетов не маршрутизируется, ответ не доставлен
Мой вопрос в основном, как направить ответ только через loadbalancer, или, если этот подход неверен, как попытаться решить эту проблему?