StreamLocalBindUnlink yes 表示 SSH 服务在绑定 Unix 域套接字前自动删除同名残留文件,避免“Address already in use”错误;默认为 no,需手动清理。

StreamLocalBindUnlink 是 OpenSSH sshd_config 中用于控制 Unix 域套接字(StreamLocal)绑定行为的关键配置项,主要解决重复启动服务时因套接字文件残留导致的“Address already in use”错误。
StreamLocalBindUnlink 的作用
当 SSH 服务启用 StreamLocal 转发(如通过 ssh -L /tmp/sock:localhost:22 user@host 创建本地 Unix 套接字)时,sshd 会在指定路径(如 /tmp/sock)创建一个 socket 文件。若服务异常退出或重启前未清理该文件,下次启动会因文件已存在而失败。
StreamLocalBindUnlink yes 表示:在 bind 前自动删除已存在的同名 socket 文件,避免冲突;
StreamLocalBindUnlink no(默认)表示:不自动清理,需手动干预或依赖系统清理机制。
如何启用自动清理
编辑主配置文件:
sudo nano /etc/ssh/sshd_config
添加或修改以下行(建议放在全局配置区,非 Match 块内):
StreamLocalBindUnlink yes
保存后重启服务生效:
sudo systemctl restart sshd
注意:该选项仅对 StreamLocal 类型的转发生效,不影响 TCP 端口监听。
配合 AllowStreamLocalForwarding 使用更安全
单独开启 StreamLocalBindUnlink 不代表允许转发,还需确认转发功能已启用:
-
AllowStreamLocalForwarding yes(默认值,允许) - 若设为
no,即使开启 unlink,转发请求也会被拒绝 - 生产环境建议结合
PermitUserEnvironment no和限制用户权限,防止滥用套接字路径
验证是否生效
可手动测试套接字复用场景:
1. 启动一次 StreamLocal 转发:ssh -o ExitOnForwardFailure=yes -L /tmp/test.sock:localhost:22 user@localhost
2. 中断连接(Ctrl+C),检查 /tmp/test.sock 是否仍存在
3. 再次执行相同命令 —— 若配置生效,不会报错“cannot bind unix socket”,说明 unlink 已触发
也可通过 ss -xln | grep test.sock 或 ls -l /tmp/test.sock 辅助判断


















