在安装官方版 CentOS7 情况下,如果更改默认的 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 模式:
# 切换到 Permissive 允许模式,1 为强制模式;
setenforce 0
这个方法的优点在于无需重启便可生效,但缺点也同样明显,一旦重启即失效。所以如果想长期生效,需换一种操作,即直接关闭 SELinux 服务:
# 打开文件
vi /etc/selinux/config
# 找到这一行:SELINUX=enforcing,修改为
SELINUX=disabled
修改完成后,保存重启即可。
如果vi进入/etc/selinux/config编辑模式下显示文件只读属性的话,需要再执行
lsattr /etc/selinux/config
# 执行如上命令,如果显示以下文件属性参数的话
----i--------e- /etc/selinux/config
# 继续执行chattr改变文件锁定属性
chattr -i /etc/selinux/config
# 好了,继续愉快的vi吧!
添加新端口
这个方法的优点在于可以保留 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 服务,不然更推荐使用第二种方法。此外,虽然报错的问题解决了,但别忘了还需要在防火墙中放行新增的端口。
评论 (0)