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 accept4.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 } accept4.3 元组(Expressions)
元组:用于匹配数据包的各种属性
# 匹配源 IP 地址
ip saddr 192.168.1.0/24
# 匹配目标端口
tcp dport 80
# 匹配接口
iif eth0
# 匹配连接状态
ct state established,related
# 匹配数据包长度
length 0-10005. 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课后练习
基本配置练习:
- 配置一个基本的防火墙,只允许 SSH、HTTP 和 HTTPS 连接
- 设置默认策略为拒绝所有未明确允许的流量
- 验证配置是否生效
集合练习:
- 创建一个 IP 地址集合,包含多个允许访问的 IP
- 创建一个端口集合,包含多个允许的端口
- 使用这些集合配置防火墙规则
映射练习:
- 创建一个映射,将 IP 地址映射到不同的端口
- 使用映射配置防火墙规则
端口转发练习:
- 配置端口转发,将外部 8080 端口转发到内部 80 端口
- 测试转发是否正常工作
速率限制练习:
- 配置对 SSH 服务的速率限制
- 测试速率限制是否生效
配置管理练习:
- 备份当前的 nftables 配置
- 修改配置,添加对 FTP 服务的支持
- 恢复之前备份的配置
故障排除练习:
- 模拟一个场景:配置完 nftables 后,SSH 无法连接
- 分析并解决这个问题
总结
本章节详细介绍了 Linux 系统中 nftables 防火墙的配置方法,包括:
- nftables 的基本概念和工作原理
- nftables 的命令语法和规则结构
- 表、链、规则的创建和管理
- 高级功能如集合、映射的使用
- 实际应用场景的解决方案
- nftables 与 iptables 的区别和优势
- 安全最佳实践和故障排除技巧
通过学习本章节,您应该能够熟练使用 nftables 配置和管理 Linux 系统的防火墙,保护服务器和网络的安全。nftables 作为新一代的防火墙框架,提供了更简洁、灵活的语法和更高的性能,是未来 Linux 防火墙的发展方向。在实际应用中,建议根据具体的网络环境和安全需求,制定合适的防火墙策略,并定期审查和更新规则,以应对不断变化的安全威胁。
扩展阅读
- nftables 官方文档:详细的 nftables 官方文档
- Linux 防火墙教程:DigitalOcean 的 nftables 教程
- nftables 示例:nftables 配置示例
- 从 iptables 迁移到 nftables:迁移指南