我被分配了一项任务,在 Nginx 上设置透明 IP,以便将客户端地址和端口传递给上游服务器。设置如下:
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 上进行,因此响应永远不会被传递。
我尝试做的是根据以下情况来路由响应 使用 NGINX 和 NGINX Plus 作为透明代理实现 IP 透明度和直接服务器返回。所以我做了以下事情:
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
- 没有任何包裹被路由,响应未送达
我的问题基本上是,如何仅通过负载均衡器路由响应,或者,如果这种方法是错误的,如何尝试解决这个问题?