你建好一条 SSH 隧道,把 127.0.0.1 及其端口填进浏览器的代理设置,却什么都加载不出来。监听器也许工作得完全正常。它可能只是在等待错误的流量类型。

转发本地应用发送的内容目标的选择
-L目标服务的常规协议在 SSH 命令中固定
-D先进行 SOCKS 协商,然后才是应用流量由 SOCKS 客户端请求

对于单个 Web 服务器,这是固定转发:

ssh -N -L 127.0.0.1:9080:web.example.com:80 [email protected]

把 http://127.0.0.1:9080/ 当作网站访问。不要把 9080 端口标为 SOCKS:它把字节转发给命令中指定的那一台 Web 服务器。用其他主机名打开站点,还可能影响它的虚拟主机、重定向或 Cookie。

而对于SOCKS 监听器,形式就变了:

ssh -N -D 127.0.0.1:1080 [email protected]

把应用配置为在 127.0.0.1:1080 上使用 SOCKS。直接把这个地址敲进浏览器地址栏,等于把 Web 请求发给 SOCKS 监听器,又是一次协议不匹配。

OpenSSH 手册 记录了这两种形式。有一个有用的例外:用 -L 转发一个已有的 HTTP 代理,会得到一个说 HTTP 代理协议的本地端口,因为它的固定目标本身就是 HTTP 代理。固定转发里适合放什么,由远端服务决定。通过 SSH 转发已有代理 则会保留该代理的协议和账号。

相关文章