Linux环境下Wildfly 11如何配置仅响应指定IP/子网的HTTP请求?
你之前尝试的interfaces配置确实只是用来定义Wildfly绑定的网络接口(比如让服务器监听0.0.0.0还是某个特定网卡IP),没法过滤请求的来源IP。要实现这个需求,咱们得用Wildfly内置的Undertow web服务器的请求过滤功能,具体来说是RemoteAddrHandler过滤器,下面是详细的配置步骤:
第一步:添加IP过滤规则到Undertow过滤器
打开你的standalone.xml配置文件,找到Undertow子系统的配置块(大概长这样):
<subsystem xmlns="urn:jboss:domain:undertow:3.1"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <response-header name="server-header" header-name="Server" header-value="WildFly/11"/> <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/> </filters> </subsystem>
在<filters>标签内部,添加一个新的过滤器,用来指定允许访问的IP或子网:
<filter name="allow-specific-ips" class-name="io.undertow.server.handlers.remoteaddr.RemoteAddrHandler" module="io.undertow.core"> <!-- 允许单个IP和CIDR格式的子网,多个用逗号分隔 --> <param name="allow" value="192.168.1.10,10.0.0.0/24"/> <!-- 可选:自定义拒绝访问时的提示信息,默认返回403 Forbidden --> <param name="rejectionReason" value="Access Denied: Your IP is not whitelisted"/> </filter>
如果需要拒绝特定IP/子网(而不是允许),可以把allow参数换成deny,比如:
<param name="deny" value="192.168.2.0/24,172.16.0.5"/>
第二步:将过滤器应用到目标范围
接下来要把这个过滤器绑定到你想要控制的范围,可以是整个主机(所有web应用),也可以是特定路径:
选项1:应用到整个默认主机(所有应用)
找到<host name="default-host" alias="localhost">标签,在内部添加过滤器引用:
<host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> <!-- 添加这行,绑定IP过滤规则 --> <filter-ref name="allow-specific-ips"/> </host>
选项2:应用到特定路径(比如仅限制/admin路径)
如果只想过滤某个特定路径,比如/admin,可以在<host>标签下添加一个新的<location>块:
<host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <location name="/admin" handler="admin-handler"> <!-- 仅对/admin路径应用IP过滤 --> <filter-ref name="allow-specific-ips"/> </location> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host>
注意:这里的admin-handler需要你提前在<handlers>标签中定义,对应你的admin应用的路径。
第三步:(可选)处理反向代理场景下的真实客户端IP
如果你的Wildfly前面部署了反向代理(比如Nginx、Apache),默认情况下Wildfly拿到的请求来源IP是代理服务器的IP,这时候需要先配置Undertow识别真实客户端IP:
- 在
<filters>标签中添加代理头部处理过滤器:
<filter name="proxy-headers" class-name="io.undertow.server.handlers.ProxyPeerAddressHandler" module="io.undertow.core"/>
- 在
<host>标签中,先添加这个代理过滤器,再添加IP过滤过滤器(顺序很重要):
<filter-ref name="proxy-headers"/> <filter-ref name="allow-specific-ips"/>
这样Wildfly就能正确获取到客户端的真实IP,再进行过滤。
最后:重启Wildfly生效
配置完成后,重启Wildfly服务器,测试一下:
- 用允许的IP访问:正常响应
- 用未允许的IP访问:返回403 Forbidden,并且看到你自定义的拒绝信息(如果配置了的话)
内容的提问来源于stack exchange,提问作者brgsousa

