Web服务器暴露在公网中,面临端口扫描、暴力破解、DDoS等多种威胁。iptables作为Linux内核级防火墙,是保护Web服务器的第一道防线。本文从实战角度出发,给出一套完整、可落地的iptables防护方案。
一、iptables基础概念
iptables基于Netfilter框架工作,通过定义规则链(Chain)对网络数据包进行过滤。核心概念包括:
- 表(Table):filter表最常用,负责包过滤;nat表处理地址转换;mangle表修改包头部
- 链(Chain):INPUT(入站)、OUTPUT(出站)、FORWARD(转发)三条内置链
- 规则(Rule):匹配条件 + 执行动作,按顺序依次匹配
对于Web服务器防护,我们主要关注 filter表的INPUT链。
二、安全配置的核心原则
默认拒绝策略
最安全的做法是默认拒绝所有入站流量,再逐条放行所需服务:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
先放行回包
必须首先允许已建立连接的回包,否则服务器无法正常通信:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许本地回环
iptables -A INPUT -i lo -j ACCEPT
三、Web服务端口放行
HTTP与HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
SSH管理端口
建议修改默认22端口,并限制来源IP:
# 仅允许指定IP访问SSH
iptables -A INPUT -p tcp -s 你的管理IP --dport 22 -j ACCEPT
如果无法固定管理IP,至少启用连接速率限制:
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 5 -j ACCEPT
四、防暴力破解策略
利用recent模块封禁扫描器
对SSH端口短时间内多次尝试连接的IP自动封禁:
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
60秒内超过3次新连接则丢弃后续请求。
对Web端口也做速率限制
防止应用层CC攻击和暴力扫描:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/min --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/min --limit-burst 100 -j ACCEPT
五、防DDoS基础措施
SYN Flood防护
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
禁止无效包
iptables -A INPUT -m state --state INVALID -j DROP
防止Ping洪水
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
六、日志与调试
对被拒绝的包记录日志,便于排查问题:
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: " --log-level 4
日志会写入 /var/log/messages 或 /var/log/syslog,可通过 grep iptables-dropped 快速筛选。
七、规则持久化
iptables规则重启后丢失,必须持久化保存:
# CentOS/RHEL
yum install iptables-services
service iptables save
# Ubuntu/Debian
apt install iptables-persistent
netfilter-persistent save
八、完整配置脚本汇总
将以上规则整合为一个可执行脚本,按正确顺序排列:
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 回包放行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 本地回环
iptables -A INPUT -i lo -j ACCEPT
# SSH(限速+recent防暴力)
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
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# SYN Flood防护
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 禁止无效包
iptables -A INPUT -m state --state INVALID -j DROP
# Ping限速
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 日志
iptables -A INPUT -j LOG --log-prefix "iptables-dropped: " --log-level 4
九、注意事项
- 远程操作务必谨慎:设置DROP默认策略前,确保SSH放行规则已就位,否则会被锁在外面
- 规则顺序很重要:iptables从上到下匹配,先匹配到的规则生效,放行规则要排在拒绝规则之前
- 配合应用层防护:iptables是网络层防火墙,对应用层攻击(如SQL注入、XSS)无能为力,需搭配WAF使用
- 定期审查规则:业务变化后及时调整端口放行策略,避免开放不必要的服务端口
- 考虑使用firewalld:CentOS 7+默认使用firewalld作为前端,它底层仍调用iptables/nftables,可根据团队习惯选择
iptables虽然语法略显复杂,但作为内核级防火墙,性能开销极低,是Web服务器安全防护的必备工具。配合fail2ban等自动化工具,可以构建更加完善的防御体系。