远程SSH连接Ubuntu服务器出现connection closed by remote host错误的原因及解决方法咨询
远程SSH连接Ubuntu服务器出现connection closed by remote host错误的原因及解决方法咨询
咱们先理清楚你的情况:你已经成功安装并运行了Ubuntu Server 22.04.1 LTS,也装好了openssh-server服务,同一局域网内的设备能正常SSH登录服务器,但用公网IP执行ssh username@myPublicIp尝试远程连接时,却遇到了kex_exchange_identification: Connection closed by remote host Connection closed by myPublicIp port 22的错误,而且你尝试配置了路由器端口转发和DMZ都没解决问题,我来帮你分析可能的原因和对应的解决办法:
可能的原因
- 运营商端口封禁:很多家用宽带的运营商会默认封禁22端口(SSH默认端口),这是出于安全合规的考虑。这种情况下,即使你配置了端口转发,外部请求也根本到不了你的路由器。
- 系统防火墙拦截:Ubuntu自带的ufw防火墙可能只开放了局域网的SSH访问权限,公网的连接请求被拦截了。虽然局域网内能正常连接,但公网流量不在允许范围内。
- 端口转发配置有误:虽然你说设置了端口转发,但可能存在细节错误,比如没选对TCP协议(SSH用的是TCP)、内部IP填错了服务器的局域网地址、内外端口不匹配,或者路由器没重启让规则生效。
- 公网IP类型问题:你的公网IP可能是动态IP或者运营商的共享IP(CGNAT),这种情况下外部设备根本无法直接通过这个IP访问你的服务器。比如有些运营商会把多个用户放在同一个公网IP下,你的端口转发规则自然无法生效。
- SSH服务配置限制:检查
/etc/ssh/sshd_config配置文件,可能设置了ListenAddress只监听局域网IP,或者通过AllowUsers/DenyUsers限制了只有局域网IP能连接,导致公网请求被直接拒绝。
对应的解决步骤
确认公网IP是否为独立公网IP:
在服务器上执行curl ifconfig.me获取当前公网IP,然后用手机开流量(不要连WiFi)访问同一个网址,对比两个IP是否一致。如果不一致,说明是共享IP,需要联系运营商申请独立公网IP,或者用内网穿透工具实现远程连接。修改SSH默认端口规避封禁:
- 编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config,找到Port 22这一行,改成Port 2222(或者其他未被占用的非标准端口,比如10022)。 - 重启SSH服务:
sudo systemctl restart sshd。 - 到路由器的端口转发页面,更新规则:将外部端口2222(和你改的端口一致)转发到服务器局域网IP的2222端口,协议选择TCP。
- 编辑SSH配置文件:
配置系统防火墙允许公网SSH访问:
- 如果改了端口,执行
sudo ufw allow 2222/tcp;没改的话执行sudo ufw allow 22/tcp。 - 重启防火墙让规则生效:
sudo ufw reload。
- 如果改了端口,执行
重新检查端口转发配置并重启路由器:
确认转发的内部IP是服务器的正确局域网IP(比如192.168.1.100)、协议为TCP、内外端口对应,然后重启路由器,确保规则生效。检查SSH服务配置:
打开/etc/ssh/sshd_config,确认ListenAddress设置为0.0.0.0(监听所有IP地址),并且没有设置限制公网用户访问的AllowUsers/DenyUsers规则,修改后记得重启SSH服务。
备注:内容来源于stack exchange,提问作者seriously




