如何在码头中使用主机名而不是 IP?
How to use hostnames instead of IPs in jetty?
我在码头中使用 IPAcccessHandler 来限制对来自特定域的请求的访问。但是,我真的遇到了两个问题:
1- IPAccessHandler
似乎只接受白名单或黑名单的 IP,尽管 Javadocs 表示可以通过 URL 进行阻止。这是我码头的 XML 片段-ipaccess.xml:
<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
),那么 jetty 可以正常启动。
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
到目前为止,我已经尝试了两天,但没有任何运气!非常感谢任何帮助!
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 解析(它们 return 1e100.net
addresses).
的结果
主机名和 IP 之间没有 1::1 关系,在任何意义上使用主机名进行访问控制是有意义的。
即使您将主机名添加到配置端,您也需要在每个请求上查询该主机名的 ips ,以了解传入请求的 IP 是否是 现在 允许或拒绝。 activity 的执行成本太高了。
您可能认为 Jetty 可以只使用 dns 请求的 ttl/expiration 来限制它对该域执行 dns 查询的次数。唉,Java 无法访问 dns 响应的 ttl 信息。
我在码头中使用 IPAcccessHandler 来限制对来自特定域的请求的访问。但是,我真的遇到了两个问题:
1- IPAccessHandler
似乎只接受白名单或黑名单的 IP,尽管 Javadocs 表示可以通过 URL 进行阻止。这是我码头的 XML 片段-ipaccess.xml:
<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
),那么 jetty 可以正常启动。
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
到目前为止,我已经尝试了两天,但没有任何运气!非常感谢任何帮助!
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 解析(它们 return 1e100.net
addresses).
主机名和 IP 之间没有 1::1 关系,在任何意义上使用主机名进行访问控制是有意义的。
即使您将主机名添加到配置端,您也需要在每个请求上查询该主机名的 ips ,以了解传入请求的 IP 是否是 现在 允许或拒绝。 activity 的执行成本太高了。
您可能认为 Jetty 可以只使用 dns 请求的 ttl/expiration 来限制它对该域执行 dns 查询的次数。唉,Java 无法访问 dns 响应的 ttl 信息。