使用 Perl 的 SOCKS 代理上的 DNS

Posted

技术标签:

【中文标题】使用 Perl 的 SOCKS 代理上的 DNS【英文标题】:DNS over SOCKS proxy with Perl 【发布时间】:2017-11-19 22:54:40 【问题描述】:

我正在尝试编写一个通过 SOCKS5 代理发送请求的脚本。 我想做的是通过 SOCKS 代理 DNS 请求。我设法使用 IO::Socket::Socks 模块来做到这一点。

此代码允许我连接到 SOCKS 代理,然后通过 SOCKS 解析主机名,然后再连接到它。

use strict;
use warnings;
use IO::Socket::Socks;

my $sock = IO::Socket::INET->new("127.0.0.1:9050") or die $@;
$sock = IO::Socket::Socks->start_SOCKS($sock, ConnectAddr => "example.com", ConnectPort => 80) or die $SOCKS_ERROR;

$sock->syswrite ("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n");
$sock->close();

这很好用。但是,我想向用户展示 IP 已解析,我正在努力实现这一点,因为对于 $sock 对象,它似乎将对等方视为 SOCKS 代理主机,而不是真正的最终主机。

有谁知道我如何通过 SOCKS 检索从这个 DNS 解析的 IP?

谢谢!

【问题讨论】:

【参考方案1】:

此代码允许我连接到 SOCKS 代理,然后通过 SOCKS 解析主机名,然后再连接到它。

不是真的。它连接到 SOCKS 代理,然后按名称连接到给定的主机。它不会通过 SOCKS 解析主机名。相反,解析是在 SOCKS 服务器内部完成的,只是为了连接到给定的主机,而不是“通过 SOCKS”完成。事实上,SOCKS 服务器甚至可能有一个上游 SOCKS 服务器,它只是将连接转发到该服务器,而无需自行解析主机名。

此外,没有反向通道让 SOCKS 客户端知道 SOCKS 服务器解决了什么问题。这不是必需的,因为作为代理的任务不需要这种连接细节。

【讨论】:

感谢您的解释。所以你说的是两步连接,对吗?客户端连接到 SOCKS 代理并说“请连接到此主机和此端口”,由 SOCKS 代理负责,但从未真正告诉客户端有关第二个连接的任何信息。鉴于此,将无法检索已解析的 IP,这是您的意思吗?谢谢

以上是关于使用 Perl 的 SOCKS 代理上的 DNS的主要内容,如果未能解决你的问题,请参考以下文章

DNS 的 SOCKS5 代理如何在浏览器中工作?

无法通过 perl 中的 socks 代理连接到主机

红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)

红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)

为啥 Windows 上的 IE/Chrome 不支持端口 27977 上的 SOCKS5 代理? [关闭]

JSch 是不是支持 SOCKS5 代理?