iptables 知识点总结
iptables 是 Linux 内核 netfilter 框架的用户态工具,用于配置 IPv4 包过滤、NAT、流量改写;IPv6 使用 ip6tables。 核心概念:表 (table) → 链 (chain) → 规则 (rule)
一、四大表(优先级从高到低)
| 表名 | 作用 | 内置链 |
|---|---|---|
| raw | 关闭连接跟踪(conntrack),优先级最高 | PREROUTING、OUTPUT |
| mangle | 修改数据包:TTL、TOS、MARK 标记 | PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
| nat | 网络地址转换(端口映射、源 / 目的地址转换)⚠️ 连接只在第一个包做 NAT,后续包靠 conntrack | PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT/MASQUERADE) |
| filter | 默认表,包过滤,允许 / 拒绝数据包 | INPUT、FORWARD、OUTPUT |
日常防火墙规则绝大多数写在
filter表;端口转发、共享上网用nat表。
二、五条内置链(数据包流转)
- PREROUTING :数据包刚进入网卡,路由判断之前。常用于 DNAT、修改目的地址。
- INPUT:路由判断后,包目标是本机进程。访问本机端口走这条链。
- FORWARD:路由判断后,包经过本机转发(本机作为路由器)。
- OUTPUT:本机进程发出的数据包。
- POSTROUTING :数据包离开网卡之前。常用于 SNAT/MASQUERADE,修改源地址。
数据包两种流向
- 访问本机:网卡 → PREROUTING → INPUT → 本机程序
- 跨主机转发:网卡 → PREROUTING → FORWARD → POSTROUTING → 出去
- 本机向外访问:本机程序 → OUTPUT → POSTROUTING → 网卡出去

三、规则匹配 + 动作(target)
常用匹配条件
-s:源 IP-d:目的 IP-p:协议 tcp/udp/icmp/all--sport:源端口(tcp/udp)--dport:目的端口(tcp/udp)-i:入网卡(PREROUTING/INPUT/FORWARD)-o:出网卡(OUTPUT/FORWARD/POSTROUTING)--state:连接状态(conntrack)- NEW:新建连接
- ESTABLISHED:已建立连接
- RELATED:相关连接(如 ftp 主动数据通道)
- INVALID:无效包
-m:加载扩展模块,如-m multiport多端口匹配
常用动作 target
| target | 含义 |
|---|---|
| ACCEPT | 放行数据包,不再继续匹配同链后续规则 |
| DROP | 丢弃数据包,不回复任何报文(静默丢包) |
| REJECT | 拒绝数据包,返回 ICMP 拒绝报文 |
| SNAT | 静态源地址转换,nat 表 POSTROUTING |
| MASQUERADE | 动态源地址转换(拨号网卡 IP 会变时用) |
| DNAT | 目的地址转换,nat 表 PREROUTING,端口映射 |
| RETURN | 返回到调用这条链的上一级链继续匹配 |
规则从上到下依次匹配 ,匹配命中就执行 target;全部不命中,执行链默认策略。
四、默认策略 policy
iptables -P INPUT DROP
- 对 filter 表的 INPUT 链设置默认丢弃
- 小心:设置
DROP前务必先放行 ssh,否则直接断连!
五、常用命令
# 查看规则
iptables -L -n -v
iptables -t nat -L -n
# 清空规则(慎用)
iptables -F # 清空filter表所有链规则
iptables -t nat -F
iptables -X # 删除自定义链
# 添加规则:filter INPUT放行22端口tcp
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 在链头部插入规则(优先匹配)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# 删除规则:按序号删除(推荐)
iptables -L --line-numbers
iptables -D INPUT 2
# 保存规则(不同系统不一样)
# CentOS6: service iptables save
# CentOS7+/Ubuntu:iptables-save > /etc/iptables/rules.v4
# 恢复:iptables-restore < rules.v4
六、典型场景示例
1. 基础防火墙:只放行 ssh、已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
2. 本机做路由器,内网机器共享上网(MASQUERADE)
# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# nat表POSTROUTING,外网网卡eth0
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
3. 端口映射:访问公网 IP:8080 转发到内网 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
# 同时FORWARD链放行转发流量
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
七、重要坑点
- NAT 只对第一个包生效,依靠 conntrack 连接跟踪,不要随意关闭。
- MASQUERADE 适合动态 IP 网卡;静态公网 IP 优先 SNAT,性能更好。
- FORWARD 链:本机作为转发网关才生效,本机服务不走 FORWARD。
- 规则顺序很关键,宽泛规则放后面,精准规则放前面。
- iptables 临时生效,重启丢失,需要手动保存;现代系统很多已经改用 nftables。
-L不带-n会反向解析域名,查看规则很慢。
八、iptables vs nftables
- iptables:旧实现,多表多链,语法零散;Linux 内核逐步废弃。
- nftables:新一代框架,统一架构,语法更简洁,替代 iptables/ip6tables/arptables。
九、面试精简版考点
- iptables 底层是 netfilter;用户态工具操作内核数据包钩子。
- 4 表 5 链,表优先级 raw > mangle > nat > filter。
- 包流转路径,区分 INPUT(访问本机)和 FORWARD(转发)。
- 状态模块 state NEW/ESTABLISHED/RELATED/INVALID。
- SNAT 在 POSTROUTING;DNAT 在 PREROUTING。
- MASQUERADE 适用于动态公网 IP。
==================================================
firewalld 知识点总结
firewalld 是 CentOS7+/RHEL7+ 默认防火墙,动态防火墙,不用重启服务即可更新规则,底层还是 netfilter,区别于 iptables(静态)。
一、核心概念
-
区域 zone (核心!按可信等级划分流量,一个网卡绑定一个 zone)
zone 说明 默认策略 trusted信任所有连接 全部允许 home家庭内网,信任局域网设备 允许常用服务 internal内部网络 允许常用服务 work工作网络 允许常用服务 public默认,公网,不信任外部主机 仅允许 ssh、dhcpv6-client external外网,开启地址伪装 NAT 出站转发 dmz隔离区,对外服务器 仅允许指定服务 block阻止所有连接,返回拒绝 全部拒绝 drop丢弃数据包,不回复 全部丢弃(无回应)
默认 zone:
public;网卡可以绑定 zone,流量按网卡所属 zone 匹配规则。
- 服务 service firewalld 内置预定义服务配置(
/usr/lib/firewalld/services/*.xml),包含端口、协议、描述。
优先用服务名,而不是直接写端口,可读性高。
- 两种配置模式
- runtime(运行时) :临时生效,重启 firewalld 失效,不加
--permanent就是 runtime - permanent(永久) :写入配置文件,必须重载
reload才生效 ,加--permanent参数
命令口诀:永久加
--permanent,改完要firewall-cmd --reload
- 富规则 rich-rule 复杂规则,支持源 IP、目的 IP、端口、协议、日志、拒绝 / 允许,优先级高于普通端口 / 服务规则。
二、常用 firewall-cmd 命令
查看信息
# 查看默认zone
firewall-cmd --get-default-zone
# 列出所有zone
firewall-cmd --get-zones
# 查看当前zone的规则(runtime)
firewall-cmd --list-all
# 查看指定zone规则
firewall-cmd --list-all --zone=public
# 查看网卡绑定哪个zone
firewall-cmd --get-active-zones
# 查看支持的所有预定义服务
firewall-cmd --get-services
修改默认 zone
firewall-cmd --set-default-zone=public
服务管理(推荐用法)
# 临时放行http服务
firewall-cmd --add-service=http
# 永久放行http,重载生效
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# 移除服务
firewall-cmd --remove-service=http --permanent
firewall-cmd --reload
端口管理
# 永久放行tcp 8080端口
firewall-cmd --add-port=8080/tcp --permanent
# 端口范围 1000-2000 tcp
firewall-cmd --add-port=1000-2000/tcp --permanent
# 删除端口
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload
源 IP 控制(允许 / 拒绝某个网段)
# 允许192.168.1.0/24网段访问当前zone
firewall-cmd --add-source=192.168.1.0/24 --permanent
# 将源网段绑定到trusted区域(信任这个网段)
firewall-cmd --add-source=10.0.0.0/8 --zone=trusted --permanent
firewall-cmd --reload
网卡绑定 zone
firewall-cmd --add-interface=eth1 --zone=external --permanent
firewall-cmd --reload
三、NAT 端口转发 / 地址伪装
-
地址伪装(SNAT,共享上网,external 区域常用)
开启伪装
firewall-cmd --add-masquerade --zone=external --permanent
firewall-cmd --reload查看是否开启伪装
firewall-cmd --query-masquerade --zone=external
-
端口转发(DNAT,外部访问本机端口转发到内部 IP 端口)
前提:masquerade 开启、内核 ip 转发打开
# 将本机80端口转发到192.168.1.100:80
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=80 --permanent
firewall-cmd --reload
四、富规则 rich rule 示例(高级规则)
语法模板: rule [family="ipv4|ipv6"] source address=xxx destination address=xxx port port=xxx protocol=xxx accept|reject|drop [log]
# 拒绝192.168.1.20访问22端口并记录日志
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.20/32" port protocol="tcp" port="22" reject log'
# 只允许10.0.0.0/24访问3306,其他IP禁止访问mysql
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="3306" protocol="tcp" accept'
# 拒绝所有其他ip访问3306
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" reject'
# 查看富规则
firewall-cmd --list-rich-rules
# 删除富规则:把add改成remove,其余内容不变
firewall-cmd --permanent --remove-rich-rule='xxx'
firewall-cmd --reload
富规则从上到下匹配,匹配即停止,越具体规则写越靠前。
五、服务启停与配置文件
# 开机自启、启动、停止、状态
systemctl enable --now firewalld
systemctl stop firewalld
systemctl status firewalld
配置文件目录:
/etc/firewalld/用户自定义配置(优先级高)/usr/lib/firewalld/系统自带默认模板,不要直接修改
六、重要注意点(面试高频)
firewall-cmd --reload:重载永久规则,不中断现有连接 ;--complete-reload会断开已有连接,慎用- 优先级顺序:富规则 > 端口 / 服务 / 源规则 > zone 默认策略
- firewalld 和 iptables 不能同时启用,二者底层都是 netfilter,冲突
- 默认策略:zone 的默认策略只控制入站流量,本机向外发起的流量默认放行
- 端口转发需要开启内核 IP 转发:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf && sysctl -p - 规则删除:add → remove,参数完全一致
七、面试简答速记
- firewalld 和 iptables 区别:firewalld 动态、zone 模型,不用重启;iptables 静态,修改需要重载,用链模型。
- zone 作用:对不同网络环境预定义一套策略,网卡 / 源地址绑定 zone 实现流量分类控制。
- permanent 参数:永久保存,必须 reload 生效;不加则临时,重启失效。
- masquerade:地址伪装,SNAT,内网主机共享公网 IP 上网。