Azure负载均衡后VM内Tomcat应用的公网访问限制问题求解
配置修正方案
你的问题根源是RemoteIpValve配置不完整且位置错误,导致Tomcat没有正确解析LB透传的真实客户端IP,RemoteCIDRValve校验的仍然是LB的内网IP,所以限制规则不生效。需要做以下修改:
- 调整
RemoteIpValve的位置:原配置中RemoteIpValve放在Host标签外部,不会对该Host下的请求生效,需要移入Host标签内部,且放在所有其他Valve配置的最前面,保证IP替换逻辑优先执行。 - 补充
RemoteIpValve的必要参数:必须配置internalProxies参数指定你的LB内网IP段,Tomcat只会信任该列表内的代理服务透传的X-Forwarded-For头,否则会直接忽略该头。
修正后的完整配置示例:
<Host name="example.com" appBase="xxxapps" unpackWARs="true" autoDeploy="true" deployOnStartup="true"> <!-- 移到Host内部最前面,补充LB内网IP段配置 --> <Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="替换为你的LB内网IP段,比如192.168.0.0/16" remoteIpHeader="x-forwarded-for" protocolHeader="x-forwarded-proto" /> <Context name="API" path="/yyy" docBase="yyy.war"></Context> <Context name="Portal" path="" docBase="zzz.war"> <Valve className="org.apache.catalina.valves.RemoteCIDRValve" allow="客户内部网段1,客户内部网段2, ::1"/> </Context> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/xxxlogs" prefix="xxx_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b %{x-forwarded-for}i %{x-forwarded-by}i" requestAttributesEnabled="true" /> </Host>
配置完成后重启Tomcat,先查看访问日志中的%h字段,如果已经和后面的x-forwarded-for第一个IP一致,说明真实IP解析生效,此时RemoteCIDRValve的限制规则就会正常校验真实客户端IP。
替代实现方案
- 在Tomcat前端部署Nginx反向代理,在Nginx层面配置路径匹配的访问控制:匹配到根路径
/的请求校验客户端IP,/api/前缀的请求直接放行,配置更灵活,性能损耗更低。 - 更换支持URL路径级访问控制的负载均衡设备,直接在LB层面配置规则,无需修改后端服务配置,维护成本更低。
- 如果已有Web应用防火墙(WAF),可以在WAF层面配置路径+IP的访问控制规则,也可以快速实现需求。
内容的提问来源于stack exchange,提问作者Anitha.R
相关产品推荐
相关产品推荐

