在四层独享型ELB转发下获取客户端真实IP
应用场景
在使用弹性负载均衡进行业务转发时,您可能需要获取客户端请求的真实IP地址进行进一步分析,特别是在安全防护、数据分析、用户行为分析和故障排查等典型业务场景。
使用ELB进行四层业务转发时,默认情况下ELB实例与后端服务器之间直接使用客户端的IP地址通信,后端服务器可以直接获取客户端真实IP地址。但是在ELB实例与IP类型后端通信、TCP或UDP监听器开启IPv4/IPv6地址转换、使用TLS监听器进行转发等场景,客户端真实IP经过独享型ELB实例时会发生转换,您可以参考本文获取四层业务转发场景的客户端真实IP地址。
约束与限制
- 如果请求经过NAT网关,则只能获取到NAT转换后的IP地址,无法获取NAT转化前的IP地址。
- 如果请求客户端为容器,则只能获取到容器所在主机的IP地址,无法获取容器的IP地址。
- 四层监听器(TCP/UDP)默认开启“获取客户端IP”功能,不支持同一台服务器既作为后端服务器又作为客户端的场景。
如果后端服务器和客户端使用同一台服务器,则后端服务器会根据报文源IP为本地IP判定该报文为本机发出的报文,无法将应答报文返回给ELB,最终导致回程流量不通。
四层服务获取客户端真实IP方法介绍
独享型ELB的四层协议监听器(TCP/UDP)默认支持“获取客户端IP”功能,ELB实例与后端服务器之间直接使用客户端真实的IP地址通信。
部分特殊场景,监听器的“获取客户端IP”功能失效,您可以参考表1在四层业务转发场景获取客户端真实IP。
监听器 |
监听器的“获取客户端IP”功能 |
特殊场景获取客户端真实IP |
---|---|---|
TCP监听器 |
以下场景监听器的“获取客户端IP”功能失效,您可以通过配置TOA插件或通过ProxyProtocol协议获取客户端真实IP:
|
|
UDP监听器 |
以下场景无法获取客户端真实IP:
|
|
TLS监听器 |
不支持 |
TCP/UDP监听器默认支持“获取客户端IP”
TCP和UDP监听器的业务转发场景,ELB实例与后端服务器之间直接使用客户端的真实IP地址通信。您无需进行额外设置,通过查看后端服务器的日志记录即可判断是否获取到客户端真实IP。
当Nginx作为后端服务器,您可以参考以下步骤进行验证。
- 修改http配置块,为Nginx配置访问日志,您可以参考执行以下命令。
http { log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; }
图1 配置访问日志 - 查看Nginx的访问日志,您可以直接获取客户端请求的真实IP。
cat /path/server/nginx/logs/access.log
日志记录中,第一个IP地址即为客户端的真实IP地址。
图2 查看Nginx的日志
通过ProxyProtocol协议获取客户端真实IP
您可以通过在监听器上开启ProxyProtocol功能开关,并确保后端服务器具有解析ProxyProtocol协议的能力来获取客户端真实IP。
- TCP监听器在以下场景“获取客户端IP”功能失效:
- TCP监听器与IP类型后端通信。
- TCP监听器开启IPv4/IPv6地址转换开关后进行转发。
- TLS监听器:仅支持通过ProxyProtocol协议获取客户端真实IP。
详细过程请参考以下操作步骤。