使用 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的主要内容,如果未能解决你的问题,请参考以下文章
红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)
红蓝对抗之隧道技术第二篇(reGeorg内网穿透SSH隧道本地Socks代理SSH远程转发Earthworm Socks5代理Tunna正向代理ICMP隧道DNS隧道Frp穿透)