WHM/Cpanel(CentOS)同机两独立IP脚本交互源IP传递错误如何解决
同服务器跨专属IP请求源IP重写问题解决方案
问题根因
这是WHM/Cpanel环境下多专属IP站点的默认路由特性导致的问题:当同服务器上绑定专属IP的站点请求另一个绑定专属IP的站点时,流量默认走本地回环链路,不会经过公网路由,内核会自动将请求源IP重写为目标站点的专属IP,和脚本逻辑无关。
可落地解决方案
方案1:排除目标域名本地代理(最小影响,WHM可视化操作)
不需要修改系统配置文件,直接在WHM后台配置即可:
- 登录WHM管理后台,依次进入服务配置 → Apache配置 → 调整Apache配置
- 找到Exclude these domains from local proxy输入框,填入ScriptB的域名
- 保存配置后等待WHM自动重建Apache配置并重启服务生效,该配置仅让ScriptB的域名不触发本地代理逻辑,不影响其他站点。
方案2:关闭全局本地代理路由(全局生效,适合多站点跨IP调用场景)
如果有大量同服务器跨专属IP的请求需求,可以直接关闭全局本地代理规则:
- 登录WHM管理后台,依次进入服务配置 → Apache配置 → 调整Apache配置
- 找到Local Domain Routing分类,关闭
Proxy local domains to local IPs选项 - 保存配置后等待服务重启生效即可。
方案3:配置iptables SNAT规则(永久生效,规则可控)
如果需要精准控制流量规则,可添加SNAT规则手动指定源IP,假设ScriptA专属IP为1.1.1.1,ScriptB专属IP为2.2.2.2:
- 执行命令添加规则:
iptables -t nat -A POSTROUTING -d 2.2.2.2 -s 127.0.0.0/8 -j SNAT --to-source 1.1.1.1 - 保存规则避免服务器重启后失效:
service iptables save
方案4:兼容校验逻辑(无服务器配置修改成本)
如果不方便修改服务器配置,可以调整ScriptB的校验逻辑:当请求源IP为服务器自身的IP段时,优先读取请求头中的X-Forwarded-For或X-Real-IP字段获取真实源IP,再和签名域名做匹配即可。
验证方法
修改完成后在ScriptA所属的SSH环境执行测试请求:curl -v [ScriptB的测试接口地址]
同时在ScriptB侧打印请求的远端IP字段(Python中为request.remote_addr),确认返回值为ScriptA的专属IP即配置生效。
内容的提问来源于stack exchange,提问作者cryptoman
相关产品推荐
相关产品推荐

