2016-01-24 100 views
0

我在码头使用IPAcccessHandler来限制对来自特定域的请求的访问。然而,我真的坚持两个问题:如何在码头使用主机名而不是IP?

1-似乎IPAccessHandler只接受IP到白名单或黑名单,虽然它是Javadocs说,可以阻止URL。这是我的码头,ipaccess.xml的XML片段:

<Set name="black"> 
    <Array type="String"> 
     <Item>google.com</Item> 
    </Array> 
    </Set> 

现在,如果我跑码头我得到下面的异常(即码头无法启动):

Caused by: java.lang.IllegalArgumentException: Invalid IP address pattern: google.com 

但是,如果我使用IP地址(例如127.0.0.1),然后码头开始罚款。

2-现在说我通过阻止访问IP 127.0.0.1开始码头,那么如果我尝试在我的浏览器中请求127.0.0.1,我会得到正确的禁止错误。位,如果我尝试请求http://localhost,然后我得到这个错误:

HTTP ERROR: 500 

Problem accessing /. Reason: 

    java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1 

我一直试图两天到目前为止没有任何的运气!任何帮助深表感谢!

回答

0

IPAccessHandler只使用IP地址,因此它的名称。

使用使用主机名作为IPAccessHandler端的配置或传入请求端的验证将会非常低效(和错误)。

让我们用这个java代码来探索我的意思。

package net; 

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class MultiDns 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      String hostname = "www.google.com"; 
      System.out.printf("Hostname: %s%n",hostname); 
      for (InetAddress addr : InetAddress.getAllByName(hostname)) 
      { 
       System.out.printf(" - %s [%s]%n",addr.getHostAddress(),InetAddress.getByAddress(addr.getAddress()).getHostName()); 
      } 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

这一查表google.com我的结果显示如下...

Hostname: www.google.com 
- 74.125.25.106 [pa-in-f106.1e100.net] 
- 74.125.25.99 [pa-in-f99.1e100.net] 
- 74.125.25.104 [pa-in-f104.1e100.net] 
- 74.125.25.147 [pa-in-f147.1e100.net] 
- 74.125.25.105 [pa-in-f105.1e100.net] 
- 74.125.25.103 [pa-in-f103.1e100.net] 
- 2607:f8b0:400e:c00:0:0:0:67 [pf-in-x67.1e100.net] 

由于我住在亚利桑那州,我得到了上述结果,但如果你住在欧洲,还是亚洲(例如),你会得到不同的结果。

而今天看到的结果可能稍后会有所不同。

此外,当您将从查询返回的IP返回到google.com时,您会看到无法从这些IP解析google.com(它们返回的结果为1e100.net addresses)。

在使用主机名进行访问控制的意义上,主机名与IP之间不存在1 :: 1关系。

即使你添加主机名配置方面,你需要查询该主机名它对每一个请求 IPS 知道,如果传入的请求的IP是现在允许或拒绝。这对于要执行的活动而言成本太高。

您可能会认为Jetty只能使用dns请求的ttl/expiration来限制它为该域执行dns查询的次数。唉,Java不能访问dns响应的ttl信息。

相关问题