socat SOCKS 桥接:保留网站的 TLS 主机名
为一个 SOCKS 目的地使用回环 TCP 监听器,同时在应用中保留 HTTP 与 TLS 身份。
应用没有 SOCKS 选项,但可以连接到选定的 TCP 地址。固定目标的适配器可以为单个目的地提供 SOCKS 会话。它不必再成为一个通用正向代理。
对于提供 SOCKS4A 的 socat 构建,一种示例配置是:
socat TCP4-LISTEN:9443,bind=127.0.0.1,reuseaddr,fork \
SOCKS4A:127.0.0.1:service.example.net:443,socksport=1080
SOCKS 端点是本地端口 1080。适配器监听本地端口 9443,并向该端点请求 service.example.net:443。这些是示例值,并非完整的服务部署。
适配器只有一个固定目标
每个被接受的 TCP 连接都请求同一个服务。连接到 9443 的应用提供其常规协议字节;socat 提供 SOCKS4A 协商。向 9443 发送新的 HTTP CONNECT 请求不会选择其他目的地,而是会把这些字节继续发往固定服务。
SOCKS4A 把主机名交给 SOCKS 端点做远端解析。这与使用客户端所选地址的 SOCKS4 形式不同。所选上游——包括来自 SOCKS4 代理列表的公共候选——必须支持 SOCKS4A 主机名处理和所需的身份验证;此示例不是 SOCKS5 密码登录配方。
本地连接,识别真正的服务
把 HTTPS URL 改为 https://127.0.0.1:9443/ 会改变客户端可用于 TLS 和 HTTP 的主机名。service.example.net 的证书不会变成对 loopback 有效的证书。
当客户端支持单独的连接路由时,请保留原始 URL 的身份。Curl 可以说明这一区别:
curl --noproxy '*' \
--connect-to service.example.net:443:127.0.0.1:9443 \
https://service.example.net/
套接字发往本地适配器,而 TLS 校验和 HTTP 目的地仍是 service.example.net。其他应用需要它们各自支持的等效控制;并非每个客户端都提供。
回环绑定限制网络暴露,但其他符合条件的本地进程仍可访问它。请让服务寿命和使用者保持适当。保留 TLS 校验,而不是压制由 loopback URL 引起的身份错误。