Skip to the content.

socat

socat TCP-LISTEN:8888,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:5495

socat TCP-LISTEN:8888,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:5495
#     \_________ 第一个地址 _____________/  \____ 第二个地址 ___/

第一个地址(入口)- 对外监听

 参数              作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 TCP-LISTEN:8888   在 8888 端口监听 TCP 连接
 bind=0.0.0.0      绑定到所有网卡(包括 Tailscale 虚拟网卡 tailscale0)
 fork              每个客户端连接都 fork 新进程,支持并发访问
 reuseaddr         端口可立即重用(进程重启不用等 TIME_WAIT)

第二个地址(出口)- 转发目标

 参数                 作用
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 TCP:127.0.0.1:5495   作为客户端连接到本地 5495 端口

数据流向

外部机器 (Tailscale 网络)
       |
       v
100.68.116.54:8888  <-- socat 监听(所有网卡可达)
       |
       |  socat 收到连接后,主动连接:
       v
127.0.0.1:5495      <-- 原服务(仅本地可达)
       ^
       |
   Kimi Code 服务

socat 在中间做双向管道:左边 socket 有数据 -> 写到右边;右边有数据 -> 写到左边。

为什么能解决你的问题

 限制                                 原因
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 原服务只绑 127.0.0.1:5495            出于安全或默认配置,拒绝非本地连接
 Tailscale 虚拟网卡是 100.68.116.54   属于"外部"网络,无法访问回环地址
 socat 监听 0.0.0.0:8888              接受所有网卡的连接,包括 Tailscale

简单说:socat 作为中间人,让外部流量"借壳"访问本只能本地访问的服务。

对比 SSH 反向隧道

 方式     适用场景
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 socat    同一台机器,把本地服务暴露给其他网卡
 ssh -R   把本地服务暴露到远程公网服务器

对比 ssh 反向代理

外部用户                公网服务器                 你的本地机器
    |                       |                          |
    |  1. 访问              |                          |
    |---------------------> |                          |
    |   http://公网IP:8888  |                          |
    |                       |  2. SSH 服务器收到连接   |
    |                       |     通过加密隧道转发      |
    |                       |------------------------> |
    |                       |                          | 3. SSH 客户端
    |                       |                          |    转发到本地服务
    |                       |                          |------------------->
    |                       |                          |   127.0.0.1:5495

关键机制

 组件            行为
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ssh -R 客户端   连接服务器时"预约"一个反向通道,让服务器代理端口
 SSH 服务器      在 0.0.0.0:8888 监听,把数据包塞进已建立的 SSH 连接
 SSH 加密隧道    所有流量走 SSH 端口(默认 22),穿透防火墙
 SSH 客户端      解密后作为本地客户端,连接 127.0.0.1:5495

与 socat 的核心区别

 对比项     socat              SSH 反向隧道
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 流量路径   本机网卡间转发     跨越网络的加密隧道
 暴露范围   依赖本机网卡       依赖公网服务器的网络
 安全性     明文传输           SSH 加密
 防火墙     需开放本地端口     只需 SSH  outbound
 使用场景   同一台机器多网卡   内网服务穿透到公网

为什么需要 0.0.0.0: 前缀

默认 -R 8888:... 会让 SSH 服务器只绑 127.0.0.1:8888(服务器本地),外部仍无法访问。

加 0.0.0.0: 前缀要求服务器绑定到所有接口,同时需要服务器配置:

# /etc/ssh/sshd_config
GatewayPorts yes

完整数据包流程

[浏览器] --HTTP--> [公网服务器:8888] --SSH协议封装--> [SSH隧道]
                                                            |
[本地服务:5495] <--HTTP-- [SSH客户端] <--解封装-- [SSH服务器]

一句话总结:SSH 客户端"骗"服务器帮它收流量,再通过加密隧道"快递"回本地。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。