Nginx 透明 IP - 通过负载均衡器路由服务器响应,而不是直接路由到客户端

Nginx 透明 IP - 通过负载均衡器路由服务器响应,而不是直接路由到客户端

我被分配了一项任务,在 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

  1. 收入 UDP 包被路由,请求永远不会到达 nginx
  2. 没有任何包裹被路由,响应未送达

我的问题基本上是,如何仅通过负载均衡器路由响应,或者,如果这种方法是错误的,如何尝试解决这个问题?

相关内容