我正试图将所有请求限制到我的Tomcat管理器,而这些请求不是来自我的IP。
到目前为止,我发现在server.xml中添加一个Valve,如下所示:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="IP"/>
将阻止所有请求,除了来自"IP"的请求到整个Tomcat(包括Web应用程序)。有人知道如何做同样的事情,但只适用于Tomcat管理器吗?
顺便说一下,我用的是Tomcat7。
在[tomcat]/conf/Catalina/[hostname]
中创建一个文件manager.xml
。
因此,如果您的主机名是www.yourdomainname.com
,而tomcat在opt/tomcat7/
,则为:
/opt/tomcat7/conf/Catalina/www.yourdomainname.com/manager.xml
在这个新创建的manager.xml
中,您将RemoteAddrValve
放在上下文中:
<Context antiResourceLocking="false" privileged="true" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1|11.22.33.44" denyStatus="404" />
</Context>
用管道字符分隔多个ip地址。
我选择denyStatus=404
,这样可能的入侵者就不会知道那里甚至存在一个经理。
重新启动Tomcat。
更新3/2020
如果Tomcat位于代理服务器后面,那么所有请求都将来自该代理服务器,因此您需要告诉代理服务器将远程地址转发给Tomcat(在Nginx中,您将包括一行proxy_set_header x-forwarded-for $remote_addr;
)。
此外,您需要告诉Tomcat通过在Engine或Host块中包含RemoteIpValve
来监视转发的标头:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
requestAttributesEnabled="true" />
在Tomcat8中,我发现RemoteAddrValve已经在C:Program FilesApache Software FoundationTomcat 8.0webappsmanagerMETA-INFcontext.xml
中,我只需要取消注释它…
<Context antiResourceLocking="false" privileged="true" >
<!--
Remove the comment markers from around the Valve below to limit access to
the manager application to clients connecting from localhost
-->
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>
我在阀门中添加了@acdhirr的建议,拒绝了denyStatus="404"
的状态,这也起到了作用。