
我想設定我的 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 隧道」來指稱
tun
SSHtap
。 - 連接埠轉送是隧道的一種特定形式,但在本文中仍應僅稱為「連接埠轉送」。
- 除快速臨時作業外, 請勿使用 SSH 隧道(如
-oTunnel
和中所示)。-oTunnelDevice
- TCP over TCP 是一個非常糟糕的主意:
- TCP 上的 UDP 大大增加了通常使用它的應用程式的延遲。使用 UDP 的程式應該完全控制自己的可靠性和擁塞控制,就像 RTP 的情況一樣。
- DNS 可以使用 TCP 作為傳輸。它不限於 UDP,儘管這是首選運輸。
答案2
使用穿梭反而? sshuttle 聲稱可以正確處理 DNS 和 TCP,無需大量的擺弄 - 只是--dns
選項。
IME SOCKS 看起來有點舊而且不受歡迎。而且我不太明白 ipfw 和 redsocks 的這種用法。
不過我要指出的是,SOCKS4 不支援隧道 DNS,所以我對您遇到問題並不感到驚訝。 SOCKS的後續版本確實支援它,所以你可以看看。 顯然 SSH 可以支援 SOCKS5。
答案3
除了您已經使用的功能之外,sSH 還允許透過隧道傳輸所有 IP 流量,獨立於所使用的第 4 層協定。您的遠端伺服器必須具有該指令PermitTunnel yes
,且用戶端必須使用該指令請求隧道Tunnel
。然後您可以使用該新連結作為預設網關。看隧道的詳細說明請參閱此處。