Tomcat 使用过滤器阻止 IP 地址

通常您使用 .htaccess 来允许或阻止特定 IP 访问您的网站。这会随着 Java 托管而改变。当部分或全部请求被代理到 Tomcat 时,.htaccess 将无法为它们工作,因为根本不会咨询此类请求。

如果是这种情况,您需要在 Tomcat 级别阻止 IP。可用于web.xml您的 Web 应用程序或全局应用程序的示例 IP 过滤器如下:

<filter>
  <filter-name>Remote IP Filter</filter-name>
  <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
  <init-param>
   <param-name>deny</param-name>
   <param-value>172\.20\.\d+\.\d+</param-value>
  </init-param>```
    
  <init-param>
    <param-name>denyStatus</param-name>
    <param-value>404</param-value>
  </init-param>
</filter>
   
<filter-mapping>
  <filter-name>Remote IP Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
        <filter-name>Remote IP Filter</filter-name>
        <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>

        <init-param>
            <param-name>allow</param-name>
            <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.11\.12\.\d+</param-value>
        </init-param>


        <init-param>
            <param-name>denyStatus</param-name>
            <param-value>404</param-value>
        </init-param>
    </filter>

如您所见,正则表达式可用于允许和拒绝参数值。这将允许您阻止所有 IP 范围。如果您跳过denyStatus参数,将使用其默认值 403。您可以定义多个过滤器并将它们应用于特定的 URL/servlet。定义过滤器后重新启动 Tomcat。

阅读Apache Tomcat 7 Configuration Reference (7.0.109) - Container Provided Filters ,了解您可以使用的不同类型的过滤器。

远程地址过滤器
介绍

远程地址过滤器允许您将提交此请求的客户端的 IP 地址与一个或多个 正则表达式进行比较,并允许请求继续或拒绝处理来自此客户端的请求。

正则表达式的语法与“标准”通配符匹配的语法不同。Tomcat 使用该java.util.regex 软件包。有关支持的表达式的详细信息,请参阅 Java 文档。

注意:使用 IPv6 地址过滤器时需要注意。此 Valve 正在处理的 IP 地址的格式取决于用于获取它的 API。如果地址是使用 Inet6Address 类从 Java 套接字获取的,则其格式为 x:x:x:x:x:x:x:x. 也就是说,localhost 的 IP 地址将0:0:0:0:0:0:0:1代替更广泛使用的 ::1. 请查阅您的访问日志以了解实际值。

另请参阅:远程主机过滤器

过滤器类名称

远程地址过滤器的过滤器类名称是 org.apache.catalina.filters.RemoteAddrFilter 

参数初始化

远程地址过滤器支持以下初始化参数:

属性描述
allow

与远程客户端的 IP 地址进行比较的正则表达式(使用java.util.regex)。如果指定了这个属性,远程地址必须匹配这个请求才能被接受。如果未指定此属性,则将接受所有请求,除非远程地址与deny 模式匹配。

deny

与远程客户端的 IP 地址进行比较的正则表达式(使用java.util.regex)。如果指定了这个属性,远程地址不能匹配这个请求才能被接受。如果未指定此属性,则请求接受仅由该accept属性控制。

denyStatus

拒绝拒绝请求时使用的 HTTP 响应状态代码。默认值为403。例如,它可以设置为 value 404

例子

仅允许从 localhost 连接的客户端访问:

    <filter>
      <filter-name>Remote Address Filter</filter-name>
      <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
      <init-param>
        <param-name>allow</param-name>
        <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>Remote Address Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

您可以通过编写实现javax.servlet.Filter的类来自由地在 Java 中构建自己的过滤器。这是一个简单的 IP 过滤器示例 HOWTO。

  • 创建webapps/ROOT/WEB-INF/classes/net/jvmhost/test目录。
  • 保存IPFilter.java在目录中,内容如下:
package net.jvmhost.test;```

import java.io.IOException;
import java.util.StringTokenizer;
import javax.servlet.*;
import javax.servlet.http.*;
    
public class IPFilter implements Filter {
  private FilterConfig config;
  // the regex must define whole string to match - for example a substring without .* will not match
  // note the double backslashes that need to be present in Java code but not in web.xml
  private String IP_REGEX = "172\\.20\\.\\d+\\.\\d+.*";
  // private String IP_REGEX = "172\\.20\\..*";
  public void init(FilterConfig filterConfig) throws ServletException {```
this.config = filterConfig;
    // optionally you can get regex from init parameter overwriting the class' private variable
    IP_REGEX = config.getInitParameter("IP_REGEX");
  }
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String ip = request.getRemoteAddr();
    HttpServletResponse httpResp = null;
    if (response instanceof HttpServletResponse) httpResp = (HttpServletResponse) response;
    if (ip.matches(IP_REGEX)) {
      httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,"Your own message 403 Forbidden");
    } else {
      chain.doFilter(request, response);
    }
  }
  public void destroy() {}
}
  • 在包含上述文件的目录中编译它:
javac -cp ~/appservers/apache-tomcat-7.0.28/lib/servlet-api.jar IPFilter.java
  • 最后加入ROOT/WEB-INF/web.xml
<filter>
  <filter-name>Custom Remote Address Filter</filter-name>
  <filter-class>net.jvmhost.test.IPFilter</filter-class>
  <init-param>
    <param-name>IP_REGEX</param-name>
    <param-value>172\.20\.\d+\.\d+</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Custom Remote Address Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  • 重新启动 Tomcat 并测试过滤器。

所有路径、IP 和正则表达式都是示例,需要根据您的环境和需求进行定制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值