Myluzh Blog

Strive to become a dream architect.

阿里云负载均衡ALB获取客户端真实IP

发布时间: 2024-2-28 文章作者: myluzh 分类名称: CLOUD


0x01 获取方法介绍
当使用ALB监听转发流量时,您可通过HTTP头部的X-Forwarded-For字段获取客户端真实IP地址。
七层负载均衡(HTTP或HTTPS协议)支持在HTTP头部的X-Forwarded-For字段保留客户端真实IP信息,服务器进行相应配置后即可获取到客户端真实IP地址。
X-Forwarded-For字段格式如下:
X-Forwarded-For: <客户端真实IP, 代理服务器1-IP, 代理服务器2-IP,...>
当使用此方式获取客户端真实IP时,获取的第一个地址就是客户端真实IP。

0x02 操作步骤
步骤一:检查监听已开启通过X-Forwarded-For获取功能
1、登录应用型负载均衡ALB控制台。
2、在顶部菜单栏,选择实例所属的地域。
3、在实例页面,找到目标实例,单击实例ID。
4、在实例详情页面,单击监听页签,找到目标监听,单击监听ID。
5、在监听详情页面,查看到附加HTTP头字段包括开启通过X-Forwarded-For头字段获取来访者客户端IP。
说明:ALB默认开启通过X-Forwarded-For头字段获取客户端真实IP功能,不支持关闭。

步骤二:配置后端服务器(配置Nginx服务器)
1、在服务器执行nginx -V | grep http_realip_module命令,检查Nginx服务器是否安装了http_realip_module模块。Nginx使用http_realip_module模块解析X-Forwarded-For记录。
如果返回信息中包括--with-http_realip_module,表示已安装http_realip_module模块,可进行下一步。
2、修改Nginx服务配置文件并保存,修改点可参考下方说明。执行nginx -t命令查看配置文件所在路径,默认通常为 /etc/nginx/nginx.conf,具体请以实际环境为准。
在这段Nginx配置中,main字段是一个自定义的日志格式,用于定义日志文件中记录的内容格式。在log_format main中,定义了日志的格式,包括了一系列变量,比如$remote_addr(客户端IP地址)、$remote_user(远程用户)、$time_local(访问时间)、$request(请求的URL)、$status(HTTP状态码)、$body_bytes_sent(响应的字节数)、$http_referer(引荐页面URL)、$http_user_agent(用户代理信息)和$http_x_forwarded_for(X-Forwarded-For的值)等。
http {
 # 确保设置$http_x_forwarded_for,该变量用于记录X-Forwarded-For的值
 log_format  main  '$remote_addr- $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
 
 # ...
}
3、修改Nginx Server里面的日志配置
在Nginx的access_log指令中,通过设置为/var/log/nginx/prd.access.log main,将使用定义的main日志格式,将这些变量记录到/var/log/nginx/prd.access.log日志文件中。这样可以方便地记录访问日志,并且根据需要自定义记录的内容。
server {
     listen 80;
     server_name *.sxhlcloud.com;
     # 配置access输出位置,不支持error_log
     access_log /var/log/nginx/prd.access.log main;
 # ...
}
4、测试Nginx配置&重载配置
root@iZbp12bkuvg20e1j3y9gtvZ:/etc/nginx/conf.d# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@iZbp12bkuvg20e1j3y9gtvZ:/etc/nginx/conf.d# nginx -s reload
5、查看日志
root@iZbp12bkuvg20e1j3y9gtvZ:/etc/nginx/conf.d# tail -f -n 1 /var/log/nginx/prd.access.log
# 可以看到 每行日志最后已经有客户端IP了
100.127.135.209- - [28/Feb/2024:14:57:36 +0800] "GET /prod-api/employ/employ/reCheck/18543/666 HTTP/1.1" 200 65 "https://servicewechat.com/wx7a4767881e87ea7e/44/page-frame.html" "Mozilla/5.0 (Linux; Android 10; M2010J19SC Build/QKQ1.200830.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160065 MMWEBSDK/20230805 MMWEBID/926 MicroMessenger/8.0.42.2460(0x28002A58) WeChat/arm64 Weixin NetType/4G Language/zh_CN ABI/arm64 MiniProgramEnv/android" "223.104.159.148"

0x99 参考连接
通过ALB获取客户端真实IP

标签: 日志 nginx 负载均衡 格式化 阿里云 ALB

发表评论