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

Siy*_*Ren 6 ssh openssh ssh-tunneling

当我使用创建的 SOCKS 代理时,DNS 解析是否通过隧道传输到另一端ssh -D?我已经阅读了手册,在互联网上搜索,但没有找到相关的文档。

Fre*_*ord 5

您的应用程序可以使用SOCKS代理来解析名称所指示的 位置

如果您问 系统范围的查找是否通过隧道进行,那么答案是否定的

如果你控制了服务器端,那么你可以在客户机上指示启动UDP到TCP代理 在这里

socat -T15 udp4-recvfrom:53,reuseaddr,fork tcp:localhost:5353
Run Code Online (Sandbox Code Playgroud)

然后通过 SSH 将 TCP 连接转发到您启动 TCP-to-UDP 守护进程的服务器:

socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Run Code Online (Sandbox Code Playgroud)

理所当然地,您可能对此不以为然。幸运的是,有 SSHuttle(例如这里提到的 )。有一个补丁可以轻松转发 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
Run Code Online (Sandbox Code Playgroud)


try*_*lly 4

通过 Socks 的 DNS 解析由客户端决定。您必须明确告诉应用程序通过 Socks 查找 DNS。

名称解析就像连接到主机一样,由gethostbyname()或等系统调用完成getaddrinfo()

除非另有说明,程序可能只使用此函数进行名称解析,当然,它不知道您的隧道。

例如,curl 仅在指定时查找 DNS socks5h://,而不仅仅是socks5://.