tools

Linux 防火墙详解

·14 分钟阅读·5471 字
📋 目录

Linux 防火墙详解

核心概念 Linux 防火墙基于 netfilter 框架,通过 iptables/firewalld/nftables 等工具管理数据包过滤、NAT 和转发规则。

1. 整体体系介绍

Linux 防火墙分为两代实现:

  1. iptables:传统用户态工具,内核底层 netfilter 框架;CentOS7/8、Ubuntu 长期默认,现在逐步淘汰。
  2. nftables:新一代内核框架,统一替代 iptables/ip6tables/arptables/ebtables,命令行工具 nft;RHEL9、Debian11+、主流新版系统默认底层。

上层封装工具(简化运维,屏蔽底层规则):

  • firewalld:RHEL/CentOS 系列图形化/命令行封装,zone 区域模型。
  • ufw:Ubuntu 简易防火墙封装。

核心底层框架统一是 netfilter,位于内核态,所有数据包拦截、转发、NAT 都由内核处理,性能极高。

2. 内核 netfilter 五钩子点位(iptables/nftables 核心)

数据包在内核流转的五个拦截点,对应 iptables 五张内置表链:

  1. PREROUTING:数据包刚进入网卡,还未路由判断;用于 DNAT、目的地址转换。
  2. INPUT:目标为本机本机进程的流量;管控外部访问本机端口。
  3. FORWARD:本机作为网关转发流量(跨机器转发、容器跨节点)。
  4. OUTPUT:本机程序向外发出的数据包。
  5. 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)

  1. ACCEPT:放行数据包,继续传输。
  2. DROP:直接丢弃,不回复任何报文(客户端超时,隐蔽性好)。
  3. REJECT:丢弃并返回拒绝报文(客户端立刻提示连接被拒绝,调试方便)。
  4. MASQUERADE:动态SNAT,出口网卡IP不固定场景(云主机、家庭宽带)。
  5. SNAT:固定出口公网IP转换。
  6. DNAT:目的端口转发。
  7. 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 缺陷

  1. 语法复杂,四表五链逻辑晦涩;
  2. IPv4/IPv6 分开两套工具 iptables/ip6tables;
  3. 规则匹配线性遍历,上万条 NetworkPolicy 规则后性能暴跌;
  4. 无原生集合、字典,批量IP黑名单实现繁琐;
  5. 架构老旧,内核维护逐步停止,官方主推 nftables。

4. 新一代防火墙 nftables(nft)

4.1. 核心优势

  1. 统一 IPv4/IPv6/二层以太网,一套工具搞定;
  2. 内置集合 set、字典 map,批量IP/端口规则性能极强;
  3. 规则匹配树形结构,而非线性遍历,海量规则性能远超 iptables;
  4. 语法更简洁,合并四表五链概念,架构简化;
  5. 原生支持动态规则、状态跟踪、流量转发;
  6. 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. 核心对象

  1. service:预定义服务(ssh、http、https)
  2. port:自定义端口放行
  3. rich-rule:高级复杂规则(源IP限制、黑名单)
  4. forward-port:端口转发DNAT
  5. 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. 常见故障

  1. nf_conntrack_count 达到 nf_conntrack_max,新建连接直接丢弃,业务大量超时;
  2. 短连接高并发、小包风暴极易打满连接跟踪表;
    调优内核参数:
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底层依赖)

  1. Docker -p 端口映射 = iptables nat PREROUTING DNAT;
  2. 容器访问外网自动添加 MASQUERADE SNAT 规则;
  3. Calico iptables 模式:海量 NetworkPolicy 转换成 filter 表规则,上万规则会拉高 %si 软中断;
  4. Calico eBPF 模式:绕过 iptables,在内核 eBPF 程序实现流量过滤,大幅降低软中断开销;
  5. K8s Service 早期基于 iptables 实现转发,ipvs 模式脱离 netfilter 防火墙链。

8. 生产最佳实践与安全规范

  1. 默认策略 INPUT DROP,仅放行业务必需端口,最小权限原则;
  2. 必须放行 lo 本地回环、RELATED/ESTABLISHED 响应流量;
  3. 远程SSH限制固定源IP,禁止全网开放22端口;
  4. 高并发业务使用 nftables 替代 iptables,避免线性规则性能瓶颈;
  5. 监控 conntrack 连接表占用,防止连接打满断服;
  6. 区分 DROP/REJECT:对外公网用DROP隐藏端口,内网调试可用REJECT;
  7. 转发服务器开启 ip_forward=1:echo 1 > /proc/sys/net/ipv4/ip_forward
  8. 定期清理无用规则,避免规则堆积拖慢网络;
  9. 新版本系统优先使用 nftables,淘汰老旧 iptables。

9. 面试核心总结速记

  1. 底层内核框架 netfilter,五大钩子:PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING;
  2. iptables 四表:raw > mangle > nat > filter,filter负责过滤,nat负责端口映射与SNAT;
  3. DNAT 用于入站端口转发(PREROUTING),SNAT/MASQUERADE 用于出站源地址转换(POSTROUTING);
  4. conntrack 连接跟踪区分 NEW/ESTABLISHED/RELATED,简化双向放行规则;
  5. nftables 新一代统一框架,集合+树形匹配,解决iptables性能短板;
  6. firewalld 上层zone封装,适合单机简单防护;
  7. 容器端口映射、Service转发底层依赖防火墙NAT链;海量NetworkPolicy iptables会拉高软中断,推荐eBPF;
  8. 安全基线:入站默认拒绝、SSH限制源IP、监控连接跟踪表容量。

关联文档