ProxySourceAddress指令仅在Apache 2.4.37+版本支持,需置于或虚拟主机上下文中,绑定本机已配置IP,优先级高于ProxyPass的sourceaddress参数,不适用于UDP或WebSocket代理。

Apache 2.4.37+ 才支持 ProxySourceAddress
这个指令不是所有 Apache 版本都有。低于 2.4.37 的版本(比如 Ubuntu 20.04 自带的 2.4.41 是 OK 的,但 CentOS 7 默认的 2.4.6 就不支持),直接写 ProxySourceAddress 会报错:Invalid command 'ProxySourceAddress'。检查方法很简单:
httpd -v
确认版本后,再查模块是否启用:
httpd -M | grep proxy
确保 proxy_module 和 proxy_http_module 都已加载(ProxySourceAddress 依赖 mod_proxy,但不依赖 mod_proxy_http;不过实际代理 HTTP 流量时两者通常共存)。
ProxySourceAddress 必须放在 或虚拟主机上下文中
它不能写在全局配置顶层,也不能写在 .htaccess 里。常见错误是直接丢在 httpd.conf 最外层,结果完全不生效。正确位置示例:
<virtualhost>
ServerName api.example.com
<proxy>
ProxySourceAddress 192.168.10.5
Require all granted
</proxy>
ProxyPass / http://backend:8000/
ProxyPassReverse / http://backend:8000/
</virtualhost>
注意几点:
-
ProxySourceAddress只影响该块内发起的连接,对其他代理路径无效 - IP 地址必须是本机已绑定的地址(
ip addr show能查到),否则启动失败并报错:Cannot assign requested address - 如果本机有多个 IPv4 地址,且目标服务器做了源 IP 白名单,这里填错一个就直接被拒
与 ProxySet 的 sourceaddress 参数别混用
有人会看到文档里提到 ProxySet sourceaddress=...,这是另一种写法,适用于 ProxyPass 行内设置,例如:
ProxyPass /app/ http://10.0.1.20:3000/ retry=0 timeout=5 sourceaddress=192.168.10.5
但它和 ProxySourceAddress 不是等价替换:
-
sourceaddress是ProxyPass的参数,只作用于这一条代理规则 -
ProxySourceAddress是独立指令,作用于整个块,更干净,也支持通配符匹配 - 如果同时用了两者,以
ProxySourceAddress为准(后者优先级更高)
另外,sourceaddress 参数在较老 Apache 中可能不可用,而 ProxySourceAddress 是明确的、可读性更强的替代方案。
UDP 代理或非 HTTP 协议不适用
ProxySourceAddress 仅控制 TCP 连接的本地绑定地址,对 UDP(如 DNS 代理)、或使用 mod_proxy_wstunnel 的 WebSocket 连接,它不起作用。如果你在做 SIP 代理或自定义 TCP 透传,得换思路——比如用 iptables 强制 SNAT,或者改用 haproxy 等更底层可控的代理工具。
还有一个容易忽略的点:Linux 内核的 rp_filter(反向路径过滤)可能干扰多 IP 绑定。如果设置了 ProxySourceAddress 但连接始终走默认路由,检查:
sysctl net.ipv4.conf.all.rp_filter
临时关闭测试(仅调试用):
sysctl -w net.ipv4.conf.all.rp_filter=0
生产环境建议调成 2(宽松模式)并配合 src 规则精细控制。










