经 SSH 转发的端口不一定是 SOCKS 代理
在配置应用之前,先区分 SSH 的固定本地转发与动态 SOCKS 监听。
你建好一条 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 转发已有代理 则会保留该代理的协议和账号。