阿里云负载均衡相关文档实现
注:阿里云负载均衡服务支持获取客户端真实IP地址的功能,负载均衡提供获取客户端真实IP地址的功能,该功能默认开启。
- 四层负载均衡(TCP协议)服务可以直接在后端ECS上获取客户端的真实IP地址,无需进行额外的配置。
- 七层负载均衡(HTTP/HTTPS协议)服务需要对应用服务器进行配置,然后使用X-Forwarded-For的方式获取客户端的真实IP地址。
真实的客户端IP会被负载均衡放在HTTP头部的X-Forwarded-For字段,格式如下:
X-Forwarded-For: 用户真实IP, 代理服务器1-IP, 代理服务器2-IP,...
此次测试基于nginx1.18.0测试
一层Nginx配置
[基于server块或者location块,这里以location块为例,遵循配置影响最小化原则]
location / {
root html;
index index.html index.htm;
if ($remote_addr ~ "192.168.5.(\d+)") {
set $real_client "192.168.5.0";
}
if ($remote_addr ~ "192.168.10.(\d+)") {
set $real_client "192.168.10.0";
}
if ($remote_addr ~ "192.168.20.(\d+)") {
set $real_client "192.168.20.0";
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $real_client;
proxy_pass http://192.168.20.101;
access_log logs/upstream_default_access-$year$month$day.log main;
}
二层Nginx配置
[此行配置(return 200 “real_client=$real_client”)用于查看测试效果]
server {
listen 80;
server_name localhost;
if ($http_x_forwarded_for ~ "192.168.5.(\d+)") {
set $real_client "192.168.5.0";
}
if ($http_x_forwarded_for ~ "192.168.10.(\d+)") {
set $real_client "192.168.10.0";
}
if ($http_x_forwarded_for ~ "192.168.20.(\d+)") {
set $real_client "192.168.20.0";
}
location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $real_client;
access_log logs/access.log main;
return 200 "real_client=$real_client";
}
}
实现效果
一层Nginx日志
根据一层nginx日志可以看出客户端真实IP为192.168.5.194,符合配置中如下判断,应返回real_client=192.168.5.0
返回文件内容如下:
二层Nginx日志
根据二层nginx配置判断,http_x_forwarded_for值应该返回为192.168.5.0,查看配置文件日志格式如下:
查看日志即可获知对应参数http_x_forwarded_for具体值,如下:
图中为不同客户端发起的多次不同请求,根据测试结果可知,功能实现。