我想要设置我的 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
- TCP over TCP 是一个非常糟糕的想法:
- TCP 上的 UDP 会大大增加通常使用它的应用程序的延迟。使用 UDP 的程序应该完全控制自己的可靠性和拥塞控制,例如 RTP 的情况。
- 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
。然后,您可以将该新链接用作默认网关。请参阅这里有关于隧道的详细说明。