当我使用使用创建的 SOCKS 代理时,DNS 解析是否会通过隧道传输到另一端ssh -D
?我已经阅读了手册,并在互联网上进行了搜索,但没有找到相关文档。
答案1
通过 Socks 进行 DNS 解析由客户端决定。您必须明确告知应用程序通过 Socks 查找 DNS。
名称解析就像连接到主机一样,由系统调用完成,例如gethostbyname()
或者getaddrinfo()
。
除非另有说明,程序可能只使用此函数进行名称解析,当然,它不知道您的隧道。
例如,curl 仅在指定时查找 DNS socks5h://
,而不仅仅是socks5://
.
答案2
您的应用程序可以使用 SOCKS 代理来解析所示的名称 这里。
如果你问是否 系统范围的查找是通过隧道进行的,那么答案就是不。
如果您控制服务器端,那么您可以在客户端上启动 UDP 到 TCP 代理,如下所示 这里:
socat -T15 udp4-recvfrom:53,reuseaddr,fork tcp:localhost:5353
然后通过 SSH 将 TCP 连接转发到您启动 TCP 到 UDP 守护进程的服务器:
socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
你可能会对此感到皱眉,这是理所当然的。幸运的是,有 SSH穿梭机(例如提到的 这里)。有一个补丁可以轻松转发 DNS 查询。
YMMV,但我在以下方面取得了成功:
#!/bin/bash
# Taken from http://stackoverflow.com/questions/4594319/shell-replace-cr-lf-by-comma
DNSSERVERS=$(nmcli d show | grep DNS | awk '{print $2}' | sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d' )
sshuttle \
-vvv \
--dns-hosts ${DNSSERVERS} \
-r server \
254.254.254.254/32
答案3
ssh -D 工作于(通过 man ssh)
指定本地“动态”应用程序级端口转发。这是通过分配一个套接字来侦听本地端的端口来实现的
那么什么是套接字呢? 通过
套接字只是通信的逻辑端点。它们存在于传输层。您可以在套接字上发送和接收内容,可以绑定和侦听套接字。套接字特定于协议、机器和端口,并在数据包的标头中进行寻址。
和
客户端能够通过套接字代理执行 DNS 查找