http协议的代理和Socks5协议的代理

这个问题只能算作是记录,我目前也不知道具体产生的原因。我知道curl指令默认情况下不会通过socks5解析域名,所以测试的时候我需要使用socks5h。但是http不存在这个问题,使用http协议时,会将url发送到代理的服务端去解析(实际上,这个问题我还没有从原理层面理解)。

所以,我想将kt的socks5代理转为http代理,当我这样实践的时候,我已经可以确保我的curl工具是按照我的想法成功的访问我的服务的。但是,将访问服务的代码移动到Java代码中时,一切都发生了变化,始终报无法正确的解析hostname(我使用了Proxifier工具,Proxifier可以全局代理应用的流量,我想不修改代码,就完成网络环境的切换)。

后来经过分析我发现,我的Java代码在访问的时候,一定需要先将我的url解析成ip地址,然后再通过Proxifier去访问我的代理服务器,这肯定是我不想要的(我已经设置了Proxifier的域名解析,但是没有任何效果)。在我的理解中,我的代码应该将url的解析也交给我的代理服务器实现。

最后我偶然发现将协议换成socks5的话,该问题不存在,我的url可以正常的通过我的代理服务器解析。

这件事只能说用暴力破解法,挨个挨个试不同的方案,然后得出的结果,没有任何有价值的知识收获。

我在解决这个问题时用了如下的方案,但是这些方案实操都挺复杂而且还有问题,不是很容易推广:

  1. 在Linux虚拟机上用CoreDNS搭一个DNS服务器,然后给开发机配多一个DNS。实践的过程中发现Win只会在首选DNS服务器无法正常访问时才启用备用DNS,如果首选DNS服务器返回错误信息,并不会向备用DNS服务器请求。

  2. 打算走OpenVPN方案,但是运维组卡死了权限,什么都做不了。

  3. 切换RestTemplate底层的实现,失败了,无论是okHttp还是HttpClient都存在这个问题。

  4. 切换kt为vpn模式,失败了,无论如何都无法正常启动。

研究的过程中使用了如下资料:

  1. HttpClient设置DNS
  2. HTTP客户端连接,选择HttpClient还是OkHttp?
  3. Proxies With RestTemplate
  4. 精讲RestTemplate第10篇-使用代理作为跳板发送请求
  5. Name Resolution
  6. Proxifier使用教程