Java 和 squid 代理主机名解析
Java and squid proxy hostname resolution
我正在为 ftp 连接使用 squid 代理。在 squid 代理上,我们有基于主机名的规则,问题是 java 在本地进行主机名解析,然后将原始 IP 传递给代理。
所以示例代码:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(new InetSocketAddress("google.com", 21));
正在创建这样的请求:
CONNECT 172.217.23.142:21 HTTP/1.1
User-Agent: Java/14.0.1
Host: 172.217.23.142:21
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
所以 google.com
在 CONNECT 请求中已经转换为 172.217.23.142。有什么方法可以强制 java.net.Proxy 在打开与代理服务器的通信时使用主机名?
我们用于 ftps 连接的 JSch 库默认使用 ProxyHTTP
class 执行此操作,我基本上需要与 java.net.Proxy
.[=16= 相同]
在Socket.connect
中使用未解析套接字地址:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(InetSocketAddress.createUnresolved("google.com", 21));
connect
方法将使用已解析的 IP 地址。您可以在 implementation of HttpConnectSocketImpl
:
中看到
final InetSocketAddress epoint = (InetSocketAddress)endpoint;
String destHost = epoint.isUnresolved() ? epoint.getHostName()
: epoint.getAddress().getHostAddress();
final int destPort = epoint.getPort();
我正在为 ftp 连接使用 squid 代理。在 squid 代理上,我们有基于主机名的规则,问题是 java 在本地进行主机名解析,然后将原始 IP 传递给代理。
所以示例代码:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(new InetSocketAddress("google.com", 21));
正在创建这样的请求:
CONNECT 172.217.23.142:21 HTTP/1.1
User-Agent: Java/14.0.1
Host: 172.217.23.142:21
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
所以 google.com
在 CONNECT 请求中已经转换为 172.217.23.142。有什么方法可以强制 java.net.Proxy 在打开与代理服务器的通信时使用主机名?
JSch 库默认使用 ProxyHTTP
class 执行此操作,我基本上需要与 java.net.Proxy
.[=16= 相同]
在Socket.connect
中使用未解析套接字地址:
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(InetSocketAddress.createUnresolved("google.com", 21));
connect
方法将使用已解析的 IP 地址。您可以在 implementation of HttpConnectSocketImpl
:
final InetSocketAddress epoint = (InetSocketAddress)endpoint;
String destHost = epoint.isUnresolved() ? epoint.getHostName()
: epoint.getAddress().getHostAddress();
final int destPort = epoint.getPort();