Java socks代理使用本地DNS

时间:2017-06-05 13:16:18

标签: java proxy socks

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

-DsocksProxyHost=localhost -DsocksProxyPort=4000

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

这是jvm的bug,似乎没有立即修复它的计划。

  SOCKS真的很老了。未在现代基础设施中广泛部署。将优先级降低到P4。