1. iptables基础概念解析
在Linux系统中,网络数据包过滤功能主要由内核模块netfilter提供,而iptables则是用户空间用于配置netfilter规则的命令行工具。这套机制通过在内核网络协议栈的关键位置设置检查点(hook points),对数据包进行拦截和处理。
iptables规则由表(tables)、链(chains)、规则(rules)三个层级构成。默认包含filter(过滤)、nat(地址转换)、mangle(特殊包修改)和raw(连接跟踪豁免)四张表。每张表内置了不同的链,比如filter表的INPUT、FORWARD、OUTPUT链,分别对应不同流向的数据包。
注意:不同Linux发行版中,iptables工具可能默认不安装。在CentOS/RHEL中需要执行
yum install iptables-services,在Debian/Ubuntu中则是apt install iptables
2. 规则配置核心语法详解
2.1 基本命令结构
完整的iptables命令格式如下:
bash复制iptables [-t 表名] 命令选项 链名 匹配条件 -j 目标动作
其中-t参数指定操作的表(默认为filter),常用命令选项包括:
- -A:追加规则到链尾
- -I:插入规则到指定位置
- -D:删除规则
- -L:列出规则
- -F:清空链规则
2.2 匹配条件参数
匹配条件决定了规则的应用范围,常用参数包括:
- -p:协议类型(tcp/udp/icmp等)
- -s:源IP地址
- -d:目标IP地址
- --sport/--dport:源/目标端口
- -i/-o:输入/输出网络接口
- -m:扩展模块(如state、multiport等)
2.3 目标动作说明
-j参数指定匹配后的处理动作:
- ACCEPT:允许通过
- DROP:静默丢弃
- REJECT:拒绝并返回错误
- LOG:记录日志
- SNAT/DNAT:地址转换
- MASQUERADE:动态SNAT
3. 典型配置场景实战
3.1 基础防火墙配置
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 OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放SSH端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许ICMP(ping)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
3.2 NAT转发配置示例
实现局域网共享上网:
bash复制# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 设置SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 允许转发
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
3.3 端口转发配置
将公网IP的8080端口转发到内网服务器:
bash复制iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
4. 高级技巧与优化
4.1 规则优化策略
- 将高频匹配的规则放在链的前面
- 合并相似规则,减少规则数量
- 使用ipset管理大量IP/端口集合
- 对连接速率进行限制:
bash复制iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
4.2 持久化保存
不同发行版的保存方式:
- RHEL/CentOS:
bash复制
service iptables save chkconfig iptables on - Debian/Ubuntu:
bash复制
apt install iptables-persistent netfilter-persistent save
4.3 调试与日志
查看规则匹配计数:
bash复制iptables -L -v -n
记录被DROP的数据包:
bash复制iptables -A INPUT -j LOG --log-prefix "IPTABLES DROP: " --log-level 4
iptables -A INPUT -j DROP
日志默认输出到/var/log/messages或/var/log/syslog
5. 常见问题排查
5.1 规则不生效检查清单
- 确认iptables服务已启动
- 检查规则顺序(首条匹配即生效)
- 验证默认策略(特别是FORWARD链)
- 确认内核参数配置:
bash复制
sysctl net.ipv4.ip_forward
5.2 连接跟踪问题
解决FTP等协议的特殊需求:
bash复制modprobe ip_conntrack_ftp
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
5.3 性能优化建议
- 减少规则数量,合并相似规则
- 对大量IP使用ipset
- 避免过于复杂的连接跟踪
- 考虑使用nftables替代(新系统推荐)