通过 SSH 隧道进行 DNS

通过 SSH 隧道进行 DNS

我想要设置我的 OSX 系统,使得所有网络流量都通过 SSH 隧道完成。

为此,我编写了一个小脚本,它执行的命令如下:

# setup tunnel
ssh -fN -D 1080 -p 22 user@remote

# start up redsocks
sudo redsocks -c /tmp/redsocks.conf -p /tmp/redsocks.pid

# forward all tcp traffic to tunnel
sudo ipfw add 0010 \
    fwd 127.0.0.1,12345 \
    tcp from me \
    to any not dst-port 12345 \
           not dst-port 1080 \
           not dst-ip REMOTE_IP

我使用 redsocks 为我的 ssh-tunnel 创建 http 代理(这样我就可以转发全部通过 ipfw 将 tcp 流量发送到它),redsocks.conf 如下所示:

base {
    log_debug = on;
    log_info = on;
    log = "file:/tmp/redsocks.log";
    redirector = generic;
}
redsocks {
    local_ip = 127.0.0.1;
    local_port = 55660;
    ip = 127.0.0.1;
    port = 1080;
    type = socks4;
}

到目前为止一切似乎都正常,我的 OSX 系统上的所有 TCP 流量都是通过 ssh 隧道完成的,但问题出在 UDP 流量上,因此 DNS 查询不起作用。

如何使本地计算机上的 DNS 通过 SSH 隧道工作?

答案1

您的ipfw …线路仅转发 TCP 流量。也许添加以下线路?

sudo ipfw add 0011 fwd 127.0.0.1,12345 \
                   udp from me \
                   to any not dst-port 12345 \
                          not dst-port 1080 \
                          not dst-ip REMOTE_IP

添加set -x(用于调试)和set -e(如果任何命令失败则立即失败)也是一个好主意。

  • 通常应该使用术语“SSH 隧道”来指代tun/tap使用 SSH。
  • 端口转发是隧道的一种特定形式,但在这种情况下它仍然应该被称为“端口转发”。
  • 除快速临时工作外, 不要使用 SSH 隧道(如-oTunnel和)。-oTunnelDevice
  • DNS 可以使用 TCP 作为传输协议。它不限于 UDP,尽管 UDP 是首选运输。

答案2

使用穿梭巴士而不是?sshuttle 声称可以正确处理 DNS 和 TCP,无需这么多的摆弄 - 只是一个--dns选项。

IME SOCKS 似乎有点过时,没人喜欢。而且我不太明白 ipfw 和 redsocks 的用途。

不过我要指出的是,SOCKS4 不支持隧道 DNS,因此您遇到问题并不令我感到惊讶。SOCKS 的后续版本确实支持它,因此您可以查看它。 显然 SSH 可以支持 SOCKS5

答案3

除了您已经使用的协议之外,sSH 还允许隧道传输所有 IP 流量,与所采用的第 4 层协议无关。您的远程服务器必须具有隧道,PermitTunnel yes并且客户端必须使用指令请求隧道Tunnel。然后,您可以将该新链接用作默认网关。请参阅这里有关于隧道的详细说明。

相关内容