登录一次,后面的命令全部「搭便车」—— 一条配置根治频繁部署被 fail2ban 误封,顺便让 ssh/scp 快得多。
这条接着上一篇「SSH 连接太频繁被封」:既然问题出在每次 ssh/scp 都是一次完整登录,那解法就是 —— 让多次命令共用同一条已登录的连接。这就是 SSH 自带的连接复用(ControlMaster)。
没复用时,每次 ssh 都在重复做什么
- 建 TCP 连接(三次握手)
- SSH 协议握手(交换版本、协商加密算法)
- 密钥交换 + 身份认证(最重的一步)
跑十次部署 = 这套流程完整重来十遍 = 服务器眼里的十次独立登录。fail2ban 一看「这 IP 几分钟登录几十次」,直接判定暴力破解。
复用的核心:留一条「主连接」,后续全部钻进去
第一条连接登录成功后不关闭,留着当主连接(master),并在本地开一个套接字文件当入口。之后再 ssh/scp 同一台机器,发现主连接活着,就不再握手、不再认证,直接在那条连接里开一个新「通道」(channel)跑命令:
没复用: [握手+认证] 命令1 [握手+认证] 命令2 [握手+认证] 命令3 ← 3 次登录
复用: [握手+认证] ──┬── 命令1
├── 命令2 ← 1 次登录,3 条命令共用
└── 命令3
关键在于 SSH 协议本身就支持「一条连接里跑多个通道」(端口转发、命令、sftp 本就共存),ControlMaster 只是把这个能力开放给多次独立的 ssh 命令共享。
配置(写进 ~/.ssh/config)
Host myserver
HostName 服务器IP
User root
ControlMaster auto # 有主连接就复用,没有就建一条
ControlPath ~/.ssh/sockets/%r@%h:%p # 套接字文件位置(每台机器一个)
ControlPersist 10m # 闲置后再保留 10 分钟,期间继续免登录
(~/.ssh/sockets 目录需先创建并 chmod 700)
效果
- fail2ban 彻底不误伤:无论部署多少次,真正的登录认证只发生一次,够不着封禁阈值。
- 明显变快:第二条命令起没有握手开销,几乎瞬间返回。
- 常用命令:
ssh -O check 主机查主连接状态,ssh -O exit 主机手动关闭。