前言
众所周知,SSH 用的默认是 22 端口。因为每台机子的端口都是一样的,黑客扫一个 IP 段的 22 端口就能扫出不少机子。虽然我自己的服务器禁止了密码登录,但是被爆破也不是好玩的事情,所以我决定更改 SSH 端口。
那么问题来了
我以前没用过CentOS,一直用的是 Debian/Ubuntu,改端口只需要改一下配置文件就行。
sudo vim /etc/ssh/sshd_config
去掉了 Port 前面的 # 号,把 22 改成了 1234,然后 service sshd restart。
于是问题又来了
netstat -antlp |grep 1234
发现居然没在监听 1234 端口,查看状态
service sshd status
sshd 居然炸了,大概是这么个输出:
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2016-05-05 03:30:48 UTC; 2s ago
Process: 10938 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Process: 10944 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=255)
Main PID: 10944 (code=exited, status=255)
May 05 03:30:48 ixnetwork-uk1 systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
May 05 03:30:48 ixnetwork-uk1 systemd[1]: Unit sshd.service entered failed state.
再看看日志(CentOS 的日志不是 syslog 而是 secure)
# tail /var/log/secure:
May 5 03:46:12 localhost sshd[11016]: error: Bind to port 1234 on 0.0.0.0 failed: Permission denied.
May 5 03:46:12 localhost sshd[11016]: error: Bind to port 1234 on :: failed: Permission denied.
May 5 03:46:12 localhost sshd[11016]: fatal: Cannot bind any address.
什么鬼??我明明用的是 root 怎么会提示权限不够?
解决方法
于是谷歌了一下,发现 CentOS 还有另外一层保护,就是 SELinux。
执行一下
semanage port -l | grep ssh
就会发现 ssh 只允许监听 22。
好咯,那我就把 1234 添加进列表里面:
semanage port -a -t ssh_port_t -p tcp 1234
再重启 sshd
service sshd restart
看一下 status:
# service sshd status
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
Active: active (running) since Thu 2016-05-05 03:54:09 UTC; 7s ago
Process: 10938 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 11076 (sshd)
CGroup: /system.slice/sshd.service
└─11076 /usr/sbin/sshd -D
May 05 03:54:09 ixnetwork-uk1 systemd[1]: Started OpenSSH server daemon.
May 05 03:54:09 ixnetwork-uk1 sshd[11076]: Server listening on 0.0.0.0 port 1234.
May 05 03:54:09 ixnetwork-uk1 sshd[11076]: Server listening on :: port 1234.
好了现在正常了。
附录:
1、问题: semanage command not found.
解决: yum install policycoreutils-python
2、问题: 如何确定 semanage 是哪个程序包提供的?
解决: yum provides semanage
3、问题: 为什么我直接 service sshd restart 没有问题?
解决: 因为你系统禁用了 SELinux.
参考来源:
1、解决CentOS更改ssh端口后报错的问题
2、semanage command not found on CentOS 7 and RHEL 7
Windows 10Chrome 62.0.3202.94来自 云南 的大神
奇怪了,firewall 相关端口开启了,sshd 配置文件也添加 port 行,重启了,semanage 的 ssh 端口也给添加了,使用新端口连接时依然 timeout。可还有其他可能有问题的地方吗?
谢谢。
需确认,没有其他防火墙阻挡,例如华为云,在控制面板上还有一层防火墙,在这里也要允许通过,但是如果修改前的 22 端口就已经 timeout,那只能考虑更换 IP 了。
SELinux 开启了也会影响,可以使用 setenforce 0 命令临时关闭来排查。