一、极简版(个人开发机/VPS)
特点:干净、无注释、适合刚装系统时一把梭。
#!/bin/bash
# 清空所有规则
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
# 默认策略:进站拒绝,出站允许
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ==== 放行服务端口(改成你自己的)====
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
# 记录并丢弃其他
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: "
iptables -A INPUT -j DROP
# 保存
service iptables save
二、标准版(Web服务器/生产环境)
特点:防扫描、限连接、ICMP控制、适合放公网的业务服务器。
#!/bin/bash
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ==== ICMP(ping)====
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# ==== 放行服务端口 ====
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH(建议改端口)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT # MySQL(仅内网)
# ==== 防CC/防爆破(SSH)====
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# ==== 防端口扫描 ====
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# ==== 连接数限制(单IP 80/443 并发)====
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j REJECT
# 记录丢弃包
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
iptables -A INPUT -j DROP
# 保存
service iptables save
iptables-save > /etc/sysconfig/iptables
三、严格版(内网机器/数据库/堡垒机)
特点:只允许指定IP访问,其他人全拦。
#!/bin/bash
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 本地回环
iptables -A INPUT -i lo -j ACCEPT
# 已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ==== 白名单(改成你的运维IP)====
iptables -A INPUT -s 10.0.0.1 -j ACCEPT # 办公室公网IP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 内网段
iptables -A INPUT -s 172.16.0.0/12 -j ACCEPT # 内网容器段
# ==== 特定服务放行(但依然限制源IP)====
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.1 -j ACCEPT # 仅指定IP可SSH
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT # 仅内网访问MySQL
# 拒绝其余
iptables -A INPUT -j LOG --log-prefix "IPT-STRICT-DROP: "
iptables -A INPUT -j DROP
service iptables save
四、防御常见攻击(在标准版之上叠加)
放在 -A INPUT -j ACCEPT 之后,DROP 之前。
# 1. 防SYN Flood(限制每秒握手数)
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 2. 防HTTP慢速攻击(限制包大小)
iptables -A INPUT -p tcp --dport 80 -m length --length 0:200 -j DROP
# 3. 防UDP Flood(非必要端口直接禁)
iptables -A INPUT -p udp --dport 1:65535 -j DROP
# 4. 防恶意爬虫(根据UA,谨慎使用)
iptables -A INPUT -p tcp --dport 80 -m string --string "python-requests" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "Go-http-client" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "scrapy" --algo bm -j DROP
# 5. 防IP分片攻击
iptables -A INPUT -f -j DROP
五、一键应用+备份+开机自启
chmod +x iptables.sh
./iptables.sh
# 确保开机自启
systemctl enable iptables
systemctl restart iptables
# 备份当前规则(万一手滑)
iptables-save > /root/iptables_backup_$(date +%Y%m%d).rules
六、 重要避坑
1. 不要直接跑 SSH 端口白名单时把自己踢出去
# 错误做法
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 如果这条没刷进去,你立刻断连
# 正确做法(加延时):
iptables -P INPUT DROP; sleep 10; iptables -P INPUT ACCEPT
# 或者:screen 里执行 + crontab 保底
2. Docker 会直接绕过 iptables
如果你在用 Docker,-P INPUT DROP 会让容器端口无法从外部访问。
解决方案:
- 把规则加在
DOCKER-USER链 - 或改用
firewalld管理
3. 优先使用云厂商安全组
如果你在云上(腾讯云/阿里云),安全组优先级高于 iptables。
建议:
- 安全组做粗粒度拦截(地区、协议)
- iptables 做细粒度限速/防扫描
总结:
- 个人VPS → 极简版
- 公网Web → 标准版 + 防CC
- 内网DB → 严格版
- 对抗DDoS → 别折腾 iptables,直接上高防
发表回复