代理服务器搭建详解,如何搭建TCP代理?

使用Netcat探测DNS请求
当数据包通过你的便携式计算机时,我们已使用Wireshark对其进行被动检查 。现在,我们将使用另一种称为netcat的工具来主动监听传入的DNS请求,甚至发送回基本的DNS响应,这将允许你的手机再次开始与部分互联网进行连接 。
Netcat是一个读写TCP和UDP网络连接数据的工具,如上所述,你的智能手机通过UDP端口53发送DNS请求,要使用netcat监听这些请求,请运行以下命令:
sudo ncat -nluvvv 53
在一个终端,该命令需要以sudo身份运行,因为它监听的是一个编号较低的敏感端口 。
现在,当你试图用智能手机访问一个网站时,你应该会看到一个DNS请求打印在你的笔记本电脑的终端上 。由于该请求并不是为方便人类阅读而设计的,因此它在大多数情况下看起来都像是乱码 。然而,你应该仍然能够在其中找出你试图访问的网站的主机名 。

代理服务器搭建详解,如何搭建TCP代理?

文章插图
你可能需要停止并启动ncat监听器几次才能使其正常工作,如果你仍然无法使其正常运行,那么只要你的智能手机发送的数据包出现在Wireshark中,你就不必担心 。
现在,我们已经使用Wireshark和Netcat检查了你的智能手机的DNS请求 。但是,你的笔记本电脑仍然不知道如何响应 。它不会将DNS响应发送回你的智能手机,因此你的智能手机仍然无法实际加载你要访问的页面 。不过,你可以使用netcat的一个更高级的选项发送回DNS响应 。
使用Netcat发送回DNS响应
ncat UDP监听器具有–exec选项,你可以使用–exec指定当UDP监听器接收到数据包时netcat应该运行的命令 。Netcat将数据包的内容输入到stdin上–exec指定的命令中,并将命令写入标准输出的任何输出发送回数据包的原始发送者 。例如,为了在监听器收到UDP数据包时运行Python脚本,可以运行:
sudo ncat -nluvvv --keep-open --exec \"/usr/bin/python /PATH/TO/THE/SCRIPT.py\" 53
让我们使用–exec响应智能手机的DNS请求,将以下Python脚本保存到笔记本电脑上 。
import sys
\\# Read the first 2 bytes from the DNS request that netcat
\\# is piping in on stdin. These byte are the request ID and
\\# must be included at the start of the response so that the
\\# requester can match the response up with its original request
req_id = sys.stdin.read(2)
\\# Convert the bytes to hex
req\\_id\\_hex\\_str = \'\'.join(\\[\"%02X\" % ord(c) for c in str(req\\_id)\\])
\\# This is hex for the DNS response body \"robertheaton.com
\\# is at IP address 104.18.32.191\". To give yourself some
\\# confidence that I\'m telling the truth, run:
#
\\# python -c \"print bytearray.fromhex(\'$COPY\\_THE\\_HEX\\_STRING\\_HERE\')\"
#
\\# in a terminal.
resp\\_body\\_str = \"818000010002000000000c726f62657274686561746f6e03636f6d0000010001c00c000100010000012b0004681220bfc00c000100010000012b0004681221bf\"
该脚本将我从Wireshark复制并粘贴的标准硬编码的,预先生成的DNS响应输出到stdout 。此硬编码的响应告诉请求者(你的智能手机)robertheaton.com解析为IP地址104.18.32.191 。为了确保请求者可以将我们的响应与原始请求匹配,脚本将读取请求的前2个字节(表示DNS请求ID),并将其添加到主响应正文中 。之所以必须这样做,是因为UDP是无连接协议,并且不会为你的智能手机提供任何内置方式来将DNS响应与请求进行匹配 。
你应该验证DNS响应十六进制字符串确实是我所声称的,你可以通过在终端中运行以下命令来确认响应是无害的:
python -c \"print bytearray.fromhex(\'$COPY\\_THE\\_HEX\\_STRING\\_HERE\')\"