本文整理了在 Linux 环境下使用 iptables/ip6tables 的常见命令、参数说明以及典型使用场景,便于初学者查询与实践。
- 表(Table):按功能划分。常见的
raw(连接跟踪前)、mangle(数据包修改)、nat(地址转换)、filter(包过滤)。 - 链(Chain):数据包在每张表中的处理路径,例如
INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。自定义链可由用户创建。 - 规则(Rule):由匹配条件与目标动作组成,匹配顺序从上到下执行。
- 目标(Target):动作,例如
ACCEPT、DROP、REJECT、LOG、SNAT、DNAT等。
IPv6 使用 ip6tables 命令,语法与 IPv4 基本一致,仅在地址/模块支持上存在差异。
iptables [-t 表] COMMAND [链] [匹配条件] [-j 目标]常用全局选项:
| 参数 | 说明 |
|---|---|
-t |
指定表,默认 filter。 |
-L |
列出链规则,配合 -n(数字显示)、-v(统计信息)、--line-numbers(显示序号)。 |
-A / -I / -D / -R |
分别表示追加、插入、删除、替换。 |
-F / -Z / -X |
清空规则、清零计数、删除自定义链。 |
-P |
设置链的默认策略(仅系统链)。 |
-j |
指定目标动作。 |
-m |
启用匹配模块,例如 state/conntrack/limit 等。 |
iptables -L -n -v --line-numbers
iptables -t nat -L -n -v
ip6tables -t filter -L INPUT -niptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTiptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPTiptables -A INPUT -p tcp --dport 25 -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP# 内网访问 Internet,使用 SNAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
# 动态地址环境(例如 PPPoE)可使用 MASQUERADE
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -o ppp0 -j MASQUERADE
# DNAT:将外网流量转发至内网主机
iptables -t nat -A PREROUTING -d 203.0.113.10/32 -p tcp --dport 2222 -j DNAT --to-destination 192.168.0.10:22
iptables -A FORWARD -p tcp -d 192.168.0.10 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.0.10 --sport 22 -m state --state ESTABLISHED -j ACCEPT# 将 80 端口流量转交给本机 8080(如 HTTP 代理)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j LOG --log-prefix "SSH attempt: "
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp -j DROPiptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
iptables -A INPUT -j LOG --log-prefix "DROP INPUT: "# 开启内核转发
sysctl -w net.ipv4.ip_forward=1
# NAT 公网出口
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 转发策略
iptables -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 阻断外网主动访问内网
iptables -A FORWARD -i eth0 -o eth1 -j DROPip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPTiptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT- 规则与 nftables 冲突:在使用新内核时确认是否启用了
iptables-nft,可通过iptables -V查看,必要时安装iptables-legacy。 - 模块不可用:例如
-m conntrack提示错误,需加载nf_conntrack模块或安装对应包。 - 顺序问题:iptables 规则按顺序匹配,建议使用
--line-numbers查看并使用-I/-R调整。 - 调试:利用
LOG目标输出到dmesg//var/log/messages,协助定位被丢弃的数据包。 - 持久化:在系统重启后需重新加载规则,建议配合
iptables-save+systemd//etc/rc.local或发行版提供的netfilter-persistent。
man iptables/man ip6tablesman iptables-extensions- Netfilter.org 官方文档
结合 iptables-web,可以在图形界面中执行上述命令、观察效果并快速导出/导入规则,降低学习成本。