繁体   English   中英

Java 袜子代理使用本地 DNS

[英]Java socks proxy uses local DNS

我正在尝试通过 SOCKS 代理连接到 oracle 数据库,因为我无法直接访问 oracle 服务器。 因此,我在端口 4000 上打开我的代理,并将这些选项添加到我的应用程序中:

-DsocksProxyHost=localhost -DsocksProxyPort=4000

现在,如果我在连接字符串中使用 oracle 服务器的主机名启动我的应用程序,那么我会得到一个“指定的未知主机”。 如果我使用 IP 地址而不是主机名,则连接成功。 我猜 java 正在尝试使用我的本地 DNS 而不是远程 DNS 来解析主机名。 如何使用远程 DNS?

在当前的 OpenJDK 实现中,您可以使用不受支持的解决方法。 它可能会在未来的版本中被删除。 SOCKS 实现确实支持远程 DNS 查找。 但是,这仅适用于未解析的 InetSocketAddress 对象。 不幸的是,URL.openConnection 使用的 NetworkClient 类总是尝试解析 InetSocketAddress,即使在使用 SOCKS 时也是如此。 您可以使用一个技巧来防止本地名称解析。

将(内部)系统属性 jdk.net.hosts.file 设置为文件名,通过使用 -Djdk.net.hosts.file=some_file 命令行参数,或通过尽早从代码中设置属性(主程序中的第一件事) . 这必须在执行内部 NameService 类初始化程序之前完成,否则这将不起作用:

System.setProperty("jdk.net.hosts.file", "some_file");

在当前基于 OpenJDK 的 Java 运行时中,这会将域名解析更改为该文件,而不是通常的 DNS。 缺少条目或不存在的主机文件会导致无法解析的 InetSocketAddress。 这正是我们在这里需要的,因为 SOCKS 实现现在将使用远程 DNS。

但是请注意,您的代理服务器的解析将不再起作用,因此您必须改为指定代理服务器的 IP 地址。 您还可以将代理服务器添加到 some_file。 您的应用程序中可能需要的其他 DNS 解析也将不起作用。

这是 jvm 的一个错误,似乎没有立即修复它的计划。

袜子真的很旧。 没有广泛部署在现代基础设施中。 将优先级降低到 P4。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM