AWS Classic ELB TCP SSL透传场景下Apache获取真实客户端IP求助
你当前的TCP SSL透传场景下,CLB无法修改加密的HTTP请求插入X-Forwarded-For头,可行方案是开启CLB的代理协议(Proxy Protocol),后端Apache配置解析代理协议头获取真实客户端IP,具体操作步骤如下:
步骤1:为CLB的443 TCP监听器开启代理协议
可以通过AWS CLI执行以下命令完成配置,替换尖括号内的参数为你实际的资源信息:
# 创建代理协议策略 aws elb create-load-balancer-policy \ --load-balancer-name <你的CLB实例名称> \ --policy-name EnableProxyProtocol \ --policy-type-name ProxyProtocolPolicyType \ --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true # 将策略绑定到后端443端口 aws elb set-load-balancer-policies-for-backend-server \ --load-balancer-name <你的CLB实例名称> \ --instance-port 443 \ --policy-names EnableProxyProtocol
你也可以在AWS控制台的ELB配置页完成上述操作。
步骤2:配置Apache解析代理协议头
要求Apache版本≥2.4.30,自带的mod_remoteip模块原生支持Proxy Protocol解析:
- 首先启用必要模块:
a2enmod remoteip ssl # 基于Debian/Ubuntu的系统,CentOS/RHEL可修改httpd.conf加载对应模块
- 修改HTTPS虚拟主机配置(一般位于
/etc/httpd/conf.d/ssl.conf或/etc/apache2/sites-available/your-ssl-site.conf),在<VirtualHost *:443>块内添加以下配置:
# 开启代理协议解析 RemoteIPProxyProtocol On # 配置信任的代理地址段,替换为你VPC的内网IP段或CLB的实际IP段 RemoteIPTrustedProxy 172.31.0.0/16 # 配置日志格式使用解析后的真实客户端IP LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_proxy CustomLog /var/log/httpd/ssl_access_log combined_proxy
- 重启Apache服务生效:
systemctl restart httpd # 或systemctl restart apache2
验证效果
配置完成后发起HTTPS访问,查看Apache的SSL访问日志,即可看到日志首字段已经替换为真实客户端IP,不再是CLB的IP地址。
如果你的Apache版本低于2.4.30,可以编译安装第三方mod_proxy_protocol模块,配置逻辑和上述一致。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

