【问题标题】:How to use hostnames instead of IPs in jetty?如何在码头中使用主机名而不是 IP?
【发布时间】:2016-04-30 21:13:00
【问题描述】:

我在码头中使用IPAcccessHandler 来限制对来自某些域的请求的访问。但是,我真的遇到了两个问题:

1- IPAccessHandler 似乎只接受白名单或黑名单的 IP,尽管 Javadocs 表示可以通过 URL 阻止。这是我的 jetty-ipaccess.xml 的 XML sn-p:

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

现在,如果我运行 jetty,我会收到以下异常(即 jetty 无法启动):

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

到目前为止,我已经尝试了两天,但没有任何运气!非常感谢任何帮助!

【问题讨论】:

    标签: java jetty


    【解决方案1】:

    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]
    

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

    而你今天看到的结果,很可能以后会有所不同。

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

    在使用主机名进行访问控制有意义的情况下,主机名和 IP 之间没有 1::1 的关系。

    即使您将主机名添加到配置端,您也需要在每个请求中查询该主机名的 ips,以了解传入请求的 IP 是否现在 strong> 允许或拒绝。这是一项成本太高而无法执行的活动。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多