在安装官方版 CentOS 7 情况下,如果更改默认的 22 远程端口,然后打算用 systemctl restart sshd
命令使端口更改生效时,将会得到一个错误提示:
Job for sshd.service failed because the control process exited with error code. See “systemctl status sshd.service” and “journalctl -xe” for details.
而且如果此时重启,甚至连 ssh 服务都无法正常运行。
原因
报错原因其实是 SELinux(Security-Enhanced Linux) 所致。 SELinux 中文名为安全增强型 Linux, 是 Linux 内核的一个安全模块,提供了访问控制安全策略机制,SELinux 默认情况下限制了 ssh 的监听端口。
既然知道了原因,解决方法也简单:
- 直接关闭 SELinux 功能;
- 添加一个新的 ssh 监听端口;
解决
关闭 SELinux
在关闭 SELinux 前,可以用命令 getenforce
查看当前的状态,一般默认是 Enforcing
,即强制模式(违法 SELinux 规则的行为将被组织并记录到日志中)。此外还有另一种状态 Permissive
,即允许模式,在这个模式下违法策略的行为仅做记录。
所以如果只做临时使用,可以简单的切换到 Permissive
模式:
这个方法的优点在于无需重启便可生效,但缺点也同样明显,一旦重启即失效。所以如果想长期生效,需换一种操作,即直接关闭 SELinux 服务:
修改完成后,保存重启即可。
添加新端口
这个方法的优点在于可以保留 SELinux 功能的同时解决了端口报错的问题,略微不便的是该方法需要联网安装一个命令 semanage
:
policycoreutils-python 安装成功后,便可以使用 semanage
命令来添加端口,不过首先查看一下默认绑定的端口:
然后可以着手添加新端口,这里以 22022 为例:
- -l:查看记录
- -a:添加
- -m:修改
- -d:删除
- -t:添加类型
- -p:指定端口类型(tcp、udp)
最后
两个方法各有优劣,不过除非说有要求关闭 SELinux 服务,不然更推荐使用第二种方法。此外,虽然报错的问题解决了,但别忘了还需要在防火墙中放行新增的端口。