Nginx实现反向代理客户端IP透传

宁可枝头抱香死,何曾吹落北风中。这篇文章主要讲述Nginx实现反向代理客户端IP透传相关的知识,希望能为你提供帮助。
    在前面的实验中,我们了解到nginx可以作实现反向代理功能,不过默认情况下,客户端通过Nginx服务器访问后端web服务器后,后端服务器查看IP来源时只能显示Nginx服务器IP,而不是显示客户端的真实IP。利用IP透传,则可以在后端web服务器上查看到真实的客户端IP。

  1. 反向代理功能实现
【Nginx实现反向代理客户端IP透传】    笔者准备了三台虚拟机,IP为10.0.0.151的虚拟机作为客户端,取名client;IP为10.0.0.152的虚拟机作为Nginx代理服务器,取名nginx-server;IP为10.0.0.153的虚拟机作为后端web服务器,取名web-server。
1.1 安装服务
    web服务器下载并启动httpd服务,同时将web主页修改为“hello world”。

    Nginx服务器部分,笔者继续使用之前实验时编译安装的Nginx1.18,并将IP绑定到www.johnnyfang.com这个域名上,此时客户端直接访问Nginx服务器时只会显示Nginx代理服务器的web主页内容。

1.2 修改配置文件
    Nginx服务器在配置文件中添加代理转发服务器的信息,此时客户端再去访问Nginx服务器,显示的已经不是Nginx服务器自身web主页内容,而是后端web-server服务器的主页内容。


1.3 查看IP来源
    后端web服务器查看/var/log/httpd/access_log日志文件时,显示的IP只有10.0.0.152,即来自Nginx服务器,而没显示真实的客户端IP10.0.0.151。




  1. 实现客户端IP透传
    由于默认情况下无法在后端web服务器查看到真实客户端ip,在实际生产中可能会影响到用户分析等后续行为,为了避免此情况的出现,则要用到IP透传。IP透传的工作原理是Nginx代理服务器在转发请求时添加一个头,即header,这个header里携带有真实客户端IP,另外后端web服务器在配置文件的日志记录格式部分添加与Nginx服务器中相同的自定义名称。
2.1 一级代理实现客户端IP透传
2.1.1 利用$remote_addr实现IP透传
2.1.1.1 修改配置文件
    proxy_set_header可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部,Nginx服务自带了识别源地址的变量$remote_addr,加上该变量,不同IP通过Nginx服务器转发至后端web服务器时,均能在后端服务器查看到源地址,同时我们需要对设置取个别名,名称可自定义,不过官方有专门的的名称为X-Real-IP。

    后端web服务器在配置文件的LogFormat部分添加与Nginx服务器中相同的名称作为日志记录的头部信息,具体如下图,并重启服务。

2.1.1.2 测试环节
    此时客户端通过Nginx代理服务器去访问后端web服务时,后端web服务器查看日志,可看到访问是由源地址为10.0.0.151的客户端发起,从而实现了IP透传。




2.1.2 利用$proxy_add_x_forwarded_for实现IP透传
2.1.2.1 修改配置文件
    除了上面讲的利用$remote_addr这一变量来进行一级代理的客户端IP透传,还可以用到Nginx服务自带的另一个变量$proxy_add_x_forwarded_for,它同样可以实现该功能。例如在Nginx服务器配置文件中添加如下图所示内容,同时修改后端web服务器配置文件中的对应名称。


2.1.2.2 测试环节
    此时客户端通过Nginx服务器访问后端web服务器,在web服务器上查看日志时,同样能显示客户端的源地址。




2.2 多级代理实现客户端IP透传
    在上面使用的两个变量中,$proxy_add_x_forwarded_for还能在多级代理中实现客户端IP透传。例如笔者这边再增加一台IP为10.0.0.155的虚拟机作为第二个代理服务器,取名nginx-server2,希望做到客户端访问nginx-server代理服务器,由nginx-server服务器转发给nginx-server2服务器,再由nginx-server2服务器转发给后端web服务器,同时web服务器查看web服务访问日志时,能看到所有的IP来源。
2.2.1 修改配置文件
    由于多加了一台代理服务器,nginx-server需在配置文件中将proxy_pass指向第二台代理服务器的IP。

    第二台代理服务器的Nginx笔者是直接通过yum安装,在配置文件/etc/nginx/nginx.conf的location部分添加如下图所示内容,nginx-server2是最后的一台代理服务器,故proxy_pass需指向提供web服务的主机IP。

2.2.2 测试环节
    客户端访问nginx-server服务器时,会显示真正提供web服务的web-server网页内容。web-server查看日志时,能看到最终的访问请求来自nginx-server2,同时源地址为客户端的真实IP10.0.0.151,并且经过了IP为10.0.0.152的第一个代理服务器。



    推荐阅读