Javasocks代理使用本地DNS

标签 java proxy socks

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

-DsocksProxyHost=localhost -DsocksProxyPort=4000

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

最佳答案

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

通过使用 -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 解析也不起作用。

关于Javasocks代理使用本地DNS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44369862/

相关文章:

Python 套接字.gaierror : [Errno 11001] getaddrinfo failed

java - 停止后续 JOptionPane 的排队

java - 在 Java 下从 Mach-o 二进制文件获取 UUID?

Apache 2.4 转发代理配置问题

http - 具有身份验证支持的轻量级转发代理

python - 在 Unirest 中使用代理

php - 如何将 SOCKS 5 代理与 cURL 一起使用?

java - 为什么此 Java 代码会生成错误?

java - GWTP 中的模型 - 引发变更事件

python - 如何检查 SOCKS 服务器是否正常工作?