vscode ssh连接自动断开怎么解决 -- 设置心跳包并验证

4,729 阅读2分钟

一、背景 & 解决

当我在 Mac 中使用 vscode ssh 功能连接到 linux 中时,发现 隔天(或者inactive一段时间之后)ssh会自动断掉 。我想找一个方法让ssh不要断掉,就有了这篇文章。

先说结论,在ssh配置文件中添加心跳的配置即可。ssh程序的文档在这里,也可以在stackoverflow上搜索how to keep ssh alive来获取具体配置。

# ~/.ssh/config
Host *
    ServerAliveInterval 240

二、可能遇到的坑

  1. macos 电源管理会自动切断网络
  2. 网络环境本身不稳定会导致 host is down,需要关闭路由器自动休眠尝试切换为有线连接。

image.png

image.png

好,结题!

三、问题的发散

使用ssh原生命令可以看到心跳包的日志,说明配置文件中的内容是正确的。

ssh -vvv -F /path/to/your/.ssh/config 192.168.31.71

image.png

Q1: 如何验证在 vscode 中心跳包被正确的发送了呢?

A1: 我认为有以下几种思路

  1. 查看 ssh 日志,vscode 中可以设置 ssh 的 log level,设置为 debug 即可。(未验证成功,因为没有看到心跳包发送的日志)
  2. 通过抓包来查看是否有类似心跳包的数据被发送了

图1

Q2: 如何在 macos 下抓包呢?

A2: 我认为可以通过 tcpdump 的方式进行抓包。因为我设置了DHCP静态ip,所以可以根据目标ip和端口号针对某一网卡(即网络接口)进行抓包命令如下:

sudo tcpdump -i en0 host 192.168.31.71 and port 22

image.png

Q3: 抓包的目标ip和端口很容易知道,那么如何知道应该使用哪一个网络接口呢,ifconfig列出的网络接口实在是太多了?

A3: Unix-like机器中编程时会使用 socket 建立 tcp 连接,而此时并不需要我们指定网络接口,这就意味着在 socket 底层一定有一个机制用于选择将包发送到哪一个接口,没错就是路由表。思路清晰,查看路由表即可找到我们要 tcpdump 的目标网络接口。macos 中查询路由表的命令是

netstat -nr

image.png

image.png