Skip to content

autossh 常见问题

1. autossh 是干什么的?

它是在 ssh 基础上增加自动重连能力的工具,适合长期保持 SSH 隧道,比如本地 SOCKS 代理。

2. 这次配置的 1080 是本机端口还是远端端口?

是本机端口。

这次配置对应的是:

text
127.0.0.1:1080

也就是本机 SOCKS5 代理。

3. -D 1080 是什么意思?

表示在本机开启一个动态代理端口,也就是 SOCKS5 代理端口。

4. 为什么不用普通 ssh,而用 autossh

因为普通 ssh 断了就断了,而 autossh 更适合长时间挂着,会自动重连。

5. -M 0 是什么意思?

表示关闭 autossh 自带的监控端口。

这通常更简单,也能减少额外端口占用。

6. -N 是什么意思?

表示不执行远端命令,只建立隧道。

7. -f 是什么意思?

表示启动后转入后台运行。

8. 为什么建议加 ServerAliveIntervalServerAliveCountMax

因为它们能让 SSH 更快发现连接已经失效,从而让 autossh 及时重连。

9. ExitOnForwardFailure=yes 有什么用?

如果端口转发没成功,它会直接退出,避免出现“命令执行了但代理没真正起来”的假成功。

10. 为什么建议做 SSH 免密登录?

因为开机自启时通常没有机会手动输入密码,不做免密登录会让自启不稳定甚至失败。

11. launchctl load/unloadbootstrap/bootout 有什么区别?

load/unload 是老写法,很多时候还能用。
bootstrap/bootout 是现在更推荐的写法,更符合新版 macOS 的 launchd 管理方式。

12. 我已经用旧命令启动了服务,需要用旧命令停止吗?

不需要。

可以直接用新命令停止和重载,因为它们操作的是同一个 launchd 服务。

13. 我需要重新配置 plist 吗?

如果当前服务已经正常工作,通常不需要。

切换到新命令管理服务,不等于要重做配置。

14. 怎么判断服务已经成功启动?

至少看这三项:

bash
launchctl list | grep autossh
lsof -i :1080
cat /tmp/autossh-socks1080.err

更稳妥的验证方式是:

bash
curl --socks5 127.0.0.1:1080 https://ifconfig.me

15. 1080 在监听,是不是就一定能用?

不一定。

端口监听只说明本地服务起来了,不代表代理一定能正常出网。最好还是用 curl --socks5 再测一次。

16. 日志是空的,是不是就说明完全没问题?

也不一定。

日志为空通常说明没有明显报错,但仍然建议做一次代理可用性测试。

17. 开机后没自动启动,最常见原因是什么?

最常见的是 SSH 免密登录没有配置好,或者 plist 里的 autossh 路径写错了。

18. 排查问题时最有效的办法是什么?

通常是把命令以前台方式跑一次,也就是去掉 -f,这样最容易直接看到错误输出。

19. 为什么要在 ~/.zshrc 里加函数?

因为这样后续管理服务更方便,不用反复手写很长的 launchctl 命令。

20. 最常用的几个快捷命令是什么?

bash
autossh-start
autossh-stop
autossh-reload
autossh-status
autossh-log
autossh-log-follow

21. autossh-log 里一直是 ssh: connect to host ... port 22: Operation timed out,一定是远端 SSH 没开吗?

不一定。

这次真实案例里,远端 sshd 是正常的,最终问题出在:

  • Tailscale grants 只配置了 tailscale.com/cap/relay
  • 但没有补成员之间普通网络访问的 ip 授权

结果就是:

  • tailscale ping
  • 普通 ssh 100.x.x.x:22 不通
  • autossh 也就一直报超时

最终通过补下面这条修复:

json
{
  "src": ["autogroup:member"],
  "dst": ["autogroup:member"],
  "ip": ["*"]
}