iptables是Linux内核防火墙Netfilter的用户空间命令行工具,用于配置网络数据包过滤、网络地址转换(NAT)和数据包处理规则。作为传统Linux防火墙的标准工具,iptables功能强大、灵活性高,是网络安全的核心组件。
iptables通过链(chain)和表(table)组织规则。表(filter、nat、mangle、raw)决定了数据包处理类型,链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)定义了规则应用点。虽然较新的nftables正在逐步取代iptables,但iptables仍然是目前最广泛使用的Linux防火墙工具。掌握iptables是系统管理员保障服务器安全的基础技能。
1. 查看规则
| 命令 | 说明 |
|---|
sudo iptables -L | |
sudo iptables -L -n | |
sudo iptables -L -v | |
sudo iptables -L -n --line-numbers | |
sudo iptables -S | |
sudo iptables -t nat -L -n -v | |
sudo iptables -t mangle -L | |
2. 默认策略
| 命令 | 说明 |
|---|
sudo iptables -P INPUT DROP | |
sudo iptables -P FORWARD DROP | |
sudo iptables -P OUTPUT ACCEPT | |
sudo iptables -P INPUT ACCEPT | |
策略说明: 默认策略适用于没有匹配规则的数据包,DROP直接丢弃,ACCEPT允许通过。
3. 允许流量
| 命令 | 说明 |
|---|
sudo iptables -A INPUT -i lo -j ACCEPT | |
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT | |
sudo iptables -A INPUT -p icmp -j ACCEPT | |
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT | |
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT | |
4. 阻止流量
| 命令 | 说明 |
|---|
sudo iptables -A INPUT -s 203.0.113.10 -j DROP | |
sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP | |
sudo iptables -A INPUT -p tcp --dport 23 -j DROP | |
sudo iptables -A INPUT -p tcp --dport 25 -j REJECT | |
sudo iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP | |
sudo iptables -A INPUT -p udp --dport 137:138 -j DROP | |
DROP vs REJECT:DROP静默丢弃(对方等待超时),REJECT回复拒绝消息(对方立即收到拒绝)。
5. 端口转发(DNAT)
| 命令 | 说明 |
|---|
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80 | |
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 | |
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT | |
sudo iptables -A FORWARD -d 192.168.1.10 -j ACCEPT | |
6. NAT(源地址转换/伪装)
| 命令 | 说明 |
|---|
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE | |
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1 | |
sudo sysctl -w net.ipv4.ip_forward=1 | |
sudo sysctl -p | |
持久化IP转发: 编辑/etc/sysctl.conf,设置net.ipv4.ip_forward=1
7. 限速
| 命令 | 说明 |
|---|
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP | |
sudo iptables -A INPUT -p icmp -m limit --limit 1/sec -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 5000/sec --limit-burst 10000 -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH | |
sudo iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP | |
8. 日志记录
| 命令 | 说明 |
|---|
sudo iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " | |
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH: " --log-level 4 | |
sudo iptables -A INPUT -m limit --limit 5/min -j LOG | |
sudo iptables -A INPUT -s 203.0.113.10 -j LOG --log-prefix "BLOCKED: " | |
查看iptables日志:
sudo grep "IPT-DROP" /var/log/kern.log
sudo dmesg | grep "IPT-DROP"
9. 删除和插入规则
| 命令 | 说明 |
|---|
sudo iptables -D INPUT 3 | |
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT | |
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT | |
sudo iptables -R INPUT 3 -p tcp --dport 443 -j ACCEPT | |
sudo iptables -F | |
sudo iptables -F INPUT | |
sudo iptables -X | |
sudo iptables -Z | |
10. 保存和恢复规则
| 命令 | 说明 |
|---|
sudo iptables-save > /etc/iptables/rules.v4 | |
sudo iptables-restore < /etc/iptables/rules.v4 | |
sudo ip6tables-save > /etc/iptables/rules.v6 | |
sudo apt install iptables-persistent | |
sudo service iptables save | |
sudo netfilter-persistent save | |
sudo netfilter-persistent reload | |
11. 实用组合模式
| 命令 | 说明 |
|---|
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min -j ACCEPT | |
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT | |
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT | |
sudo iptables -A INPUT -m state --state INVALID -j DROP | |
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP | |
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP | |
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT | |
12. 常用表与链说明
| 表 | 用途 |
|---|
filter | 默认表,用于数据包过滤(INPUT、OUTPUT、FORWARD) |
nat | 网络地址转换(PREROUTING、POSTROUTING、OUTPUT) |
mangle | |
raw | 状态跟踪免除(PREROUTING、OUTPUT) |
链处理顺序:
入站: PREROUTING (raw/mangle/nat) → INPUT (filter)
转发: PREROUTING → FORWARD → POSTROUTING
出站: OUTPUT → POSTROUTING
13. 常用选项速查
| 选项 | 说明 |
|---|
-A | |
-I | |
-D | |
-R | |
-F | |
-L | |
-S | |
-P | |
-p | |
-s | |
-d | |
--sport | |
--dport | |
-i | |
-o | |
-j | |
-t | |
-m | |
-v | |
-n | |
14. 故障排查
| 问题 | 解决方法 |
|---|
| SSH连接断开/无法连接 | 检查INPUT链策略;确保SSH端口规则在DROP之前;准备控制台或预留备用连接 |
| 端口转发不生效 | 确认IP转发已启用;检查FORWARD链允许转发;确认DNAT规则正确 |
| NAT不工作 | 检查POSTROUTING MASQUERADE规则;确认IP转发已启用 |
| 规则保存后重启丢失 | |
| 限速规则无效 | 确认limit模块已加载;检查规则顺序(应放在ACCEPT之前) |
| iptables: No chain/target/match by that name | 需要加载对应内核模块;使用modprobe ipt_MASQUERADE等 |
| 规则数量太多难以管理 | 使用-S查看;限制规则数量;考虑使用Firewalld或nftables |
| 临时调试需求 | 使用-I插入临时规则,测试完删除;使用iptables-save备份 |
温馨提示: iptables是强大的防火墙工具,但配置复杂且容易出错。建议遵循以下原则:1)始终先设置默认策略为ACCEPT,逐步添加DROP规则,避免把自己锁在系统外;2)SSH规则务必放在INPUT链顶部;3)使用iptables-save备份规则,修改前先备份;4)批量操作时使用iptables-restore提高效率;5)在生产环境变更前先测试规则。对于复杂策略,建议使用脚本管理规则,便于版本控制和回滚。在云环境中,通常结合云防火墙(安全组)使用,形成多层防护。由于nftables正逐步取代iptables,新项目可考虑学习nftables,但iptables仍是当前最广泛使用的防火墙工具。