利用 iptables 构建精细化 SSH 访问控制策略:从基础规则到高级防护
1. 为什么需要精细化控制SSH访问?
SSH作为服务器管理的黄金通道,就像你家大门的钥匙。我见过太多因为SSH端口暴露在公网,被暴力破解攻陷的案例。有一次凌晨三点被报警短信吵醒,发现服务器CPU飙到100%——原来是有脚本小子在用字典疯狂尝试登录。从那以后,我就养成了用iptables给SSH加"防盗门"的习惯。
传统防火墙只能做简单的开关控制,而iptables的强大之处在于能实现外科手术式的精准管控。比如你可以:
- 只允许公司IP段访问生产服务器
- 对频繁尝试的IP自动封禁
- 不同安全级别的服务器设置差异化的访问策略
- 结合Fail2ban实现动态防御
2. 基础防护四件套
2.1 默认拒绝策略
安全领域有句老话:"默认拒绝,按需放行"。我们先给服务器装上"防盗门":
iptables -P INPUT DROP # 默认拒绝所有入站 iptables -P FORWARD DROP # 禁止流量转发 iptables -P OUTPUT ACCEPT # 允许所有出站这个组合拳的效果就像把房子所有门窗都锁上,只留一个猫眼观察外面。但要注意,执行前确保你当前SSH连接不会中断,最好通过控制台操作。
2.2 白名单机制
我习惯把可信IP放在单独的文件里管理,比如/etc/iptables/allow_ips:
192.168.1.100 203.0.113.5然后用这个脚本动态加载:
ALLOW_IPS=$(grep -v '^#' /etc/iptables/allow_ips) for ip in $ALLOW_IPS; do iptables -A INPUT -p tcp -s $ip --dport 22 -j ACCEPT done更新IP列表后只需重新加载脚本,比直接写死规则灵活多了。建议配合版本控制管理IP列表变更。
2.3 本地回环处理
很多新手会忽略这个细节——本地服务通信也需要放行:
iptables -A INPUT -i lo -j ACCEPT不加这条规则可能导致MySQL本地连接、Docker容器通信等异常。曾经有同事花了三天排查的"灵异问题",最后发现就是这个规则没加。
2.4 状态检测机制
这条规则能放行已建立的合法连接:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT它的作用相当于"认识的人可以继续聊天,陌生人需要查身份证"。特别是对于FTP这类多端口协议必不可少。
3. 高级防御策略
3.1 端口敲门技术
这个酷炫的技术就像秘密接头暗号:只有按特定顺序"敲门"才会开放端口。先安装knockd:
apt install knockd # Ubuntu yum install knockd # CentOS配置/etc/knockd.conf:
[options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn使用时先用telnet按顺序敲端口,再连接SSH。实测能减少99%的自动化扫描。
3.2 速率限制
防止暴力破解的利器:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 -j DROP这个组合拳的意思是:每分钟新建连接超过5次就封禁。我一般会配合日志监控:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "然后在/var/log/syslog里就能看到实时攻击情况。
3.3 地理封锁
用ipset可以轻松实现国家级别过滤。先安装geoip数据库:
apt install xtables-addons-common libtext-csv-xs-perl # Ubuntu然后生成国家IP集:
/usr/lib/xtables-addons/xt_geoip_dl /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv拒绝特定国家访问:
iptables -A INPUT -m geoip --src-cc CN,US -j DROP4. 实战中的经验技巧
4.1 规则优化排序
iptables规则是顺序匹配的,应该把高频规则放在前面。我常用的优先级是:
- 放行本地流量
- 放行ESTABLISHED连接
- 放行白名单IP
- 速率限制规则
- 默认拒绝策略
可以用这个命令查看规则匹配计数:
iptables -L -v -n --line-numbers4.2 双因素验证方案
结合Google Authenticator实现二次验证:
apt install libpam-google-authenticator # Ubuntu google-authenticator然后在/etc/pam.d/sshd添加:
auth required pam_google_authenticator.so最后在iptables里放行UDP 123端口用于NTP时间同步。
4.3 灾备方案
永远要准备Plan B!我推荐两种方式:
- 在crontab设置定时解锁:
*/5 * * * * root iptables -D INPUT -p tcp --dport 22 -j DROP- 配置备用端口,比如在2222端口保留一个备用SSH通道
5. 持久化与监控
5.1 规则保存
不同系统的保存方式:
# Ubuntu/Debian iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 # CentOS/RHEL service iptables save建议安装iptables-persistent包实现自动加载:
apt install iptables-persistent5.2 可视化监控
用这些工具可以直观查看攻击情况:
iftop实时流量监控goaccess分析日志grafana配合Prometheus展示趋势
我常用的监控命令:
watch -n 1 'iptables -nvL | grep -A 10 "Chain INPUT"'5.3 自动化维护
用这个脚本定期清理旧规则:
#!/bin/bash # 清除30天前的封禁记录 iptables -L INPUT -v -n | grep DROP | awk '{print $8}' > /tmp/banned_ips while read ip; do iptables -D INPUT -s $ip -j DROP done < /tmp/banned_ips添加到crontab每周运行一次即可。
