`ssh -D` 是否代理 DNS 请求?

`ssh -D` 是否代理 DNS 请求?

当我使用使用创建的 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 查找

如何使用 Firefox mozilla-kb

相关内容