其实最开始想的很简单,就是改改SSH配置,让暴力破解难度大一点。后面加了二次登录认证和与防火墙联动以及密码强度增强。这样多从认证,可以使安全系数极大提升,但是争对黑客而言这些确实有难度,但也不是完全不可攻破,任何系统和应用都会存在安全漏洞风险和bug,如果经发现的漏洞还是推荐尽快升级修复漏洞,避免漏洞被利用。
本教程不保证随着系统和软硬件升级后一直有效,进行任何安全措施前请先在自己个人服务器或者测试环境测试验证后再上线,不要直接在生产环境改,容易把自己关门外。也可能带来其他未知问题。
首页:禁止root直接登录这个必须做,毕竟root用户名是公开的。自己先创建个普通用户,需要root权限的时候sudo一下就行。记得systemctl restart sshd。禁用root需要编辑/etc/ssh/sshd_config,找到PermitRootLogin,改成no。
其次:把22端口改掉,这招对真正的黑客没啥用,用nmap扫一下就知道你新端口是多少。但可以挡住大部分低级的扫描器,日志干净很多。如果端口改成了2234,防火墙那边也要放行,别忘了把22端口关掉。改完之后自己先别退出SSH,另开一个窗口测试新端口能不能连上,不然把自己锁外面就尴尬了——别问我怎么知道的。
最后:限制登录重试次数在sshd_config里加上MaxAuthTries 3,意思是最多试3次密码,3次都不对就断开连接。还有一个LoginGraceTime 30s,30秒内没登录成功也断开。这些都能让爆破效率低很多。
文章最后加了一些内容,请在阅读完后再验证,部分来自AI,本教程请在Ubuntu系统下验证,Centos目前没写。
一、SSH 自身加固
1. 禁止 root 直接登录
# 编辑 /etc/ssh/sshd_config
PermitRootLogin no
2. 禁用密码登录,改用密钥认证
# 客户端生成密钥对,将公钥追加到服务器的 ~/.ssh/authorized_keys
# 然后修改 sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
3. 修改默认端口(避开扫描器)
Port 2234 # 改成非22端口,记得防火墙放行
4. 限制登录失败次数和超时
MaxAuthTries 3 # 最多尝试3次密码
MaxSessions 3 # 最多3个会话
LoginGraceTime 30s # 登录超时30秒
5. 允许特定用户/组登录
AllowUsers alice bob # 只允许这些用户
AllowGroup sshusers # 只允许该组用户
二、自动封禁工具
1:fail2ban(封IP)
原理:监控日志,失败次数过多则写入防火墙规则临时封禁。
安装与配置(以 Ubuntu/Debian 为例)
apt update && apt install fail2ban -y
创建本地配置:
cat > /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 3600 # 封禁1小时
findtime = 600 # 10分钟内失败超过次数则封
maxretry = 5 # 允许失败5次
banaction = iptables-multiport
action = %%(action_mwl)s
[sshd]
enabled = true
port = ssh # 若改过端口,这里写实际端口
logpath = /var/log/auth.log
backend = auto
EOF
启动并开机自启
systemctl enable fail2ban --now
常用命令
fail2ban-client status sshd # 查看状态
fail2ban-client set sshd unbanip 192.168.1.100 # 手动解封
2:DenyHosts(轻量,只针对SSH,已安装fail2ban可忽略)
适用:资源紧张或不喜欢 fail2ban 的复杂配置。
apt install denyhosts -y
# 配置文件 /etc/denyhosts.conf
systemctl enable denyhosts --now三、网络层防御
1. 使用 iptables 限制单位时间连接数
# 每分钟最多4个新SSH连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP四、配置优先级建议
| 个人云服务器(暴露22端口) | 1. 改端口 + 2. 密钥登录 + 3. fail2ban |
| 企业内部堡垒机 | 1. 密钥登录 + 2. 禁止root + 3. 只允许跳板机IP(白名单) |
| 高安全级关键系统 | 1. 关闭密码 + 2. 跳板机 + 3. 端口敲门 + 4. 二次认证(Google Authenticator) |
下面脚本快速开启 fail2ban + 基本加固(需要 root 执行)
#!/bin/bash
# 修改SSH配置
sed -i 's/^#MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
# 安装 fail2ban
if command -v apt >/dev/null; then apt update && apt install fail2ban -y; fi
if command -v yum >/dev/null; then yum install epel-release -y && yum install fail2ban -y; fi
cat > /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
EOF
systemctl enable fail2ban --now
echo "SSH防爆破已启用"
五、密码强度增强:别让人随便猜
默认的Linux密码策略太松了,可改PAM
强制复杂密码(pam_pwquality)
apt install libpam-pwquality -y
然后编辑 /etc/pam.d/common-password,找到这一行:
password requisite pam_pwquality.so retry=3
#改成
password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 reject_username
解释一下:最小12位,至少1个大写、1个小写、1个数字、1个特殊字符,不能包含用户名。
密码历史记录(防止重复使用)
在 common-password,在 pam_unix.so 后面加上 remember=5:
##修改密码时,最近5次用过的不能再用
password sufficient pam_unix.so remember=5 use_authtok
3. 账户锁定(输错太多次锁用户,不锁IP)
这个和fail2ban不同,fail2ban锁IP,这个锁用户名。
安装 pam_tally2,编辑 /etc/pam.d/sshd,在第一行加入:
auth required pam_tally2.so deny=5 unlock_time=600 onerr=fail
连续输错5次密码,这个用户被锁10分钟。即使是合法用户
在文件末尾加 auth required pam_tally2.so reset,用户成功登录后计数器清零。
六、二次认证:Google Authenticator(TOTP)
1. 这个最常用,手机上的验证码。
apt install libpam-google-authenticator -y
2. 为用户生成密钥
切换到你想开启二次认证的用户(或所有需要SSH的用户),运行:
google-authenticator
然后根据提示选择即可,完成后屏幕上会出一个二维码,在手机上的谷歌验证器或者Microsoft Authenticator扫描。下面还有几串备用码,记下来,防止手机丢了还能用。
3. 配置PAM
编辑 /etc/pam.d/sshd,在文件最开头加上:
auth required pam_google_authenticator.so
注释掉原来的 @include common-auth(如果还想保留密码验证,不要注释,下面会说怎么同时用)。
配置SSH:
编辑 /etc/ssh/sshd_config:
ChallengeResponseAuthentication yes
# 注意:不要设置AuthenticationMethods,因为我们要密码+验证码
同时确保 PasswordAuthentication yes(保留密码)。
重启SSH:systemctl restart sshd
登录时会先提示 Password:,输完密码后提示 Verification code:,需要再输入手机上的动态码。两个都对才让进。
踩坑:如果你之前开了密钥登录,并且设置了 AuthenticationMethods publickey,password 之类的,会冲突。建议先只保留密码+验证码,稳定再调。
七、防火墙联动:让fail2ban操作iptables
fail2ban默认就用iptables,但是有时候需要自定义,比如封禁时还要记录日志、发邮件等。
1. 确认action配置

编辑 /etc/fail2ban/jail.local,在 [sshd] 段里加上:
action = iptables-multiport[name=sshd, port=ssh, protocol=tcp]
表示使用iptables的multiport模块,可以同时封禁多个端口。如果你的SSH端口不是22,改成 port=2234
2.自定义action(同时封禁IP并记录到黑名单)
创建一个 /etc/fail2ban/action.d/iptables-block-log.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = iptables -I f2b-sshd 1 -s <ip> -j DROP && echo "`date`: banned <ip>" >> /var/log/f2b-custom.log
actionunban = iptables -D f2b-sshd -s <ip> -j DROP && echo "`date`: unbanned <ip>" >> /var/log/f2b-custom.log
在 jail.local 里用 action = iptables-block-log。这样每次封禁和解封都有日志,方便查看。
验证防爆破:
从另一台机器故意输错 SSH 密码 5 次以上。
检查封禁:fail2ban-client status sshd,应显示 banned IP 列表。
用正确密码再登录,会发现连接被拒绝(防火墙拦截)。
pam_tally2 --user nobody 显示失败次数
fail2ban-client status sshd 显示你的IP被封
iptables -L f2b-sshd -n 能看到你的IP在DROP列表
最后送一句:任何安全措施都要先测试再上线,别在生产环境直接改,容易把自己关门外。
本文最后更新时间 2026-05-28
文章链接地址:https://yrajsh.cn/index.php/archives/139/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处