在运维过程中,修改Linux系统的默认SSH端口是常见的操作,这样做有助于提高系统的安全性。然而,在修改过程中,很多人会遇到明明已按正确格式修改配置文件,但重启SSH服务后却出现报错,或系统仍然使用原来的22号端口的情况。这是什么原因呢?下面将对如何排查进行分析讲解。首先检查SSH服务端配置文件的正确性。打开文件后,查看Port参数是否已取消注释(即删除行首的#),且端口号为纯数字,无多余空格或特殊字符。同时,应避免配置多个Port行(若配置多个端口,仅最后一个会生效)。可通过执行sshd -t命令验证配置语法,若输出“OK”则表示语法无问题,若报错则需根据提示进行修正。一般情况下,用户不会出现此类错误。如果检查配置文件未发现错误,大概率是由于系统启用了SELinux导致的。SELinux默认仅允许SSH使用22端口。若系统已启用SELinux(可通过执行sestatus命令查看,显示enabled即为开启状态),需先通过命令semanage port -l | grep ssh
查看系统允许的SSH端口。若新端口不在列表中,执行semanage port -a -t ssh_port_t -p tcp 新端口号
添加规则。添加规则后无需重启SELinux,直接重启SSH服务即可。semanage全称为SELinux Policy Management Tool(SELinux 策略管理工具),是管理SELinux(安全增强型 Linux)策略的核心命令行工具,其核心作用是让系统管理员无需直接编辑复杂的SELinux底层策略文件(如.te策略模块),就能灵活、安全地配置SELinux的各类关键规则。相比于chcon(临时修改文件上下文)、setsebool(仅管理布尔值)等工具,semanage的优势在于可配置永久生效的SELinux规则,且覆盖的配置维度更全面,是日常运维中排查和解决SELinux权限问题的核心工具。运维中使用频率最高的功能就是端口策略管理,用于管理SELinux允许的服务端口映射,SELinux会为不同服务定义专属的端口类型(如ssh_port_t对应SSH、http_port_t对应Apache/Nginx),只有将端口绑定到对应类型,服务才能通过SELinux的权限检查。semanage并非Linux系统默认安装的工具,在CentOS、RHEL等发行版的最小化安装环境中需要手动安装依赖包:CentOS 7/8:安装policycoreutils-python-utils,命令为yum install policycoreutils-python-utils -y;CentOS 9/RHEL 9:安装policycoreutils-python3-utils,命令为dnf install policycoreutils-python3-utils -y。
检查完SeLinux后,还需要检查防火墙是否放行新端口,若使用firewalld,通过firewall-cmd --list-ports查看已开放端口,若无新端口,执行firewall-cmd --permanent --add-port=新端口号/tcp
添加规则,再用firewall-cmd --reload生效;若使用iptables,通过iptables -L -n | grep 新端口号查看规则,无规则则执行iptables -A INPUT -p tcp --dport 新端口号 -j ACCEPT
并通过service iptables save保存规则,避免重启后失效。如果SeLinux和防火墙都放行了,还是报错,那就有可能是文件属性错了,sshd_config权限通常为600,属主属组为root。也有可能是文件覆盖了,部分系统会通过/etc/ssh/sshd_config.d/目录下的自定义配置文件覆盖主配置,需查看该目录下是否有文件包含Port参数,若有需删除或修改其中的端口配置,确保与主配置一致。还要确保端口没有被其它程序占用,可以使用lsof -i :端口号,查看端口是否被占用。