SSH 动态隧道(包括 PuTTY 的动态转发)提供的是 SOCKS 接口。只接受 HTTP 代理的应用,不能仅仅因为把那个端口叫作 HTTP 就能使用它。

两者之间可以放一个本地协议桥。应用把 HTTP 代理请求发给桥,桥再通过 SOCKS 服务打开到目标地址的连接。

Privoxy 用它的转发规则记录了这种安排。对于已存在的本地 SOCKS5 隧道,一段配置是:

forward-socks5 / 127.0.0.1:1080 .

应用连接的是 Privoxy 的 HTTP 监听端口,而不是 1080 端口。应按预期访问策略保持该监听端口处于本地。规则末尾的点有文档记载的含义,它不是缺失互联网主机名的占位符。

这是协议转换

Privoxy 的转发文档解释了 SOCKS 转发的语法和主机名处理方式。普通的 TCP 端口转发并不做同样的转换:它把客户端的 HTTP 字节原样送到 SOCKS 监听端,而对方仍然期待进行 SOCKS 协商。

桥本身也成了你需要理解的那部分配置。Privoxy 可能带有自己的内容过滤和访问设置。加入它,并不等于让原应用原生支持 SOCKS。

对 HTTPS 网站,应用通常向 HTTP 桥请求 CONNECT,桥再通过 SOCKS 取得目标连接。网站的正常 TLS 仍是应用与网站之间的关系;桥不需要冒充网站来提供这条路径。

如果应用能直接使用 SOCKS,多出来的组件可能没有必要。用桥去解决真实的协议不匹配问题,并把监听端和上游清楚区分开。

相关文章