如何在Tomcat中通过来源IP限制对特定URL的访问?

15

我想限制Tomcat Web应用程序中某些URL的访问。只有3个已知的IP地址可以访问符合特定模式的URL。

例如:http://example.com:1234/abc/personId

我该如何实现这一点?


1
你是如何决定是否拒绝或允许访问的?通过IP?通过已登录用户?通过地理区域?为什么要在其中使用iptables?iptables不知道可能正在使用的URL。你的Web服务器运行哪个堆栈,你希望在网络架构的哪个点上拒绝访问? - Cheekysoft
你的问题描述不够清晰。这台机器是一个Web服务器,你正在尝试限制它提供的URL的访问吗?还是这台机器是一个NAT路由器?或者是反向代理? - David Schwartz
通过 IP。我有三个 IP,只需要其中一个访问权限。我想禁止所有其他 IP 使用 API。 - Randeep
@Cheekysoft 实际上我的网站为一些应用程序提供信息。但是有一些API我需要禁止公共访问。 像这样的:http://example.com:1234/abc/(personId)。 - Randeep
@DavidSchwartz 是的,这是一个网络服务器。是的,我想要拒绝一些公开提供的API URL。 - Randeep
显示剩余2条评论
4个回答

12

我的URL以端口开头!对我来说不起作用。我在server.xml中添加了以下行: <filter> <filter-name>远程地址过滤器</filter-name> <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class> <init-param> <param-name>allow</param-name> <param-value>122.167.211.31</param-value> ##我的IP </init-param> </filter> <filter-mapping> <filter-name>远程地址过滤器</filter-name> <url-pattern>/abc/*</url-pattern> ## for http://example.com:1234/abc/(personId) </filter-mapping> - Randeep
1
过滤器不是在server.xml中定义的,而是在web.xml中定义的。将其视为普通的servlet过滤器即可。 - Mark Thomas
抱歉,但您的URL以端口开头????而且这个端口不是Tomcat端口吗??您的API是如何在Tomcat上运行的? - Plínio Pantaleão
是的。这是另一个在1024上监听的应用程序。我只是在问题中举了一个示例URL,它将流量定向到Tomcat。但问题是Tomcat 6中没有过滤器选项,所以这不起作用。 :( - Randeep
在Tomcat 6中,您可以使用等效的阀门: http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html#Remote_Address_Filter - Mark Thomas

4
您可以在server.xml文件中使用以下方法来实现此操作:
 <Valve
    className="org.apache.catalina.valves.RemoteAddrValve"
        deny="117.40.83.*,122.224.95.*,119.255.28.*,218.8.245.*,218.85.139.*,219.117.197.*,124.89.39.*,58.18.172.*,180.153.225.*"
        />

(这些是真实的IP地址:所有者,你知道为什么 :-| )但正如您所看到的,它实际上是一个阻止器而不是启用器。更好的解决方案是将Apache HTTPD放在其前面,并使用Deny All和Allow From语句,这将只允许您允许访问服务所需的3个IP地址。

您只能将阀门添加到容器元素(引擎、主机、上下文)中。您可以将它们限制在应用程序的一部分URL中。为此,您需要使用过滤器版本。 - Mark Thomas
值得注意的是,此答案与Tomcat 6有关。在Tomcat 7中,语法已更改,因为整个条目都是正则表达式。 - Chris Haines

3
您可以使用以下方法阻止IP地址,如果您在代理后面:
<Context path="/manager" docBase="manager" reloadable="true" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteIpValve"/>
  <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="<your IP regex>"/>
</Context>

0

我不会限制IP地址访问,原因如下:

  • 在内部地址上进行限制,例如10.0.0.0/24,意味着你隐式地信任整个范围。如果被攻击怎么办?
  • 并非所有客户都能够或者愿意获得静态IP地址,假设你想要允许某些客户访问。
  • 使用代理不支持 x-forwarded-for 标头的网关设备后的客户端只有网关设备的IP地址;信任该IP地址相当于信任网关后的所有人,同样假设您想要给某些客户提供访问权限。

相反的,如果你需要运行一个系统,其中一些调用只能被特定用户访问,我会使用身份验证 - SSL客户端证书对这个目的非常好用。另外,你可以使用类似 OAuth 的东西。


感谢您的回复。问题是我的服务器正在向移动应用程序提供信息。因此,我有很多公共API。我不能将它们从公共区域中屏蔽。但是还有一些私有API。这些API只能从三个内部系统访问。而且我不能添加额外的身份验证机制。 - Randeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接