nftables 配置

教学目标

  • 掌握 nftables 的基本概念和工作原理
  • 熟悉 nftables 的命令语法和规则结构
  • 学会配置和管理 nftables 规则
  • 能够应用 nftables 解决实际网络安全问题
  • 了解 nftables 与 iptables 的区别和优势

主要知识点

1. nftables 基本概念

  • nftables:Linux 内核中的新一代防火墙框架,旨在替代 iptables
  • 表(Tables):nftables 中的表,用于组织规则集
  • 链(Chains):表中的链,包含具体的规则
  • 规则(Rules):定义如何处理数据包的规则
  • 表达式(Expressions):用于匹配数据包的条件
  • 语句(Statements):定义匹配后执行的操作
  • 集合(Sets):用于存储多个值的结构,如 IP 地址列表
  • 映射(Maps):键值对映射,用于更复杂的规则匹配

2. nftables 命令语法

# 基本命令格式
nft [选项] 命令

# 常用选项
--version:查看版本信息
--help:查看帮助信息
-f, --file:从文件读取配置

# 常用命令
list ruleset:列出所有规则
add table:添加表
add chain:添加链
add rule:添加规则
delete rule:删除规则
flush ruleset:清空所有规则

# 规则语法
rule [匹配条件] [操作]

3. nftables 基本配置

  • 创建表和链

    # 创建一个名为 filter 的表,使用 inet 族(同时支持 IPv4 和 IPv6)
    nft add table inet filter
    
    # 在 filter 表中创建 INPUT 链
    nft add chain inet filter INPUT { type filter hook input priority 0 \; policy drop \; }
    
    # 在 filter 表中创建 OUTPUT 链
    nft add chain inet filter OUTPUT { type filter hook output priority 0 \; policy accept \; }
    
    # 在 filter 表中创建 FORWARD 链
    nft add chain inet filter FORWARD { type filter hook forward priority 0 \; policy drop \; }
  • 添加规则

    # 允许回环接口
    nft add rule inet filter INPUT iif lo accept
    
    # 允许已建立的连接
    nft add rule inet filter INPUT ct state established,related accept
    
    # 允许 SSH 连接
    nft add rule inet filter INPUT tcp dport 22 accept
    
    # 允许 HTTP 和 HTTPS 连接
    nft add rule inet filter INPUT tcp dport { 80, 443 } accept
    
    # 允许 ICMP 数据包
    nft add rule inet filter INPUT icmp type echo-request accept
  • 查看规则

    # 查看所有规则
    nft list ruleset
    
    # 查看特定表的规则
    nft list table inet filter
    
    # 查看特定链的规则
    nft list chain inet filter INPUT
  • 删除规则

    # 通过规则编号删除
    nft delete rule inet filter INPUT handle 5
    
    # 通过完整规则删除
    nft delete rule inet filter INPUT tcp dport 22 accept
  • 修改规则

    # 替换规则
    nft replace rule inet filter INPUT handle 5 tcp dport 2222 accept

4. nftables 高级功能

4.1 集合(Sets)

集合:用于存储多个值的结构,如 IP 地址、端口等

# 创建一个 IP 地址集合
nft add set inet filter allowed_ips { type ipv4_addr \; }

# 向集合中添加元素
nft add element inet filter allowed_ips { 192.168.1.100, 192.168.1.101 }

# 使用集合
nft add rule inet filter INPUT ip saddr @allowed_ips accept

# 创建一个端口集合
nft add set inet filter allowed_ports { type inet_service \; }
nft add element inet filter allowed_ports { 80, 443, 22 }
nft add rule inet filter INPUT tcp dport @allowed_ports accept

4.2 映射(Maps)

映射:键值对映射,用于更复杂的规则匹配

# 创建一个映射,将 IP 地址映射到端口
nft add map inet filter ip_to_port { type ipv4_addr : inet_service \; }

# 向映射中添加键值对
nft add element inet filter ip_to_port { 192.168.1.100 : 22, 192.168.1.101 : 80 }

# 使用映射
nft add rule inet filter INPUT tcp dport vmap { ip saddr . tcp dport : @ip_to_port } accept

4.3 元组(Expressions)

元组:用于匹配数据包的各种属性

# 匹配源 IP 地址
ip saddr 192.168.1.0/24

# 匹配目标端口
tcp dport 80

# 匹配接口
iif eth0

# 匹配连接状态
ct state established,related

# 匹配数据包长度
length 0-1000

5. nftables 配置管理

  • 保存配置

    # 保存配置到文件
    nft list ruleset > /etc/nftables.conf
  • 加载配置

    # 从文件加载配置
    nft -f /etc/nftables.conf
  • 开机自启

    # 启用 nftables 服务(Systemd)
    systemctl enable nftables
    systemctl start nftables

6. nftables 与 iptables 的区别

特性 nftables iptables
内核模块 单一模块(nft) 多个模块(iptables_filter, iptables_nat 等)
语法 更简洁、灵活 较复杂、冗长
性能 更高,特别是规则数量多时 较低,规则数量多时性能下降明显
功能 支持集合、映射等高级特性 不支持高级数据结构
IPv4/IPv6 统一处理 分别处理(iptables 和 ip6tables)
配置文件 单一文件 多个文件
兼容性 提供 iptables 兼容层 直接操作 Netfilter

7. nftables 安全最佳实践

  • 遵循最小权限原则:只允许必要的流量
  • 使用集合和映射来简化规则管理
  • 定期备份 nftables 配置
  • 使用默认拒绝策略,只允许明确授权的流量
  • 定期审查和更新 nftables 规则
  • 结合其他安全措施,如入侵检测系统

实用案例分析

案例 1:基本防火墙配置

场景:配置一个基本的防火墙,只允许 SSH、HTTP 和 HTTPS 连接。

配置步骤

# 清空现有规则
nft flush ruleset

# 创建表和链
nft add table inet filter
nft add chain inet filter INPUT { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter OUTPUT { type filter hook output priority 0 \; policy accept \; }
nft add chain inet filter FORWARD { type filter hook forward priority 0 \; policy drop \; }

# 添加规则
# 允许回环接口
nft add rule inet filter INPUT iif lo accept

# 允许已建立的连接
nft add rule inet filter INPUT ct state established,related accept

# 允许 SSH 连接
nft add rule inet filter INPUT tcp dport 22 accept

# 允许 HTTP 和 HTTPS 连接
nft add rule inet filter INPUT tcp dport { 80, 443 } accept

# 允许 ICMP 数据包
nft add rule inet filter INPUT icmp type echo-request accept

# 保存配置
nft list ruleset > /etc/nftables.conf

案例 2:使用集合管理 IP 地址

场景:配置一个规则,只允许特定 IP 地址访问服务器。

配置步骤

# 创建 IP 地址集合
nft add set inet filter allowed_ips { type ipv4_addr \; }

# 向集合中添加允许的 IP 地址
nft add element inet filter allowed_ips { 192.168.1.100, 192.168.1.101, 10.0.0.5 }

# 添加规则,只允许集合中的 IP 访问 SSH
nft add rule inet filter INPUT tcp dport 22 ip saddr @allowed_ips accept

案例 3:端口转发配置

场景:将外部访问服务器 8080 端口的流量转发到内部 192.168.1.100 的 80 端口。

配置步骤

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 创建 nat 表和链
nft add table ip nat
nft add chain ip nat PREROUTING { type nat hook prerouting priority 0 \; }
nft add chain ip nat POSTROUTING { type nat hook postrouting priority 100 \; }

# 添加端口转发规则
nft add rule ip nat PREROUTING tcp dport 8080 dnat to 192.168.1.100:80

# 添加源地址转换规则
nft add rule ip nat POSTROUTING ip daddr 192.168.1.100 masquerade

# 允许转发流量
nft add rule inet filter FORWARD ip daddr 192.168.1.100 tcp dport 80 accept
nft add rule inet filter FORWARD ip saddr 192.168.1.100 tcp sport 80 accept

案例 4:速率限制配置

场景:配置对 SSH 服务的速率限制,防止暴力破解。

配置步骤

# 添加速率限制规则(每分钟最多 6 个新连接)
nft add rule inet filter INPUT tcp dport 22 ct state new limit rate 6/minute accept

课后练习

  1. 基本配置练习

    • 配置一个基本的防火墙,只允许 SSH、HTTP 和 HTTPS 连接
    • 设置默认策略为拒绝所有未明确允许的流量
    • 验证配置是否生效
  2. 集合练习

    • 创建一个 IP 地址集合,包含多个允许访问的 IP
    • 创建一个端口集合,包含多个允许的端口
    • 使用这些集合配置防火墙规则
  3. 映射练习

    • 创建一个映射,将 IP 地址映射到不同的端口
    • 使用映射配置防火墙规则
  4. 端口转发练习

    • 配置端口转发,将外部 8080 端口转发到内部 80 端口
    • 测试转发是否正常工作
  5. 速率限制练习

    • 配置对 SSH 服务的速率限制
    • 测试速率限制是否生效
  6. 配置管理练习

    • 备份当前的 nftables 配置
    • 修改配置,添加对 FTP 服务的支持
    • 恢复之前备份的配置
  7. 故障排除练习

    • 模拟一个场景:配置完 nftables 后,SSH 无法连接
    • 分析并解决这个问题

总结

本章节详细介绍了 Linux 系统中 nftables 防火墙的配置方法,包括:

  • nftables 的基本概念和工作原理
  • nftables 的命令语法和规则结构
  • 表、链、规则的创建和管理
  • 高级功能如集合、映射的使用
  • 实际应用场景的解决方案
  • nftables 与 iptables 的区别和优势
  • 安全最佳实践和故障排除技巧

通过学习本章节,您应该能够熟练使用 nftables 配置和管理 Linux 系统的防火墙,保护服务器和网络的安全。nftables 作为新一代的防火墙框架,提供了更简洁、灵活的语法和更高的性能,是未来 Linux 防火墙的发展方向。在实际应用中,建议根据具体的网络环境和安全需求,制定合适的防火墙策略,并定期审查和更新规则,以应对不断变化的安全威胁。

扩展阅读

« 上一篇 firewalld 配置 下一篇 » 防火墙规则管理