透過 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 隧道的 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 隧道」來指稱tunSSH tap
  • 連接埠轉送是隧道的一種特定形式,但在本文中仍應僅稱為「連接埠轉送」。
  • 除快速臨時作業外, 請勿使用 SSH 隧道(如-oTunnel和中所示)。-oTunnelDevice
  • DNS 可以使用 TCP 作為傳輸。它不限於 UDP,儘管這是首選運輸。

答案2

使用穿梭反而? sshuttle 聲稱可以正確處理 DNS 和 TCP,無需大量的擺弄 - 只是--dns選項。

IME SOCKS 看起來有點舊而且不受歡迎。而且我不太明白 ipfw 和 redsocks 的這種用法。

不過我要指出的是,SOCKS4 不支援隧道 DNS,所以我對您遇到問題並不感到驚訝。 SOCKS的後續版本確實支援它,所以你可以看看。 顯然 SSH 可以支援 SOCKS5

答案3

除了您已經使用的功能之外,sSH 還允許透過隧道傳輸所有 IP 流量,獨立於所使用的第 4 層協定。您的遠端伺服器必須具有該指令PermitTunnel yes,且用戶端必須使用該指令請求隧道Tunnel。然後您可以使用該新連結作為預設網關。看隧道的詳細說明請參閱此處。

相關內容