![如果未正常关闭,SSH 多路复用将挂起](https://linux22.com/image/748339/%E5%A6%82%E6%9E%9C%E6%9C%AA%E6%AD%A3%E5%B8%B8%E5%85%B3%E9%97%AD%EF%BC%8CSSH%20%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E5%B0%86%E6%8C%82%E8%B5%B7.png)
我正在尝试通过多路复用 SSH 设置对我家用电脑的远程访问。设置如下:从我的笔记本电脑,我连接到调制解调器上的一个端口;此端口转发到我的路由器,然后路由器将其转发到本地桌面,我使用我的密钥进行身份验证。由于多路复用,我可以打开与家用电脑的其他连接,而无需重新进行身份验证。这一切都按我的预期运行。
但是,当我重启笔记本电脑时,出现了问题。如果我重启,那么我就无法再通过 SSH 进入家庭盒子了——尝试这样做会挂起一段时间,而不会提示我进行身份验证,然后最终超时。
我可以通过重启家庭盒子来解决这个问题(尽管这需要物理存在,这有点违背了重点)。如果我使用 正常断开 SSH 连接,也可以避免触发该问题ssh -O exit $IP -p $PORT
。
鉴于上述情况,我有两个问题:首先,这是预期的行为还是我遇到了错误?其次,有什么方法可以避免这个问题?谢谢!
(这个问题表面上类似于SSH 多路复用超时配置, 但那问题是关于服务器重新启动/无法访问,而我的问题是关于客户端重新启动而没有正常地发出多路复用连接结束的信号。)
[编辑] 根据下面评论的要求,以下是尝试连接标志时的输出(不是特别有用)-vv
。我略微编辑了输出,分别将我的 IP、用户名和端口替换为$IP
$USER , and
$PORT`。
OpenSSH_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data /home/$USER/.ssh/config
debug1: /home/$USER/.ssh/config line 4: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolve_canonicalize: hostname $IP is address
debug1: auto-mux: Trying existing master
debug1: Control socket "/home/$USER/.ssh/$USER@$IP:$PORT" does not exist
debug2: ssh_connect_direct
debug1: Connecting to $IP [$IP] port $PORT.
debug1: connect to address $IP port $PORT: Connection timed out
ssh: connect to host $IP port $PORT: Connection timed out
当我没有触发这个错误时,(因此能如果成功连接,则输出与-vv
完全相同,只是该Connection timed out
行被替换为一行,说明debug1: Connection established
然后连接将正常进行身份验证。
以下是我的整个非常基本的.ssh/config
文件,以防相关:
Host *
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
ControlPersist yes
ServerAliveInterval 300
ServerAliveCountMax 2
RemoteForward 9999 localhost:22
答案1
在进一步深入研究之后(并阅读了出色的书SSH 精通),我能够解决我的问题:即使我ServerAliveInterval
在我的客户 .ssh/config
文件中,我没有ClientAliveInterval
在我的服务器 sshd_config
文件。
因此,服务器没有超时,并且保持连接。结合导航我的家庭网络所需的双端口转发,这占用了我打开的(唯一)端口并阻止了其他连接。
ClientAliveInterval 10
在我的文件中添加一行sshd_config
(并记得重新启动 sshd 服务可以sudo pkill -1 sshd
很好地解决问题。希望这些信息可以帮助其他人快速解决这个问题。