修改端口后无法SSH连接EC2实例求助
解决EC2实例修改SSH端口后连接超时的问题
别急,先稳住——咱们一步步来,优先保证数据安全,尽量不用停机就能搞定这个问题。
先确认本地连接的姿势对不对
- 改了端口后,SSH命令必须指定新端口,别再用默认的22了!正确命令应该是:
ssh -p 你的新端口号 用户名@实例公网IP(用户名根据系统来:Amazon Linux是ec2-user,Ubuntu是ubuntu,CentOS是centos) - 先排除本地网络的锅:比如公司防火墙是不是封了这个新端口?换手机热点试试连接,要是热点能连上,那就是你本地网络的问题,找网管开端口就行。
用Session Manager无痛连进实例(完全不用SSH端口,安全不影响数据)
这是AWS给咱们留的救命通道,不用停机、不用开SSH端口就能直接进实例:
- 打开EC2控制台,找到你的实例,右键点「Connect」
- 切换到「Session Manager」标签页,点「Connect」
- 如果提示没权限,直接给实例附加一个带
AmazonSSMManagedInstanceCore权限的IAM角色就行——这个操作不用停机,在实例的「IAM角色」选项里直接替换,几分钟就搞定。
成功连进去后,先备份数据! 比如你的数据库是MySQL,就跑mysqldump -u 用户名 -p 数据库名 > /home/ec2-user/db_backup.sql,然后把备份文件传到S3更保险:aws s3 cp /home/ec2-user/db_backup.sql s3://你的备份桶名/。就算后面出问题,数据也稳了。
排查实例内部的SSH配置坑
连进去后,咱们来揪内部的问题:
- 打开SSH配置文件:
sudo nano /etc/ssh/sshd_config,确认Port字段已经改成你的新端口,而且前面没有#注释掉 - 检查
ListenAddress:如果它被设成了内网IP(比如172.xx.xx.xx),那公网肯定连不上,改成0.0.0.0或者直接注释掉,让SSH监听所有地址 - 检查SELinux限制:跑
sudo semanage port -l | grep ssh,如果你的新端口不在列表里,就添加:sudo semanage port -a -t ssh_port_t -p tcp 你的新端口号 - 重启SSH服务:
sudo systemctl restart sshd(Ubuntu/Debian用sudo service ssh restart) - 检查本地防火墙:
- 用firewalld的话,跑
sudo firewall-cmd --list-ports,没看到新端口就加:sudo firewall-cmd --add-port=你的新端口/tcp --permanent && sudo firewall-cmd --reload - 用iptables的话,跑
sudo iptables -L -n | grep 你的新端口,没结果就加规则:sudo iptables -A INPUT -p tcp --dport 你的新端口 -j ACCEPT,然后保存:sudo iptables-save > /etc/sysconfig/iptables
- 用firewalld的话,跑
再核对一遍安全组和NACL(别嫌麻烦,很多人在这里漏了)
虽然你说已经配置了,但再仔细检查:
- 安全组:入站规则必须允许你的本地IP段或者
0.0.0.0/0(临时测试用,之后改回你的IP更安全)的TCP新端口,出站规则默认允许所有就行 - NACL:这玩意儿是无状态的,入站要允许TCP新端口(源
0.0.0.0/0,动作允许),出站还要允许TCP的1024-65533端口(因为SSH返回包用的是临时端口),两个方向都得配对。
最后检查实例状态
- 在EC2控制台看实例的「状态检查」,确保系统状态和实例状态都是「正常」
- 用控制台的「Ping」「Traceroute」工具测一下实例的网络连通性,看看是不是路由出了问题
要是以上步骤都走完,应该就能连上了。记住:任何可能影响实例的操作前,先给EBS卷拍个快照——这个操作在实例运行时就能做,完全不影响业务,快照会保存当前卷的所有数据,就算真出问题也能恢复。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

