Linux 防火墙详解
核心概念 Linux 防火墙基于 netfilter 框架,通过 iptables/firewalld/nftables 等工具管理数据包过滤、NAT 和转发规则。
1. 整体体系介绍
Linux 防火墙分为两代实现:
- iptables:传统用户态工具,内核底层
netfilter框架;CentOS7/8、Ubuntu 长期默认,现在逐步淘汰。 - nftables:新一代内核框架,统一替代 iptables/ip6tables/arptables/ebtables,命令行工具
nft;RHEL9、Debian11+、主流新版系统默认底层。
上层封装工具(简化运维,屏蔽底层规则):
- firewalld:RHEL/CentOS 系列图形化/命令行封装,zone 区域模型。
- ufw:Ubuntu 简易防火墙封装。
核心底层框架统一是 netfilter,位于内核态,所有数据包拦截、转发、NAT 都由内核处理,性能极高。
2. 内核 netfilter 五钩子点位(iptables/nftables 核心)
数据包在内核流转的五个拦截点,对应 iptables 五张内置表链:
- PREROUTING:数据包刚进入网卡,还未路由判断;用于 DNAT、目的地址转换。
- INPUT:目标为本机本机进程的流量;管控外部访问本机端口。
- FORWARD:本机作为网关转发流量(跨机器转发、容器跨节点)。
- OUTPUT:本机程序向外发出的数据包。
- POSTROUTING:数据包即将离开网卡;用于 SNAT、源地址转换。
3. iptables 完整详解(主流运维接触最多)
3.1. 四张内置表(按优先级顺序)
3.1.1. 1)raw 表(最高优先级)
作用:标记数据包是否跳过连接跟踪 conntrack;极少使用。
链:PREROUTING、OUTPUT。
3.1.2. 2)mangle 表
修改数据包内容:TTL、DSCP 流量标记;流量QoS、灰度调度使用。
链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
3.1.3. 3)nat 表(NAT 地址转换专用)
仅处理新建连接的第一个包,已建立连接不再重复匹配;
- PREROUTING:DNAT 目的端口转发(端口映射、容器-p 端口映射底层)
- OUTPUT:本机出站DNAT
- POSTROUTING:SNAT 源地址转换(容器访问外网、公网出口IP转换)
3.1.4. 4)filter 表(默认、最常用,包过滤拦截)
管控放行/拒绝流量,安全策略全部写在此表;
内置三条核心链:
- INPUT:访问本机端口(ssh 22、nginx 80/443)
- FORWARD:跨主机/容器转发流量
- OUTPUT:本机对外访问
3.2. iptables 三种匹配动作(target)
ACCEPT:放行数据包,继续传输。DROP:直接丢弃,不回复任何报文(客户端超时,隐蔽性好)。REJECT:丢弃并返回拒绝报文(客户端立刻提示连接被拒绝,调试方便)。MASQUERADE:动态SNAT,出口网卡IP不固定场景(云主机、家庭宽带)。SNAT:固定出口公网IP转换。DNAT:目的端口转发。LOG:打印日志到/var/log/messages,不中断流量。
3.3. iptables 完整工作流程示例
3.3.1. 场景1:外部访问本机 Nginx 80端口
公网包 → 网卡 → PREROUTING(raw/mangle/nat) → 路由判断目标本机 → INPUT(filter) 匹配放行 → 交给 Nginx 进程。
3.3.2. 场景2:容器访问外网 SNAT
容器包 → OUTPUT → 路由判断需要转发 → FORWARD(filter)放行 → POSTROUTING(nat) MASQUERADE 替换源IP为宿主机公网IP → 流出网卡。
3.3.3. 场景3:宿主机端口映射 -p 8080:80 DNAT
公网访问宿主机8080 → PREROUTING nat DNAT 将目的IP+端口改为容器IP:80 → 转发至容器。
3.4. 常用 iptables 实操命令
# 查看所有规则
iptables -L -n --line-numbers
# 放行22、80、443端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许本地回环lo(必须配置,否则本机进程互通失败)
iptables -A INPUT -i lo -j ACCEPT
# 放行已建立、相关连接(响应包自动放行)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 默认拒绝所有入站流量(放通规则写前面,默认策略最后)
iptables -P INPUT DROP
# 端口映射 DNAT(宿主机9000转发到10.244.1.10:80)
iptables -t nat -A PREROUTING -p tcp --dport 9000 -j DNAT --to-destination 10.244.1.10:80
# 容器访问外网MASQUERADE
iptables -t nat -A POSTROUTING -s 10.244.0.0/16 -j MASQUERADE
# 删除指定行规则
iptables -D INPUT 3
# 保存规则(centos)
service iptables save
# ubuntu
iptables-save > /etc/iptables/rules.v4
3.5. iptables 缺陷
- 语法复杂,四表五链逻辑晦涩;
- IPv4/IPv6 分开两套工具 iptables/ip6tables;
- 规则匹配线性遍历,上万条 NetworkPolicy 规则后性能暴跌;
- 无原生集合、字典,批量IP黑名单实现繁琐;
- 架构老旧,内核维护逐步停止,官方主推 nftables。
4. 新一代防火墙 nftables(nft)
4.1. 核心优势
- 统一 IPv4/IPv6/二层以太网,一套工具搞定;
- 内置集合 set、字典 map,批量IP/端口规则性能极强;
- 规则匹配树形结构,而非线性遍历,海量规则性能远超 iptables;
- 语法更简洁,合并四表五链概念,架构简化;
- 原生支持动态规则、状态跟踪、流量转发;
- firewalld 新版底层已切换为 nftables。
4.2. 基础结构
不再区分四表,自定义 table(表)→ chain(链)→ rule(规则);
同样对应 netfilter 五大钩子。
4.3. 简单示例
# 创建ipv4表
nft add table ip filter
# 创建input链绑定INPUT钩子
nft add chain ip filter input { type filter hook input priority 0; policy drop; }
# 放行22端口
nft add rule ip filter input tcp dport 22 accept
# 放行已建立连接
nft add rule ip filter input ct state related,established accept
5. firewalld(RHEL/CentOS 上层封装工具)
5.1. 设计理念:Zone 区域模型
按网卡、来源IP划分信任区域,一套配置适配桌面、服务器、DMZ隔离环境:
- trusted:全部流量允许
- public:默认,仅放行指定端口
- dmz:隔离区,仅开放必要服务
- block:所有入站拒绝
- drop:全部丢弃
5.2. 核心对象
- service:预定义服务(ssh、http、https)
- port:自定义端口放行
- rich-rule:高级复杂规则(源IP限制、黑名单)
- forward-port:端口转发DNAT
- masquerade:开启SNAT外网转发
5.3. 常用命令
# 查看默认区域
firewall-cmd --get-default-zone
# 永久放行80端口(--permanent永久,reload生效)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
# 放行服务
firewall-cmd --add-service=http --permanent
# 端口转发 9000→10.244.1.10:80
firewall-cmd --add-forward-port=port=9000:proto=tcp:toaddr=10.244.1.10:toport=80 --permanent
# 开启SNAT转发
firewall-cmd --add-masquerade --permanent
# 仅允许192.168.1.0/24访问22端口(富规则)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port=22 protocol=tcp accept' --permanent
5.4. 优缺点
优点:简单易上手,zone隔离,无需手写复杂iptables;
缺点:底层封装,海量规则性能不如直接 nft,容器环境灵活性差。
6. 连接跟踪 conntrack(防火墙核心配套模块)
6.1. 作用
内核跟踪所有 TCP/UDP 连接状态,分为四种状态:
- NEW:新建连接首包
- ESTABLISHED:正常双向传输
- RELATED:关联连接(ftp 被动端口、ICMP 响应)
- INVALID:非法异常数据包
防火墙配置 --state RELATED,ESTABLISHED 后,只需要放行入站主动端口,所有响应报文自动放行,不用双向配置规则。
6.2. 常见故障
- nf_conntrack_count 达到 nf_conntrack_max,新建连接直接丢弃,业务大量超时;
- 短连接高并发、小包风暴极易打满连接跟踪表;
调优内核参数:
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
查看当前连接数:
cat /proc/sys/net/netfilter/nf_conntrack_count
7. 容器/云原生场景防火墙逻辑(Calico底层依赖)
- Docker
-p端口映射 = iptables nat PREROUTING DNAT; - 容器访问外网自动添加 MASQUERADE SNAT 规则;
- Calico iptables 模式:海量 NetworkPolicy 转换成 filter 表规则,上万规则会拉高 %si 软中断;
- Calico eBPF 模式:绕过 iptables,在内核 eBPF 程序实现流量过滤,大幅降低软中断开销;
- K8s Service 早期基于 iptables 实现转发,ipvs 模式脱离 netfilter 防火墙链。
8. 生产最佳实践与安全规范
- 默认策略 INPUT DROP,仅放行业务必需端口,最小权限原则;
- 必须放行 lo 本地回环、RELATED/ESTABLISHED 响应流量;
- 远程SSH限制固定源IP,禁止全网开放22端口;
- 高并发业务使用 nftables 替代 iptables,避免线性规则性能瓶颈;
- 监控 conntrack 连接表占用,防止连接打满断服;
- 区分 DROP/REJECT:对外公网用DROP隐藏端口,内网调试可用REJECT;
- 转发服务器开启 ip_forward=1:
echo 1 > /proc/sys/net/ipv4/ip_forward; - 定期清理无用规则,避免规则堆积拖慢网络;
- 新版本系统优先使用 nftables,淘汰老旧 iptables。
9. 面试核心总结速记
- 底层内核框架 netfilter,五大钩子:PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING;
- iptables 四表:raw > mangle > nat > filter,filter负责过滤,nat负责端口映射与SNAT;
- DNAT 用于入站端口转发(PREROUTING),SNAT/MASQUERADE 用于出站源地址转换(POSTROUTING);
- conntrack 连接跟踪区分 NEW/ESTABLISHED/RELATED,简化双向放行规则;
- nftables 新一代统一框架,集合+树形匹配,解决iptables性能短板;
- firewalld 上层zone封装,适合单机简单防护;
- 容器端口映射、Service转发底层依赖防火墙NAT链;海量NetworkPolicy iptables会拉高软中断,推荐eBPF;
- 安全基线:入站默认拒绝、SSH限制源IP、监控连接跟踪表容量。
关联文档