请教一个关于 iptables NAT 转发后端服务器获取客户端真实 IP 的问题。
以下与我测试的真实境不同只有 IP 和端口,以下是一个场景:
两台服务器 A,B 均为 Linux:
- A 服务器 IP 180.101.50.242
- B 服务器 IP 183.3.203.119
需求:通过请求 A 服务器 IP 端口可以转发访问到 B 服务器 IP 端口,B 服务器服务可以获取到真实客户端的 IP 地址。 实操:在 A 服务器上做 iptable NAT 转发 8088 端口到 B 服务器 8099 端口,用了以下命令
iptables -t nat -A PREROUTING -p tcp --dport 8088 -j DNAT --to-destination 183.3.203.119:8099; iptables -t nat -A POSTROUTING -p tcp -d 183.3.203.119 --dport 8099 -j MASQUERADE -to-source 180.101.50.242; 问题:在 B 服务器的 Nginx 里面无法获取到真实的客户端 IP ,一直获取到的是 A 服务器的 IP ,如果想要获取真实客户端 IP ,iptable 这块规则该如何处理。
说明:Nginx 相关的获取客户端 IP 配置都加过了(没有效果,大概率判断问题不在 Nginx 这一侧):
server { listen 80 default_server; server_name _; location / { default_type text/html; set_real_ip_from <NAT 服务器 IP>; real_ip_header X-Forwarded-For; real_ip_recursive on; # 使用$remote_addr 获取客户端真实 IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; content_by_lua_file /etc/nginx/print_ngx_var.lua; } } 