You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Apache反向代理如何将客户端源IP传递至目标服务器?

解决Apache反向代理传递客户端真实IP的问题

搞定这个问题其实只需要补全两步关键配置——你已经启用了mod_remoteip,但还没让它真正发挥作用,同时还要确保代理转发时把真实IP传递给目标服务器,毕竟你没法修改目标端的设置,所有操作都得在Apache这边完成。

1. 完善mod_remoteip的核心配置

打开apache2.conf,确保不仅加载模块,还要指定信任的代理IP和用于提取真实IP的请求头:

LoadModule remoteip_module modules/mod_remoteip.so
# 指定从X-Forwarded-For头中提取真实客户端IP
RemoteIPHeader X-Forwarded-For
# 将代理服务器自身的IP加入可信列表(包括公网和内网IP,多个的话分行写)
RemoteIPTrustedProxy 你的代理服务器公网IP
RemoteIPTrustedProxy 你的代理服务器内网IP(如果存在)

这里的核心是告诉Apache:哪些IP是可信的代理来源,这样它才会从X-Forwarded-For头里提取真实客户端IP,而不是直接使用代理自身的IP。

2. 在VirtualHost中添加请求头传递规则

修改你的<VirtualHost>配置,加入RequestHeader指令,把真实IP注入到转发给目标服务器的请求中:

<VirtualHost *:444>
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
    ProxyRequests Off
    ServerName mydomain.com
    ServerAlias mydomain.com

    # 关键:将真实客户端IP写入X-Forwarded-For头
    # 单级代理用set,多级代理建议用append
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}e"
    # 可选:传递原请求的协议(因为你的代理是HTTPS,目标是HTTP)
    RequestHeader set X-Forwarded-Proto "https"

    ProxyPass / http://destination_IP:6444/
    ProxyPassReverse / http://destination_IP:6444/

    SSLCertificateFile /etc/letsencrypt/live/mydomain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

%{REMOTE_ADDR}e会获取经过mod_remoteip处理后的真实客户端IP,把它放到X-Forwarded-For头里,这样目标服务器收到的请求就会带有这个头,里面就是原始客户端的IP。

3. 启用依赖模块并验证配置

  • 首先确保mod_headers已经启用(RequestHeader指令需要这个模块):
    a2enmod headers
    
  • 检查Apache配置是否有语法错误:
    apache2ctl configtest
    
  • 如果显示Syntax OK,重启Apache使配置生效:
    systemctl restart apache2
    

4. 验证效果

你可以修改日志格式来确认真实IP是否被正确记录,比如把CustomLog改成:

CustomLog ${APACHE_LOG_DIR}/access.log "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

%a会显示经过mod_remoteip处理后的真实客户端IP,查看日志就能确认配置是否生效。同时,目标服务器收到的请求中X-Forwarded-For头就是真实IP了。

内容的提问来源于stack exchange,提问作者omega1

火山引擎 最新活动