服务器在公网上难免会遇到端口暴力破解,通过 SSH 连接服务器时,可能会显示有几万个登陆失败。这篇文章简单介绍一下服务器 SSH 暴力破解的基本防护,让大家的服务器更加安全一些。
演示环境:基于 Centos 7 系统
主要从下面三个方向入手:
- SSH 密钥登陆,禁止密码登陆;
- 修改 SSH 默认端口,禁止 root 登陆;
- 使用 Fail2ban 等防护软件,自动封禁入侵 IP
SSH 密钥登陆,禁止密码登陆
SSH 密钥登录,就是 rsa 公钥放到服务器上,私钥放在客户端上,每次登录的时候,用密钥登录,这样更方便也更安全。
- 生成rsa密钥对
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:aa:bb:cc:dd:ee:ff username@localcomputer
The key's randomart image is:
+--[ RSA 2048]----+
| .. |
|ooO+.o |
| .. |
| . o.o |
| So *..Eo |
| .. .o.o = |
| ...+o ... |
| .o+ .+ . |
| .+ . |
+---------------------+
中间步骤直接回车即可,默认生成的密钥文件在root/.ssh目录下。
如果你想要使用密钥+密码双重验证登陆,在Enter passphrase
这一步,输入你设置的密码。
- 检查下.ssh目录下authorized_keys文件是否存在,没有的话,创建一个,然后将id_rsa.pub的内容追加到authorized_keys文件尾
cd .ssh
touch authorized_keys
cat id_rsa.pub >> authorized_keys
- 修改.ssh的权限为700, authorized_keys的权限为600或者更严格的400,否则登录的时候会提示server refuse you key,
cd ..
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
修改下ssh的配置
vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
注意:保持远程服务器登录,先不要退出,避免后续发生配置错误时,无法登录远程服务器。
在密钥登录设置成功之后,方可将PasswordAuthentication 设置为no,禁用密码登录了。
最后将私钥文件id_rsa拷贝到你的客户端,在终端登陆是加上-i 私钥文件id_rsa路径
,例如ssh root@192.168.1.1 -i /Users/User/Documents/key/id_rsa.key
。
在 Transmit 客户端登陆是,点击小钥匙导入密钥。

修改 SSH 默认端口,禁止 root 登陆;
修改 SSH 默认端口
vim /etc/ssh/sshd_config
将Port 22
中的22改为65534以下任意数字,同时开启端口防火墙。
重启ssh服务:/etc/init.d/sshd restart
禁止 root 登陆
新建一个用户并设置密码,例如yalv
useradd yalv
passwd yalv
vim /etc/ssh/sshd_config
将PermitRootLogin yes
改成no
,并重启SSH服务。
使用 Fail2ban 等防护软件,自动封禁入侵 IP
如果你使用的是lnmp一键包,自带有 Fail2ban 等防护软件。
cd /root/lnmp1.5/tools
./fail2ban.sh
#或者使用denyhosts
./denyhosts.sh
十分方便,如果手动安装的话,参考GitHub的文档。