写在前面
笔者是在搓完这个项目之后, 才发现有更好的方式来实现服务器代理, 所以本文并不是一个常规的代理方案, 只是作为笔者在学习计算机网络中的思考和探索
正文
平时用云服务器开发、拉依赖、跑脚本、测试海外接口时,很多人都会遇到一个很烦的问题:
本地网络环境已经配置好了代理,比如 Clash、Mihomo、Surge、V2Ray 这些都在本机稳定运行;但到了远程服务器上,又得重新折腾一套代理环境。
这件事的问题不只是“麻烦”,而是它很容易变成重复劳动:
- 本地已经有一套可用代理
- 服务器上还要再装一套
- 换机器、换端口、换配置时又得重新改
- 有时候服务器环境简陋,装代理本身都不方便
- 代理挂了以后,排查到底是服务端问题还是本地问题也很费劲
所以我做了一个小工具:LocalTUN。
github仓库: fishwww-ww/LocalTUN
它的核心思路很简单:
通过 SSH 反向隧道,把远程服务器上的代理流量转发回你本地已经跑着的代理端口。
也就是说,服务器不用自己维护一套代理栈,而是直接“借用”你本机的代理能力。
它解决了什么问题?
举个最实际的场景。
我的本地机器上已经跑着 Mihomo,HTTP 或 mixed 代理端口是 7897。
我有一台云服务器,需要临时:
- 拉一些外部依赖
- 访问某些海外接口
- 用
curl做接口联调 - 跑一些依赖外网的脚本
传统做法通常是:
- 在服务器上安装代理程序
- 配置订阅、规则或节点
- 处理守护进程、端口监听、防火墙、环境变量
- 出问题了还要逐层排查
而 LocalTUN 做的事情是:
- 本地运行一个命令
- 它通过 SSH 建立反向隧道
- 在远程服务器暴露一个端口,默认是
1080 - 这个端口收到的流量,会被转发到你本地代理端口,默认
7897 - 然后由你本地的代理客户端负责最终出网
整个路径大概是这样:
远程服务器 (:1080) -> SSH 反向隧道 -> 本地机器 (:7897) -> 本地代理客户端 -> Internet
所以它很适合下面这些场景:
- 云服务器想复用本地 Clash / Mihomo 代理
- 临时机器不想装完整代理环境
- 想让远程脚本、
curl、包管理器快速获得代理能力 - 希望代理配置尽量集中在本地维护,而不是每台服务器都重复配置
为什么不直接手写 SSH 命令?
当然,你完全可以自己手敲 SSH 反向隧道,比如类似这种思路:
ssh -R 1080:127.0.0.1:7897 user@server
但真正落地时,问题很快就会变多:
- 远程
sshd是否允许端口转发 - 是否打开了
GatewayPorts - 断连后怎么自动重连
- 后台进程怎么托管
- PID、日志怎么管理
- 远程环境变量怎么统一配置
- 如何快速验证链路真的可用
这些零碎事情单个看都不难,但组合起来就很容易变成一堆临时脚本和手工操作。
LocalTUN 的意义,其实就是把这些重复动作产品化、命令化。
3 分钟上手
0. 安装
homebrew 安装
brew tap fishwww-ww/tap
brew install fishwww-ww/tap/localtun
npm 安装
npm i @fishwww-ww/localtun
更多安装方式详见仓库
1. 初始化配置
先执行:
localtun init
它会引导你输入这些信息:
- 服务器 IP 或域名
- SSH 用户名
- SSH 端口
- SSH 私钥路径
- 远程代理端口
- 本地代理端口
默认配置文件路径是:
~/.localtun/config.yaml
配置大概长这样:
server:
host: 1.2.3.4
port: 22
user: root
key_path: ~/.ssh/id_rsa
tunnel:
remote_port: 1080
local_port: 7897
keepalive:
interval: 30
max_count: 3
2. 初始化远程服务器
第一次在目标服务器上使用时,执行:
localtun setup
这个命令会连接到服务器,并在确认后帮你做几件事:
- 备份并修改
/etc/ssh/sshd_config - 开启
AllowTcpForwarding yes - 开启
GatewayPorts yes - 开启
PermitTunnel yes - 视情况重启 SSH 服务
- 备份并更新远程
~/.bashrc - 注入代理环境变量和辅助函数
这一步的价值很大,因为很多 SSH 反向隧道“命令没错但就是不通”的根因,往往就在服务端 SSH 配置上。
3. 启动隧道
前台运行:
localtun start
后台运行:
localtun start -d
后台模式下会生成:
~/.localtun/localtun.pid~/.localtun/localtun.log
这意味着你可以把它当成一个稳定的常驻通道来用,而不是每次开一个终端窗口盯着。
4. 查看状态
localtun status
它会告诉你:
- 当前是否在运行
- 进程 PID
- 服务器地址和用户
- 远程端口到本地端口的映射
- Keepalive 配置
- 日志文件路径
对于排障来说,这一步很实用,因为你不用自己再去翻进程列表或者猜日志位置。
5. 验证代理链路
localtun test
这个命令会从远程服务器侧去验证整条代理链路是否通畅,比如测试访问:
https://www.baidu.comhttps://www.google.com
它能帮你快速确认几件事:
- 隧道有没有建立成功
- 本地代理端口是否可达
- 远程代理环境是否正确生效
6. 停止隧道
localtun stop
后台模式下停止也比较干净,不需要你手动找 PID 再 kill。
这个项目比较看重的几点
1. 它尽量贴近真实使用习惯
很多人实际已经有本地代理了,问题不在“怎么代理”,而在“怎么把远程机器接进来”。
LocalTUN 不是重新发明代理工具,而是补上这层连接能力。
2. 它把远程侧配置也收拢了
远程服务器最容易出问题的地方之一,就是 SSH 服务配置和 shell 环境变量。
如果每次都手动改 /etc/ssh/sshd_config、改 ~/.bashrc、再自己测连通性,重复劳动真的很多。
把这些能力放到一个 CLI 里,整体体验会顺很多。
当前限制和注意点
项目目前也有一些边界:
- 当前主要基于 SSH 私钥认证,不支持交互式密码登录
- 远程环境主要依赖 HTTP 代理环境变量,所以更推荐本地提供 HTTP 或 mixed 代理端口
- SSH host key 校验目前偏宽松,敏感环境里需要自己额外评估安全风险
setup会修改远程系统文件,生产环境建议先确认备份和回滚方式
我个人更倾向于把它定位成:
一个个人开发者、自用服务器场景的效率工具。