LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Nginx 反向代理:IP透传(IP Passthrough)的几种方案介绍

admin
2026年2月9日 12:57 本文热度 152

扩展:IP透传(IP Passthrough)的几种方案

引言:在现代网络架构中,负载均衡是保障系统高可用性和性能的关键组件。然而,在负载均衡的默认工作模式下,后端服务器接收到的请求源IP地址通常是负载均衡器的IP地址,而非客户端的真实IP地址,这种行为虽然简化了网络通信流程,但会对某些业务场景(如日志审计、安全防护、数据库连接管理等)造成不便。因此,源地址透传(Source IP Passthrough)成为负载均衡配置中的核心需求之一,这也凸显了 IP 透传的重要性,在某些场景中获取用户真实IP地址对安全策略和上游服务处理至关重要。

下面作者简单介绍一下,当下主流的几种IP透传方案:Proxy Protocol 协议、修改 IP 报文、DSR 方案。其中 Proxy Protocol 方案在 Nginx 作为四层反向代理时已经实践过了,接下来简单讲解修改 IP 报文和 DSR 方案的实现。

IP报文修改原理,修改 IP 报文中的源地址,以及修改路由规则,使其指向负载均衡器或客户端,若按此又细分为两种方案:

  • • 方案1.由 Nginx 代理服务器 Nginx 用户态进程处理返回响应 (TProxy) (非常规方式),支持 TCP 和 UDP 协议。
  • • 方案2.由 Upstream 上游服务器返回响应给 Nginx 代理服务器,由代理服务器内核直接转发给客户端,无需经过 Nginx 用户态进程处理。

IP报文修改:由 Nginx 返回响应 给客户端

IP报文头部包含 source IP 和 destination IP,修改 source IP 为客户端真实IP(A),使上游服务可直接获取,处理完毕后在回程路径中,必须修改上游服务所在主机的路由规则,使其网关指向 Nginx 所在机器(B),通过 Nginx 转发响应给客户端。

步骤如下:

  • • 客户端(A)发起请求,源地址为 A,目前地址为 B (Nginx 代理服务器)。
  • • 经由 Nginx 修改 IP 报文,将源地址改为客户端真实IP(A),转发给上游服务。
  • • 上游服务器接收 Nginx 代理服务器转发的数据包,从源地址中获取客户端真实IP(A)。
  • • 处理完毕后,上游服务器将响应数据包发送给 Nginx 代理服务器,但是目标地址为 A,由于需要设置回程路由,此时需要将上游服务所在主机的路由规则修改为网关指向 Nginx 代理服务器(B),这样响应数据包才能正确返回给客户端。
  • • Nginx 代理服务器接收到响应数据包,由于源地址为C的报文转发到本机 Nginx 监听端口,然后再其转发给客户端(A)。
  • • 至此,整个 IP 透传过程完成。
weiyigeek.top-由Nginx应用返回响应图

简单配置如下:

  • • Nginx 代理服务器配置:一是使用 proxy_bind 指令,二是调节 路由、iptables 规则,使其把上游接收到的响应,目标IP是客户端的IP的报文转发给 Nginx 的 80 端口。
# 1.使用bind指令配合transparent参数,绑定remote address实现透明代理。
vim conf/nginx.conf
proxy_bind $remote_addr transparent;

# 路由
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 tcp -s 172.16.0.0/28 --sport 80 -j MARK --set-xmark 0x1/0xffffffff
  • • 上游服务器配置:修改路由规则,使网关其指向 Nginx 代理服务器的 IP。
route del default gw 10.16.2.2 # 原网关IP
route add default gw  172.16.0.2 # Nginx代理服务器IP

IP报文修改:由 上游服务器 直接返回响应 给客户端

同样,IP报文头部包含 source IP 和 destination IP,在 Nginx 代理服务器中修改 source IP 为客户端真实IP(A),使上游服务可直接获取到客户端真实IP(A),处理完毕后,上游服务器将网关指向B,从而将目标地址设置 A 的响应数据包,由于上游服务器不具备连接外网能力,此时返回给 Nginx 代理服务器主机上,不同于第一种方案,此处不经过 Nginx 用户态进程处理,而由内核根据配置 iptables 规则进行转发,在 netfilter OUTPUT 链中直接转发报文至A,以转发 udp 四层数据包给客户端为例:

iptables -t mangle -A OUTPUT -p udp --sport 53 -j TPROXY --on-port=53 --taddr=0.0.0.0
weiyigeek.top-由Nginx主机内核转发图

DSR 方案

实际上 DSR 方案与 IP 报文修改类似,但略有不同。DSR(Direct Server Return)是一种负载均衡技术,它允许上游服务器直接将响应数据包发送回客户端,而无需通过 Nginx 代理服务器。在这种模式下,Nginx 主要负责接收请求并将其转发给上游服务器,但不直接参与响应的转发。

DSR 方案的核心在于上游服务可直连客户端(有公网IP),Nginx 在转发请求给上游服务器时,会将目标地址设置为客户端的真实 IP(A),而不是 Nginx 的监听 IP。这样,当上游服务器处理完请求并准备返回响应时,它会将数据包直接发送回原始的客户端,但是回包时仍需将source IP改回B(Nginx地址),否则后续请求可能绕过NGX,从而导致负载均衡失效。

weiyigeek.top-DSR方案图

但是此种方法存在一定的缺陷,一是 NGX 无法监控上游服务是否正常返回响应,二是当响应不经过NGX,则无法检测上游异常,影响健康检查与故障转移,导致负载均衡策略受限,难以实施动态权重调整或熔断机制。

好了,这里我们简单的了解了 Nginx 作为四层反向代理的几种 IP 透传方案,但是由于作者的场景有限,且一般情况下很少遇到在四层反向代理中需要使用非 Proxy_Protocol 协议透传 IP 的场景,因此并未深入实践,等后续作者遇到此类场景时,再做进一步实践吧。

至此,我们本章学习 stream 四层反向代理的相关知识,对比前面学习的 HTTP 反向代理,我们发现 Nginx 作为四层反向代理同样强大。在处理TCP和UDP协议时,Nginx提供了灵活的配置选项,如负载均衡、会话管理、健康检查等,当下Nginx 不仅适用于普通Web服务,更在现代微服务体系中承担关键角色,深入掌握其四层代理与IP透传能力,有助于构建高性能、高可靠的服务网关。


阅读原文:https://mp.weixin.qq.com/s/Phf9QIcymJrqnAdEN2hkqQ


该文章在 2026/2/9 12:57:10 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved