Skip to content

📋 规则管理

查看规则

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