在服务器管理和运维工作中,安全始终是第一要务,SSH(Secure Shell)作为远程管理 Linux 服务器的核心工具,其默认的 22 端口是自动化扫描和暴力破解攻击的首要目标,将 SSH 服务端口修改为一个非标准端口,是提升服务器安全性的基础且有效的手段之一,本文将以 CentOS 系统为例,详细、清晰地介绍修改 SSH 端口的完整流程,包括配置文件修改、防火墙设置以及至关重要的 SELinux 策略更新,确保整个过程安全、无误。
准备工作:防患于未然
在进行任何系统关键配置的修改之前,做好准备工作可以避免很多不必要的麻烦,甚至是灾难性的后果。
备份配置文件:这是最重要的第一步,任何修改都有可能出错,拥有原始配置文件的备份意味着你随时可以恢复到初始状态,使用
cp
命令备份 SSH 的主配置文件。sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
确保拥有 root 权限:修改系统配置和服务需要管理员权限,你可以直接以
root
用户登录,或者在普通用户下使用sudo
命令来执行操作。了解 SELinux:CentOS 系统默认启用了 SELinux(Security-Enhanced Linux),它是一个强制访问控制(MAC)系统,这意味着,即使你修改了配置文件和防火墙,SELinux 策略不允许,SSH 服务依然无法在新的端口上监听,这是很多新手在修改端口时失败并导致无法连接的主要原因,必须予以重视。
第一步:修改 SSH 配置文件
SSH 服务的所有配置都集中在 /etc/ssh/sshd_config
文件中,我们需要使用文本编辑器(如 vi
或 nano
)来打开并修改它。
sudo vi /etc/ssh/sshd_config
在文件中,找到 #Port 22
这一行,开头的 表示该行是注释,当前生效的是默认的 22 端口,为了实现平滑过渡,避免因配置错误而立即被锁在服务器之外,最佳实践是先添加一个新端口,同时保留旧端口。
将 #Port 22
修改为如下形式,这里我们以 2222
作为新端口为例:
#Port 22
Port 22
Port 2222
这样配置后,SSH 服务将同时在 22 和 2222 这两个端口上监听,当你确认可以通过新端口正常连接后,再回来移除 Port 22
这一行。
修改完成后,保存并退出编辑器(在 vi
中,按 Esc
键,输入 wq
并回车)。
第二步:更新防火墙规则
修改了服务端口,必须相应地在防火墙中开放新的端口,否则外部流量将无法到达 SSH 服务,CentOS 7 及以上版本默认使用 firewalld
作为防火墙管理工具。
永久添加新端口到防火墙:
sudo firewall-cmd --permanent --add-port=2222/tcp
--permanent
参数表示这个规则是永久生效的,否则它会在防火墙重启后失效。重新加载防火墙配置:
sudo firewall-cmd --reload
此命令会使刚才添加的永久规则立即生效。
验证端口是否已开放:
sudo firewall-cmd --list-all
在输出的
ports
列表中,你应该能看到2222/tcp
。
第三步:配置 SELinux 策略
这是在 CentOS 上修改端口最关键也最容易被忽略的一步,我们需要告诉 SELinux,允许 SSH 服务使用新的 TCP 端口。
安装必要的管理工具(如果尚未安装):
semanage
命令来自于policycoreutils-python
包。sudo yum install policycoreutils-python -y
对于 CentOS 8/Stream 等使用
dnf
的系统,命令为:sudo dnf install policycoreutils-python-utils -y
为 SSH 服务添加新端口:
使用semanage
命令将 2222 端口添加到 SSH 端口类型中。sudo semanage port -a -t ssh_port_t -p tcp 2222
参数解释:
-a
: 表示添加(add)。-t ssh_port_t
: 指定类型为 SSH 端口类型。-p tcp
: 指定协议为 TCP。2222
: 你要添加的端口号。
验证 SELinux 端口规则:
你可以查看当前所有被允许用于 SSH 的端口。sudo semanage port -l | grep ssh
输出结果应该包含
ssh_port_t tcp 2222, 22
,表示 22 和 2222 端口都已成功关联到 SSH 服务。
第四步:重启 SSH 服务并验证
所有配置都已完成,现在需要重启 SSH 服务以使更改生效。
sudo systemctl restart sshd
验证是至关重要的一步,请务必在断开当前连接前完成!
检查服务监听状态:
使用ss
或netstat
命令查看sshd
进程是否正在监听新的端口。sudo ss -tnlp | grep sshd
你应该能看到类似以下的输出,表明服务正在 22 和 2222 端口上监听:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 0.0.0.0:2222 0.0.0.0:* users:(("sshd",pid=1234,fd=4))
测试新端口连接:
不要关闭当前的终端窗口! 新开一个本地终端窗口,尝试使用新端口连接到服务器。ssh username@your_server_ip -p 2222
如果能够成功登录,恭喜你,端口修改已经成功。
第五步:移除旧端口(可选但推荐)
在确认新端口工作正常一段时间后(例如一两天),为了彻底关闭自动化攻击的入口,你应该回到 SSH 配置文件中,移除旧的 22 端口。
- 再次编辑
/etc/ssh/sshd_config
:sudo vi /etc/ssh/sshd_config
- 删除或注释掉
Port 22
这一行,只保留Port 2222
。 - 重启 SSH 服务:
sudo systemctl restart sshd
- (可选)从防火墙中移除 22 端口:
sudo firewall-cmd --permanent --remove-service=ssh sudo firewall-cmd --reload
注意:
ssh
是一个预定义的服务,它指向 22 端口,直接移除服务比移除端口更规范。
至此,你已经成功地将 CentOS 服务器的 SSH 端口从默认的 22 修改为了自定义的 2222,并完成了所有相关的安全策略配置,服务器的安全性得到了显著提升。
相关问答 FAQs
Q1: 修改端口后,我无法通过新端口连接到服务器,被锁在外面了,该怎么办?
A: 这是修改端口时最常见的问题,通常由以下三个原因之一导致,需要有控制台(VNC、KVM等)访问权限来解决:
- 防火墙问题:登录服务器控制台,检查防火墙规则是否正确添加,运行
sudo firewall-cmd --list-all
,确认新端口(如2222/tcp
)在ports
列表中,如果没有,重新运行sudo firewall-cmd --permanent --add-port=2222/tcp
和sudo firewall-cmd --reload
。 - SELinux 问题:这是 CentOS 上最可能的原因,在控制台中运行
sudo semanage port -l | grep ssh
,查看新端口是否已关联到ssh_port_t
,如果没有,说明上一步的semanage
命令执行失败或有误,请重新执行sudo semanage port -a -t ssh_port_t -p tcp 2222
,你也可以通过sudo journalctl -xe
或sudo ausearch -m avc -ts recent
查看 SELinux 的拒绝日志。 - SSH 服务问题:检查
sshd
服务状态:sudo systemctl status sshd
,如果服务异常,可以根据输出的错误信息进行排查,最常见的错误是配置文件语法错误,可以通过sudo sshd -t
命令来测试配置文件。
Q2: 为什么教程中建议先同时保留新旧端口,而不是直接修改?
A: 这是一种“安全网”策略,强烈推荐给所有管理员,尤其是在生产环境中操作时,直接修改端口意味着一旦配置(无论是 sshd_config
、防火墙还是 SELinux)有任何一环出错,你的 SSH 连接会立即中断,且无法通过任何端口重新连接,只能通过服务器提供商的控制台救援,过程繁琐且耗时,通过先添加新端口,你保留了一个“退路”,你可以用新连接测试所有功能,确认万无一失后,再从容地移除旧端口,这个小小的步骤可以极大地降低操作风险,避免因小失大。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复