一、iptables 核心基础概念
1.iptables 的作用
iptables 是 Linux 系统上最常用的 防火墙工具,用于配置内核的 netfilter 包过滤框架
ufw是基于iptables 进行封装的。
2.iptables 核心概念
| 概念 | 解释 |
|---|---|
| 表(Table) | 按功能分类的规则集合,核心有 4 个:filter(过滤)、nat(地址转换)、mangle(修改数据包)、raw(原始数据包) |
| 链(Chain) | 表内的规则执行顺序,内置链:INPUT(入站)、OUTPUT(出站)、FORWARD(转发)、PREROUTING(路由前)、POSTROUTING(路由后) |
| 匹配条件 | 筛选数据包的依据(如协议、IP、端口、网卡) |
| 目标动作(Target) | 匹配后执行的操作(如 ACCEPT、DROP、REJECT、SNAT、DNAT 等) |
3.数据包流转流程(表与链的执行顺序)
(1).入站数据包(目标是本机)
shell
网卡接收 → PREROUTING(raw→mangle→nat) → 路由判断 → INPUT(mangle→filter) → 本机进程
(2).转发数据包(本机是路由器)
shell
网卡接收 → PREROUTING(raw→mangle→nat) → 路由判断 → FORWARD(mangle→filter) → POSTROUTING(mangle→nat) → 网卡发出
(3).出站数据包(本机发起)
shell
本机进程 → OUTPUT(raw→mangle→nat→filter) → 路由判断 → POSTROUTING(mangle→nat) → 网卡发出
二、iptables 命令基本语法
shell
iptables [选项] [表名] [链名] [匹配条件] -j [目标动作]
1. 核心选项
| 选项 | 作用 |
|---|---|
| -A | Append,追加规则到链的末尾(不会覆盖现有规则) |
| -I | Insert,插入规则到链的指定位置(默认插在首位,如 -I INPUT 3 插在第 3 位) |
| -D | Delete,删除链中的规则(可指定规则序号或完整规则) |
| -R | Replace,替换链中的指定规则 |
| -L | List,列出链中的所有规则(常用 -L -n 以数字显示 IP / 端口,避免解析) |
| -F | Flush,清空链中的所有规则(慎用!) |
| -P | Policy,设置链的默认策略(如 iptables -P INPUT DROP,默认拒绝所有入站) |
| -N | New,创建自定义链(如 iptables -N MY_CHAIN) |
| -X | Delete chain,删除自定义链(需先清空链内规则) |
| -Z | Zero,清空链的计数器(统计数据包数量 / 字节数) |
2. 表名指定(-t)
| 表名 | 作用 | 常用链 |
|---|---|---|
| filter(默认) | 数据包过滤(核心) | INPUT、OUTPUT、FORWARD |
| nat | 网络地址转换 | PREROUTING、POSTROUTING、OUTPUT |
| mangle | 修改数据包属性(TTL/MARK) | 所有链 |
| raw | 关闭连接追踪(高并发优化) | PREROUTING、OUTPUT |
注意:不指定 -t 时,默认使用 filter 表。
3. 常用匹配条件
| 条件 | 作用 | 示例 |
|---|---|---|
| -p | 指定协议(tcp/udp/icmp/all) | -p tcp(匹配 TCP 协议) |
| -s | 源 IP / 网段 | -s 192.168.1.100(指定源 IP) |
| -d | 目的 IP / 网段 | -d 10.0.0.0/24(指定目的网段) |
| --sport | 源端口(仅 tcp/udp) | --sport 8080(源端口 8080) |
| --dport | 目的端口(仅 tcp/udp) | --dport 80:443(端口 80 到 443) |
| -i | 入站网卡(仅 INPUT/FORWARD/PREROUTING) | -i eth0(仅匹配 eth0 入站流量) |
| -o | 出站网卡(仅 OUTPUT/FORWARD/POSTROUTING) | -o eth1(仅匹配 eth1 出站流量) |
| --icmp-type | ICMP 类型(ping 相关) | --icmp-type 8(匹配 ping 请求) |
| -m multiport | 多端口匹配(需先指定 -m multiport) | -m multiport --dports 80,443,8080 |
| -m state | 连接状态匹配(NEW/ESTABLISHED/RELATED) | -m state --state ESTABLISHED(匹配已建立的连接) |
4. 常用目标动作(-j)
| 动作 | 作用 | 适用场景 |
|---|---|---|
| ACCEPT | 允许数据包通过 | 放行合法流量 |
| DROP | 丢弃数据包(无回应) | 静默拒绝(如屏蔽恶意 IP) |
| REJECT | 拒绝数据包(返回错误信息) | 明确拒绝(如告知对方端口不可达) |
| SNAT | 源地址转换(内网→外网) | -j SNAT --to-source 公网IP |
| DNAT | 目的地址转换(外网→内网) | -j DNAT --to-destination 内网IP:端口 |
| MASQUERADE | 动态 SNAT(适用于公网 IP 动态分配) | -j MASQUERADE(路由器 NAT) |
| MARK | 给数据包打标记(mangle 表常用) | -j MARK --set-mark 100 |
| RETURN | 返回到主链继续执行规则 | 自定义链中结束后返回主链 |
三、常用命令示例(新手必掌握)
shell
# 查看filter表INPUT链规则(指定表和链)
iptables -t filter -L INPUT -n
# 拒绝所有访问8090端口的TCP流量(默认filter表)
iptables -A INPUT -p tcp --dport 8090 -j DROP
# 允许特定IP(192.168.1.100)访问8090端口(TCP)
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 8090 -j ACCEPT
四、规则保存与恢复(避免重启失效)
shell
# 方式1:手动保存/恢复
iptables-save > /etc/iptables.rules # 保存规则到文件
iptables-restore < /etc/iptables.rules # 从文件恢复规则
# 方式2:Debian/Ubuntu(持久化)
apt install iptables-persistent -y # 安装持久化工具
# 保存规则(自动写入/etc/iptables/rules.v4)
iptables-save > /etc/iptables/rules.v4
# 方式3:CentOS/RHEL 7+(firewalld兼容)
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -j ACCEPT
firewall-cmd --reload # 重载规则
五、Docker 环境下的特殊逻辑
- docker 会自动在 iptables 的 filter 表中创建专属链(如 DOCKER、DOCKER-USER、DOCKER-ISOLATION-STAGE-1/2),所有容器的端口映射、网络隔离规则都会放在这些链中,且 **DOCKER-USER 链是官方推荐的用户自定义规则入口 **(优先级高于 Docker 自动生成的规则)。如果直接修改 INPUT 链,可能会被 Docker 自动规则覆盖。
- 所有针对 Docker 容器端口的过滤规则,都加到 filter 表的 DOCKER-USER 链(而非 INPUT/PREROUTING);
shell
# 1. 允许特定IP访问80端口(Docker容器暴露的80端口)
iptables -t filter -I DOCKER-USER -p tcp -s 你的目标IP --dport 80 -j ACCEPT
# 2. 拒绝所有访问8090端口的TCP流量(包括Docker容器的8090端口)
iptables -t filter -A DOCKER-USER -p tcp --dport 8090 -j DROP