在安装官方版 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 的监听端口。

既然知道了原因,解决方法也简单:

  1. 直接关闭 SELinux 功能;
  2. 添加一个新的 ssh 监听端口;

解决

关闭 SELinux

在关闭 SELinux 前,可以用命令 getenforce 查看当前的状态,一般默认是 Enforcing,即强制模式(违法 SELinux 规则的行为将被组织并记录到日志中)。此外还有另一种状态 Permissive,即允许模式,在这个模式下违法策略的行为仅做记录。

所以如果只做临时使用,可以简单的切换到 Permissive 模式:

# 切换到 Permissive 允许模式,1 为强制模式;
setenforce 0

这个方法的优点在于无需重启便可生效,但缺点也同样明显,一旦重启即失效。所以如果想长期生效,需换一种操作,即直接关闭 SELinux 服务:

# 打开文件
vi /etc/selinux/config
# 找到这一行:SELINUX=enforcing,修改为
SELINUX=disabled

修改完成后,保存重启即可。

添加新端口

这个方法的优点在于可以保留 SELinux 功能的同时解决了端口报错的问题,略微不便的是该方法需要联网安装一个命令 semanage

# provides 参数可以查看 semanage 包含在哪个安装包中
yum provides semanage
# 得到结果后,再使用 install 参数安装
yum install policycoreutils-python -y

policycoreutils-python 安装成功后,便可以使用 semanage 命令来添加端口,不过首先查看一下默认绑定的端口:

# 查看 ssh 绑定的端口
semanage port -l | grep ssh
# 可以看到返回的是默认的 22 端口
ssh_port_t                     tcp      22

然后可以着手添加新端口,这里以 22022 为例:

# 添加 22022 端口,注意这里的名称是 ssh_port_t
semanage port -a -t ssh_port_t -p tcp 22022
# 验证下是否添加成功
semanage port -l | grep ssh
# 可以看到 22022 已在返回结果中
ssh_port_t                     tcp   22022, 22
  • -l:查看记录
  • -a:添加
  • -m:修改
  • -d:删除
  • -t:添加类型
  • -p:指定端口类型(tcp、udp)

最后

两个方法各有优劣,不过除非说有要求关闭 SELinux 服务,不然更推荐使用第二种方法。此外,虽然报错的问题解决了,但别忘了还需要在防火墙中放行新增的端口。