CentOS服务器修改SSH端口并禁用密码认证,核心操作就两步:编辑/etc/ssh/sshd_config文件,把Port 22改成你想要的端口号(比如2222),再把PasswordAuthentication yes改成no,然后重启sshd服务并配置防火墙放行新端口。这是Linux服务器最基础也最重要的安全加固手段,能直接挡住90%以上的自动化暴力破解攻击。下面我把每一步的细节、注意事项、踩坑经验全部讲透。
为什么要修改SSH默认端口并禁用密码登录SSH默认使用22端口,全世界的黑客扫描器都知道这个端口。你的服务器只要暴露在公网上,每天都会收到成千上万次的暴力破解尝试。攻击者用自动化工具不断尝试用户名和密码组合,22端口就是他们的第一目标。修改端口虽然不是万能的,但能让绝大多数"撒网式"攻击直接失效,因为扫描器通常只扫描常用端口。
禁用密码认证则是更深层的防护。密码再复杂也有被猜到的可能,而SSH密钥认证使用非对称加密,私钥保存在你本地电脑上,服务器上只放公钥,没有私钥根本无法登录。两者结合使用,安全等级直接拉满。这也是目前主流云服务商和安全规范的基本要求。
操作前的准备工作:千万别把自己锁在外面在动手之前,有几件事必须先做好,否则你可能直接把自己锁在服务器外面,到时候只能找服务商用控制台救你。
第一,确认你已经有SSH密钥对。如果你还没有,先在本地电脑生成:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
执行后会在~/.ssh/目录下生成id_rsa(私钥)和id_rsa.pub(公钥)。把公钥内容复制下来备用。
第二,先把公钥上传到服务器。在你还能用密码登录的时候,执行:
ssh-copy-id root@你的服务器IP
或者手动把公钥内容追加到服务器的/root/.ssh/authorized_keys文件里。这一步是保命操作,确保你禁用密码后还能用密钥登录。
第三,保持一个当前的SSH会话不要关闭。在你开一个新终端测试新配置之前,旧的连接要一直开着。万一新配置有问题,你还能通过旧会话改回来。
第四,如果你的服务器有安全组或者硬件防火墙,提前记下当前的规则,后面需要添加新端口的放行规则。
第一步:修改SSH配置文件用root权限编辑SSH的主配置文件:
vim /etc/ssh/sshd_config
找到以下几个关键参数,逐一修改。
修改端口号。找到Port这一行,默认是:
#Port 22
去掉前面的#号,改成你想要的端口。建议选择10000到65535之间的端口,避开常用服务端口。比如改成2222:
Port 2222
禁用密码认证。找到PasswordAuthentication这一行:
#PasswordAuthentication yes
改成:
PasswordAuthentication no
同时建议把PermitEmptyPasswords也设为no,防止空密码登录:
PermitEmptyPasswords no
如果你还想进一步加固,可以把允许登录的用户限制一下,只允许特定用户用密钥登录:
AllowUsers root yourusername
或者直接禁止root远程登录(更安全的做法是用普通用户登录再su):
PermitRootLogin no
修改完成后保存退出,在vim里按Esc,输入:wq回车。
第二步:配置SELinux和防火墙放行新端口CentOS 7和CentOS 8的防火墙工具不一样,需要分别处理。
CentOS 7使用firewalld。先添加新端口到永久规则:
firewall-cmd --permanent --add-port=2222/tcp
然后重新加载防火墙:
firewall-cmd --reload
如果你之前只放了22端口,现在要把22端口从规则里移除(可选,但建议做):
firewall-cmd --permanent --remove-port=22/tcp firewall-cmd --reload
CentOS 8同样使用firewalld,命令完全一样。如果你用的是iptables,命令是:
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT service iptables save
SELinux方面,如果你修改的端口不是系统预定义的SSH端口,SELinux可能会拦截。需要用semanage添加端口类型:
semanage port -a -t ssh_port_t -p tcp 2222
如果提示找不到semanage命令,先安装:
yum install -y policycoreutils-python-utils
或者直接查看当前SSH允许的端口列表:
semanage port -l | grep ssh第三步:重启SSH服务并验证
配置改完、防火墙配完之后,重启sshd服务:
systemctl restart sshd
CentOS 8上服务名可能是sshd.service,命令一样。重启后先不要关闭当前的SSH连接!
打开一个新的终端窗口,用新端口和密钥尝试连接:
ssh -p 2222 root@你的服务器IP
如果能正常登录,说明配置成功。如果连接被拒绝,不要慌,你还有旧的SSH会话开着,回去检查配置文件有没有写错、防火墙有没有放行、SELinux有没有拦截。
确认新连接正常后,再关闭旧的SSH会话。至此,修改完成。
进阶安全建议:不止于改端口和禁密码修改端口和禁用密码只是基础,真正的安全加固还需要做更多事情。
第一,使用fail2ban自动封禁暴力破解IP。安装并配置fail2ban,它会监控SSH登录日志,发现多次失败就自动把IP加入防火墙黑名单:
yum install -y fail2ban systemctl enable fail2ban systemctl start fail2ban
fail2ban默认会监控SSH,一般不需要额外配置就能工作。你可以查看/etc/fail2ban/jail.local调整封禁策略,比如失败5次就封禁,封禁时间设为1小时。
第二,限制SSH登录的尝试次数。在sshd_config里添加:
MaxAuthTries 3
这样每个连接最多只能尝试3次认证,超过就断开。
第三,设置登录超时时间,防止连接挂起占用资源:
ClientAliveInterval 300 ClientAliveCountMax 2
这表示服务器每5分钟向客户端发一次心跳,如果客户端2次没响应就断开连接。
第四,定期更换SSH密钥。密钥不是永久安全的,建议每半年到一年更换一次。同时确保私钥文件权限正确:
chmod 600 ~/.ssh/id_rsa chmod 700 ~/.ssh
第五,如果服务器不需要对外提供SSH服务,可以考虑只允许特定IP访问。在sshd_config里用AllowUsers或者在防火墙里限制来源IP,把攻击面缩到最小。
常见问题和排错指南改完端口连不上了怎么办?如果你没有提前准备密钥或者没有保持旧会话,大概率只能通过云服务商的VNC控制台或者带外管理进入服务器,手动把sshd_config改回来。所以前面说的准备工作真的不是废话,是救命的。
防火墙放行了但还是连不上?检查SELinux状态,执行getenforce看看是不是Enforcing模式。如果是,要么用semanage添加端口类型,要么临时设为Permissive模式测试:
setenforce 0
测试完记得改回来:
setenforce 1
新端口被其他服务占用了?先用netstat检查:
netstat -tlnp | grep 2222
如果有输出说明端口被占用,换一个端口重新配置。
密钥登录失败?检查服务器端authorized_keys文件权限,必须是600,.ssh目录必须是700。同时确认公钥格式正确,是一行完整的内容,没有多余的换行或空格。
总结:安全是一个持续的过程修改SSH端口和禁用密码认证是CentOS服务器安全加固的第一步,也是性价比最高的一步。操作本身不复杂,十分钟就能搞定,但细节决定成败。提前准备密钥、保持旧会话、配置防火墙和SELinux,这三件事缺一不可。改完之后再加上fail2ban、登录限制、定期换密钥这些措施,你的服务器安全性就能超过绝大多数同类机器。安全不是一次性的操作,而是持续维护的习惯,定期检查日志、更新系统、审计配置,才能真正守住你的服务器。
