一、简介
iptables 是 Linux 系统用户空间的防火墙配置工具,通过与内核模块 Netfilter 协作,实现网络数据包的过滤、网络地址转换(NAT)、流量控制等功能。
Netfilter 是内核级的框架,通过 钩子(Hooks) 在协议栈关键节点拦截数据包,iptables 通过规则定义数据包的处理逻辑。
二、核心功能
功能 | 说明 | 典型应用场景 |
---|---|---|
包过滤 | 根据规则允许/拒绝数据包 | 防火墙、入侵防御 |
NAT | 修改数据包的源或目标地址 | 共享上网、端口转发 |
流量标记 | 修改数据包元数据(如TTL、QoS标记) | 服务质量(QoS)管理 |
连接跟踪 | 跟踪网络连接状态(如NEW/ESTABLISHED) | 有状态防火墙、动态协议支持 |
日志记录 | 记录匹配规则的数据包信息 | 安全审计、故障排查 |
三、命令体系
1. 表(Tables)与链(Chains)
表名 | 功能 | 内置链 |
---|---|---|
filter | 包过滤(默认表) | INPUT, FORWARD, OUTPUT |
nat | 网络地址转换 | PREROUTING, POSTROUTING, OUTPUT |
mangle | 修改数据包 | 所有五个链(PREROUTING/INPUT等) |
raw | 绕过连接跟踪 | PREROUTING, OUTPUT |
2. 命令语法格式
iptables -t <表名> <操作命令> <链名> <匹配条件> -j <动作>
- 常用操作命令:
-A
(追加规则)、-I
(插入规则)、-D
(删除规则)、-L
(列出规则)、-F
(清空规则)。 - 常见动作:
ACCEPT
(允许)、DROP
(静默丢弃)、REJECT
(拒绝并返回错误)、LOG
(记录日志)、DNAT/SNAT
(地址转换)。
3. 核心匹配模块
模块 | 功能 | 示例 |
---|---|---|
-m state | 匹配连接状态 | -m state --state ESTABLISHED |
-m multiport | 匹配多个端口 | --dports 80,443 |
-m time | 按时间匹配 | --timestart 09:00 --timestop 18:00 |
-m string | 匹配数据包内容 | --string "/admin/" --algo bm |
-m connlimit | 限制连接数 | --connlimit-above 100 |
四、应用场景与配置示例
场景1:基础防火墙配置
需求:允许SSH、HTTP/HTTPS,拒绝其他入站流量。
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
场景2:共享上网(SNAT)
需求:内网(192.168.1.0/24)通过网关访问互联网。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
场景3:端口转发(DNAT)
需求:公网8080端口转发到内网Web服务器(192.168.1.100:80)。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
场景4:防御DDoS攻击
需求:限制单个IP对SSH端口的连接频率(每秒最多5次)。
iptables -N SSH_LIMIT
iptables -A SSH_LIMIT -m recent --set --name SSH
iptables -A SSH_LIMIT -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
iptables -A SSH_LIMIT -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j SSH_LIMIT
场景5:流量优先级控制
需求:优先处理VoIP流量(UDP 5060-5080端口)。
# 标记流量
iptables -t mangle -A PREROUTING -p udp --dport 5060:5080 -j MARK --set-mark 1
# 配置TC队列
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80mbit prio 0
tc filter add dev eth0 protocol ip parent 1:0 prio 0 handle 1 fw flowid 1:10
五、高级功能与调试
1. 规则持久化
# 保存规则
iptables-save > /etc/iptables/rules.v4
# 开机自动加载
apt install iptables-persistent # Debian/Ubuntu
systemctl enable netfilter-persistent
2. 连接跟踪查看
conntrack -L # 查看当前连接
cat /proc/net/nf_conntrack # 原始连接跟踪数据
3. 日志分析
# 记录被拒绝的流量
iptables -A INPUT -j LOG --log-prefix "[IPTABLES DROP] " --log-level 4
# 查看日志
tail -f /var/log/syslog | grep "IPTABLES DROP"
六、知识要点总结
类别 | 核心要点 |
---|---|
表与链的优先级 | raw → mangle → nat → filter,按钩子位置顺序执行 |
NAT类型选择 | DNAT在PREROUTING 链,SNAT在POSTROUTING 链,MASQUERADE用于动态IP |
状态防火墙 | 使用-m conntrack --ctstate 匹配连接状态(NEW/ESTABLISHED/RELATED) |
QoS流量控制 | 结合tc 和MARK 标记实现带宽分配与优先级调度 |
安全审计 | LOG 动作配合syslog记录流量日志,便于事后分析 |
七、常见问题与解决
-
规则不生效
- 检查表与链的对应关系(如NAT规则必须写在
nat
表)。 - 确认
net.ipv4.ip_forward=1
已启用(NAT需转发支持)。
- 检查表与链的对应关系(如NAT规则必须写在
-
FTP被动模式失败
- 加载
nf_conntrack_ftp
模块:modprobe nf_conntrack_ftp
。 - 放行
RELATED
状态流量:iptables -A INPUT -m conntrack --ctstate RELATED -j ACCEPT
。
- 加载
-
TC配置复杂
- 使用
htb
简化队列管理,优先保障关键业务流量。
- 使用
八、扩展阅读
- ipset:高效管理大规模IP/端口集合,提升规则匹配性能。
- nftables:iptables的下一代替代工具,支持更简洁的语法和更高效的规则管理。
- Suricata:结合iptables实现深度包检测(DPI)和入侵防御(IPS)。
通过系统学习iptables,您可构建灵活高效的网络管控方案,应对企业级安全与性能挑战!