Tomcat 使用过滤器阻止 IP 地址

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

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


  Remote IP Filter
  org.apache.catalina.filters.RemoteAddrFilter
  
   deny
   172\.20\.\d+\.\d+
  ```
    
  
    denyStatus
    404
  

   

  Remote IP Filter
 /*

        Remote IP Filter
        org.apache.catalina.filters.RemoteAddrFilter

        
            allow
            127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.11\.12\.\d+
        


        
            denyStatus
            404
        
    

如您所见,正则表达式可用于允许和拒绝参数值。这将允许您阻止所有 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 连接的客户端访问:

    
      Remote Address Filter
      org.apache.catalina.filters.RemoteAddrFilter
      
        allow
        127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1
      
    
    
      Remote Address Filter
      /*
    

您可以通过编写实现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

  Custom Remote Address Filter
  net.jvmhost.test.IPFilter
  
    IP_REGEX
    172\.20\.\d+\.\d+
  


  Custom Remote Address Filter
  /*
  • 重新启动 Tomcat 并测试过滤器。

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

你可能感兴趣的:(tomcat,tcp/ip,servlet)