boring:把一长串 ssh -L 收进一个 TOML 的隧道管理器

SSH
开发者工具
Go
命令行
开源
隧道
2026/9/29
·

阅读时间: 大约 7 分钟

boring:把一长串 ssh -L 收进一个 TOML 的隧道管理器

boring 官网首页:v0.16.1,featured on HN,配置写在 ~/.boring.toml

每个长期和远程服务器打交道的开发者,电脑里都飘着几个一直挂着的 SSH 隧道:本地 6379 转发到 prod 的 Redis、3000 转发到 staging 的 Grafana、一个 SOCKS5 代理走 bastion。管理它们的传统办法很「野」:shell 历史里翻 ssh -L,或者 autossh 配 systemd,再加一堆 screen/tmux 窗口。boring 是 alebeck 用 Go 写的命令行隧道管理器,v0.16.1、约 1.7k star,上过 Hacker News,主张「一个 TOML 管全部隧道」。本文基于其官网做分析。

一、它解决什么痛点

手敲 ssh -L 6379:localhost:6379 prod-01 的问题不在命令本身,而在:

  • 隧道散落在不同终端窗口,断了不知道;
  • 公司网络切换/VPN 抖动后要手动重连;
  • 想把多条隧道一起启停,得开多个窗口;
  • 远程转发、Unix 套接字转发、动态 SOCKS5 的参数各不一样,记不住。

boring 的思路是:把隧道声明式地写进 ~/.boring.toml,然后用 boring start/stop/list 统一管理,并内建 keep-alive 与断线自动重连。

二、配置长什么样

官网示例的配置非常直白:

[[tunnels]]
name   = "tensorboard"
local  = "9000"
remote = "localhost:9000"
host   = "ml-cluster"      # host 直接走 ~/.ssh/config 解析

[[tunnels]]
name     = "db-staging"
local    = "5001"
remote   = "localhost:5001"
host     = "staging.example.com"
user     = "staging"
identity = "~/.ssh/id_staging"

关键细节是 host = "ml-cluster"——它直接复用你已有的 ~/.ssh/config,并兼容 ssh-agent。这意味着你不用在 boring 里再写一遍主机别名、跳板机、密钥路径,boring 只负责「在这个 SSH 连接上转发哪些端口」。

三、能力面

官网列的功能:

  • 本地/远程端口转发 + 动态 SOCKS5 代理;
  • 自动重连与 keep-alive:网络断了自己拨回去;
  • Unix 域套接字转发(不止 TCP 端口);
  • TOML 配置,boring edit 直接开编辑器;
  • bash/zsh/fish 标签补全;
  • 分组(v0.13 新增):--group prod 批量启停。

boring list 的分组输出:prod/staging/proxy 三组,状态、本地端口、远端、via 一目了然

上面这张 boring list 输出很能说明日常体验:隧道按 [prod]/[staging]/[proxy] 分组,每行显示已存活时长(01m56s、11h03m)、本地→远端映射、走哪台 bastion;甚至有一条 [SOCKS] <- /tmp/tmp-sock 的反向 SOCKS5——从 bastion 上的 unix socket 反代回本地。

四、必须自己权衡的边界

  1. 它是「管理器」不是「SSH 服务器」,底层还是 ssh。boring 本质是帮你组织和重连 ssh 进程,不重新实现 SSH 协议——这既是优点(安全模型直接复用 OpenSSH),也意味着它的能力边界 = OpenSSH 端口转发能力边界,不会凭空多出什么。

  2. 自动重连不等于高可用。keep-alive + 重连对付的是网络抖动,但如果是远程服务器重启、跳板机变更、ssh-agent 锁死,仍要人工介入。它不能替代 systemd 级别的生产守护策略——Koala 点评定位它是「长期挂多条隧道的开发者」的桌面工具,而不是服务器侧的隧道编排。

  3. v0.x 阶段:版本号 0.16.1,配置格式与命令仍可能演进;迁移到新版本前看 changelog。

  4. 安全责任在你:把 Redis、数据库端口转发到本地后,本机其他进程也能连——boring 不做访问控制,别以为「只转发给自己」就等于安全。

五、适用与不适用场景

适合: 每天要挂 3 条以上 SSH 隧道的开发者/数据工程师;厌倦了 shell 历史翻 ssh 参数的人;需要分组批量启停、想要一个 list 看清所有隧道状态的人;已经有 ~/.ssh/config、不想再维护一套连接信息的人。

不适合: 只挂一条隧道、手敲命令就够的人;需要在服务器侧无人值守跑隧道、要 systemd 单元与告警的场景(boring 是桌面/交互式工具);需要 Web 管理界面或多用户共享隧道配置的团队。

六、客观分析:优势与意义

优势: 声明式 TOML + 复用 ~/.ssh/config,不重复维护连接信息;自动重连与 keep-alive 解决最痛的「断了不知道」;分组批量操作;Unix 套接字与 SOCKS5 都覆盖;单二进制、补全齐全。

局限: 不替代 ssh,能力上限即 OpenSSH 转发;定位是交互式桌面工具,不是生产守护方案;v0.x 仍在演进;无内置监控告警。

boring 这类工具的价值,在于把「本来就该是声明式的东西」从 shell 历史里捞出来。SSH 隧道本质是一组配置,不是一串命令——boring 只是把这件事做对了:少记一个参数,就少一次半夜排查「为什么 tensorboard 又连不上」。它不惊艳,但「just works」正是它上了 HN 的原因。

参考来源