📋 规则管理
查看规则
bash
# 查看 filter 表的所有规则(默认表)
sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
# 查看 nat 表规则
sudo iptables -t nat -L -n -v
# 查看规则(带行号,方便删除)
sudo iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt in out source destination
1 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 DROP all -- * * 0.0.0.0/0 0.0.0.0/0添加和插入规则
bash
# 追加规则(加到链的末尾)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 插入规则(加到第 1 位)
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 常用参数说明:
# -A 追加(Append)
# -I 插入(Insert)
# -D 删除(Delete)
# -p 协议(protocol):tcp, udp, icmp, all
# --dport 目标端口(destination port)
# --sport 源端口(source port)
# -s 源 IP(source)
# -d 目标 IP(destination)
# -j 动作(jump):ACCEPT, DROP, REJECT, LOG
# -i 入接口(input interface):如 eth0
# -o 出接口(output interface):如 eth0按条件匹配规则
bash
# 允许 SSH(端口 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP 和 HTTPS
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# 允许来自特定 IP 的访问
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 允许整个网段
sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 拒绝特定 IP 访问
sudo iptables -A INPUT -s 10.0.0.50 -j DROP
# 允许已建立的连接(非常重要!否则回复包也会被挡住)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许回环接口(本机内部通信)
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许 ICMP(ping)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 记录被丢弃的包(调试用)
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# 拒绝所有其他入站流量(默认策略)
sudo iptables -P INPUT DROP⚠️ 注意: ⚠️ 操作顺序很重要!先添加允许规则,最后再设置 DROP 策略。否则你会把自己锁在外面。如果你在远程服务器上操作,先确保 SSH 端口是允许的!
删除和修改规则
bash
# 按规则内容删除
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# 按行号删除(先查看行号)
sudo iptables -L INPUT -n --line-numbers
sudo iptables -D INPUT 3 # 删除第 3 条规则
# 清空某个链的所有规则
sudo iptables -F INPUT
# 清空所有规则(⚠️ 慎用!)
sudo iptables -F
# 设置默认策略
sudo iptables -P INPUT ACCEPT # 允许入站(开放)
sudo iptables -P INPUT DROP # 拒绝入站(严格)保存和恢复规则
iptables 规则默认重启后就没了!必须手动保存。
bash
# Ubuntu/Debian:保存规则
sudo apt install iptables-persistent
sudo netfilter-persistent save
Saving rules to /etc/iptables/rules.v4
Saving rules to /etc/iptables/rules.v6
# 恢复规则
sudo netfilter-persistent reload
# CentOS/RHEL:保存规则
sudo service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables
# 手动导出规则到文件
sudo iptables-save > /home/user/iptables-backup.rules
# 从文件恢复
sudo iptables-restore < /home/user/iptables-backup.rules