###注意 要在 nginx.conf配置文件 http配置里面加 log_format log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" '; ##就是上面这句 ###这是 include /opt/nginx/conf/conf.d/*.conf; 下面的子配置文件 server { listen 80; listen 443 ssl; server_name git.bskcerrahi.com; charset utf-8; #access_log logs/git.bskcerrahi.com.log main; location / { set_real_ip_from 0.0.0.0/0; ##这是所有的IPV4IP全部放开 #set_real_ip_from 23.224.233.10; real_ip_header X-Forwarded-For; ##这个也要加 ##############代付过白################### allow 122.128.111.227; allow 122.128.111.146; allow 34.150.105.29; allow 103.232.123.197; allow 42.193.155.43; deny all; ######################################## proxy_pass https://127.0.0.1:8443; proxy_redirect off; proxy_set_header Host $host; proxy_set_header Ali-CDN-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ###参考文档: https://help.aliyun.com/document_detail/42205.html 网站部署了流量代理服务(例如Web应用防火墙、DDoS高防、CDN)后,源站服务器可以通过解析回源请求中的X-Forwarded-For记录,获取客户端的真实IP。本文介绍了不同类型的Web应用服务器(包括Nginx、IIS 6、IIS 7、Apache、Tomcat)以及容器K8s如何进行相关设置,以获取客户端的真实IP。 背景信息 在大部分实际业务场景中,网站访问请求并不是简单地从客户端(访问者)的浏览器直接到达网站的源站服务器,而是在客户端和服务器之前经过了根据业务需要部署的Web应用防火墙、DDoS高防、CDN等代理服务器。这种情况下,访问请求在到达源站服务器之前可能经过了多层安全代理转发或加速代理转发,源站服务器该如何获取发起请求的真实客户端IP? 透明的代理服务器在将客户端的访问请求转发到下一环节的服务器时,会在HTTP的请求头中添加一条X-Forwarded-For记录,用于记录客户端的IP,格式为X-Forwarded-For:客户端IP。如果客户端和服务器之前有多个代理服务器,则X-Forwarded-For记录使用以下格式记录客户端IP和依次经过的代理服务器IP:X-Forwarded-For:客户端IP, 代理服务器1的IP, 代理服务器2的IP, 代理服务器3的IP, ……。 因此,常见的Web应用服务器可以通过解析X-Forwarded-For记录获取客户端真实IP。 下文分别针对Nginx、IIS 6、IIS 7、Apache和Tomcat服务器以及容器K8s,介绍相应的X-Forwarded-For配置方案。 Nginx配置方案 Nginx服务器使用http_realip_module模块获取客户端IP地址。 安装http_realip_module模块。 在Nginx服务器上执行# nginx -V | grep http_realip_module命令,查看是否已安装http_realip_module模块。如果没有安装,请重新编译Nginx服务并加装该模块。 说明 一般情况下,通过一键安装包安装的Nginx服务器默认不安装http_realip_module模块。 参考以下方法,安装http_realip_module模块。 wget http://nginx.org/download/nginx-1.12.2.tar.gz tar zxvf nginx-1.12.2.tar.gz cd nginx-1.12.2 ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module make make install kill -USR2 `cat /alidata/server/nginx/logs/nginx.pid` kill -QUIT `cat /alidata/server/nginx/logs/ nginx.pid.oldbin` 修改Nginx服务配置文件。 打开default.conf配置文件。 在location / {}中添加以下内容: set_real_ip_from ; set_real_ip_from ; ... set_real_ip_from ; real_ip_header X-Forwarded-For; 其中,需要设置为代理服务器(即Web应用防火墙)的回源IP段。关于Web应用防火墙的回源IP段,请参见放行WAF回源IP段。 多个回源IP段必须分行添加。假设代理服务器的回源IP段包含10.0.0.1、10.0.0.2、10.0.0.3,则使用以下格式: set_real_ip_from 10.0.0.1; set_real_ip_from 10.0.0.2; set_real_ip_from 10.0.0.3; real_ip_header X-Forwarded-For; 修改log_format日志记录格式。 打开nginx.conf配置文件,定位到http配置部分的log_format。 在log_format中添加x-forwarded-for字段,替换默认的remote-address字段。 修改后的log_format内容如下: log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" '; 执行nginx -s reload命令,重启Nginx服务。 重启Nignx服务器后,上述配置才会生效,Nignx服务器将可以通过X-Forwarded-For记录获取客户端真实IP