You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure负载均衡后VM内Tomcat应用的公网访问限制问题求解

配置修正方案

你的问题根源是RemoteIpValve配置不完整且位置错误,导致Tomcat没有正确解析LB透传的真实客户端IP,RemoteCIDRValve校验的仍然是LB的内网IP,所以限制规则不生效。需要做以下修改:

  1. 调整RemoteIpValve的位置:原配置中RemoteIpValve放在Host标签外部,不会对该Host下的请求生效,需要移入Host标签内部,且放在所有其他Valve配置的最前面,保证IP替换逻辑优先执行。
  2. 补充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 &quot;%r&quot; %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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:45:04