server 调用 listen 监听 22 端口的请求
client 调用 connect 连接到 22 端口,此时 client 自动分配一个 port1,并向 server 发送一个 syn 包,表示请求建立新的连接
server 收到 syn 后,调用 accept 接受 client 的连接请求,并向 client 回复一个 syn+ack 包
client 回复 ack 包后,连接正式建立完毕。后续双方发送 psh/ack 包交换数据。直到出现 fin 或 rst 包时,或者连接之间长时间无数据传递,即超时,连接才会关闭。
题目所说防火墙禁用非 22 端口的数据,我猜很大可能,仅仅是允许 22 端口收到 syn 包,建立连接,非 22 端口收到 syn 会被防火墙丢弃。
这个需要你来确认,具体使用的什么防火墙,配置的什么策略。
所以能导致当前 ssh 连接失效断开的情况,有以下几种,
1.sshd 进程关闭,导致 client 收到 fin 或者 rst 包
2.防火墙丢弃 22 端口收到的 psh 或 ack 数据
mario85 所贴链接说明,不会出现第 1 种情况,因为每个已建立的连接是新的进程。ssh 代码应该做了特殊处理,以保证不在重启配置时关闭之前启动的进程。
第二种情况也没有出现,因为防火墙的配置中允许所有端口的 push/ack 包,禁止非 22 端口的 syn 包。
tcp 连接建立过程
https://en.m.wikiversity.org/wiki/Wireshark/TCPssh 重启过程,链接由 mario85 提供
https://unix.stackexchange.com/questions/27636/how-does-ssh-connection-survive-a-network-restartiptables 防火墙使用
https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commandsAllow All Incoming SSH To allow all incoming SSH connections run these commands:
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
The second command, which allows the outgoing traffic of established SSH connections, is only necessary if the OUTPUT policy is not set to ACCEPT.