即插即用的四种iptables模板


一、极简版(个人开发机/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,直接上高防

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注