当前位置: 首页 > news >正文

nftables 实战:从零构建你的 Linux 网络防护墙

1. 为什么你需要nftables防火墙?

第一次接触Linux防火墙时,我像大多数人一样从iptables开始。但很快发现,写个简单的端口放行规则都要好几条命令,配置文件像天书一样难懂。直到遇到nftables,才发现原来防火墙可以这么优雅。

nftables是Linux内核3.13版本引入的全新防火墙框架,它用一套语法统一了原先分散的iptables/ip6tables/arptables等工具。我自己的家用服务器从iptables迁移到nftables后,规则行数减少了60%,CPU占用降低了15%,最关键是配置文件终于能看懂了!

举个真实场景:假设你要开放SSH和HTTP服务,同时阻止某个恶意IP。用iptables需要写4条规则,而nftables只需要1条复合规则。这种效率提升在管理云服务器集群时尤其明显,我曾经用nftables的批量编辑功能,在5分钟内完成了20台服务器的防火墙策略同步。

2. 快速安装与基础配置

2.1 跨发行版安装指南

在Ubuntu 22.04上安装只需:

sudo apt update && sudo apt install nftables -y

CentOS 8/Stream用户则用:

sudo dnf install nftables

安装后启动服务并设置开机自启:

sudo systemctl enable --now nftables

这里有个实际使用中的坑要注意:某些云主机厂商的模版系统可能预装了iptables服务。记得先停用旧服务:

sudo systemctl stop iptables && sudo systemctl disable iptables sudo systemctl stop ip6tables && sudo systemctl disable ip6tables

2.2 你的第一条防火墙规则

我们先来个"Hello World"级别的示例:

sudo nft add table inet filter # 创建表 sudo nft add chain inet filter input { type filter hook input priority 0 \; } # 创建链 sudo nft add rule inet filter input tcp dport 22 accept # 放行SSH

这三条命令构建了最基础的防火墙:

  1. 创建名为filter的表(相当于工作区)
  2. 创建input链并绑定到网络输入钩子
  3. 添加规则允许TCP 22端口流量

查看当前规则集:

sudo nft list ruleset

3. 实战:构建家庭服务器防火墙

3.1 基础防护策略

我的家庭服务器防护方案包含这些核心规则:

# 允许已建立的连接 sudo nft add rule inet filter input ct state established,related accept # 放行常见服务 sudo nft add rule inet filter input tcp dport { 22, 80, 443 } accept # 阻止无效数据包 sudo nft add rule inet filter input ct state invalid drop # 默认拒绝策略 sudo nft add rule inet filter input drop

这个配置实现了:

  • 放行SSH(22)、HTTP(80)、HTTPS(443)
  • 自动允许已建立的连接(不会打断现有会话)
  • 阻止畸形数据包
  • 默认拒绝所有其他入站连接

3.2 防暴力破解技巧

针对SSH暴力破解,我增加了频率限制:

sudo nft add set inet filter ssh_blacklist { type ipv4_addr \; flags timeout \; } sudo nft add rule inet filter input tcp dport 22 \ meter ssh_ratelimit { ip saddr limit rate 5/minute } \ add @ssh_blacklist { ip saddr timeout 1h } \ drop

这段规则会:

  1. 创建带超时的IP集合
  2. 每分钟超过5次SSH连接尝试的IP
  3. 将这些IP加入黑名单1小时
  4. 立即丢弃其数据包

实测这个方案让我的服务器SSH日志里的垃圾尝试减少了90%。

4. 高级应用:NAT与端口转发

4.1 家庭网络共享上网

我的树莓派作为家庭网关时,配置了以下NAT规则:

sudo nft add table ip nat sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; } sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; } # 启用IP伪装(MASQUERADE) sudo nft add rule ip nat postrouting oifname "eth0" masquerade

关键点解释:

  • prerouting链处理进入的数据包
  • postrouting链处理发出的数据包
  • masquerade会自动处理动态IP的情况

4.2 内网服务暴露

将内网NAS的HTTP服务映射到公网:

sudo nft add rule ip nat prerouting \ iifname "eth0" tcp dport 8080 \ dnat to 192.168.1.100:80

这条规则实现:

  • 从eth0接口进入的8080端口流量
  • 转发到内网192.168.1.100的80端口

5. 规则优化与调试技巧

5.1 使用命名集合提升效率

当需要管理大量IP时,集合(set)特别有用:

sudo nft add set inet filter allowed_ips { type ipv4_addr \; } sudo nft add element inet filter allowed_ips { 192.168.1.5, 192.168.1.20 } sudo nft add rule inet filter input ip saddr @allowed_ips accept

这样维护白名单时只需更新集合,不用修改规则本身。

5.2 日志记录与监控

排查规则匹配问题时,我常用日志功能:

sudo nft add rule inet filter input \ tcp dport 3306 \ log prefix "MySQL_attempt: " \ level warn \ drop

然后在日志中查看匹配记录:

journalctl -kf | grep MySQL_attempt

6. 持久化与备份策略

6.1 配置文件管理

我习惯将规则保存在/etc/nftables.conf:

sudo nft list ruleset > /etc/nftables.conf

然后编辑/etc/nftables.conf,添加注释和空行提高可读性:

#!/usr/sbin/nft -f # 清空现有规则 flush ruleset # 定义filter表 table inet filter { # 输入链 chain input { type filter hook input priority 0 # 允许本地回环 iif "lo" accept # 放行SSH tcp dport 22 accept } }

6.2 版本控制实践

我把防火墙配置纳入Git管理:

sudo mkdir /etc/nftables sudo mv /etc/nftables.conf /etc/nftables/rules.nft sudo git init /etc/nftables

每次修改后提交:

cd /etc/nftables sudo git add . sudo git commit -m "添加SSH频率限制规则"

这样能轻松回滚到任意版本。

http://www.jsqmd.com/news/576215/

相关文章:

  • DamaiHelper抢票工具完全掌握:从入门到精通
  • 3步解锁游戏帧率潜能:DLSS Swapper让你的显卡性能飙升
  • PT助手Plus深度解析:如何构建高效PT种子管理生态系统
  • VT System故障排查指南:从License验证到硬件连接全解析
  • 家具喷涂废气治理实操|可迪尔北京顺义案例,沸石转轮+CO破解大风量低浓度难题
  • 如何用Python解析LRMX文件:干部管理系统开发实战(附完整代码)
  • 微信域名检测-域名检测-域名安全检测-域名拦截检测 - Jumdata
  • 从仿真到实战:基于快马AI生成openclaw工业分拣流水线控制程序
  • 用快马平台快速复刻cherry studio:5分钟搭建可视化待办应用原型
  • 实战指南:如何用PyTorch Lightning复现HybridCBM,提升你的分类模型可解释性
  • 给AURIX TC3XX的Trap机制做个“体检”:手把手配置异常向量表与自定义处理函数
  • WPF实战进阶:从零构建工业级数字大屏监控系统
  • 融合改进A*与DWA的机器人动态避障MATLAB仿真实战
  • 从零构建电池一阶RC模型:核心方程与动态过程全解析
  • 为什么你的Ubuntu实时内核编译失败了?PREEMPT_RT补丁的5个关键配置解析
  • 技术赋能实业 流量转化价值—CitioAI启算引擎GEO优化深度赋能贵巢测评报告 - 新闻快传
  • 别再混着用了!Fastjson1和Fastjson2混搭依赖的隐藏风险(附2.0.26漏洞复现)
  • DataX HDFS Reader配置避坑指南:从TextFile到ORC,手把手教你搞定复杂类型同步
  • Flutter Riverpod 状态管理实战:从基础到高级模式
  • 无人机射频通信技术:从抗干扰到智能优化的演进之路
  • 2026年江苏ERP企业有哪些?这份参考指南请收好 - 品牌排行榜
  • 树莓派4B部署YOLOv5-Lite实战:从ONNX模型优化到实时检测性能调优
  • 3倍效率提升:FitGirl Repack Launcher让游戏管理化繁为简
  • 实测MinerU镜像:复杂排版PDF转Markdown,效果惊艳
  • Spring Cloud Eureka踩坑实录:No instances available报错的5种真实修复案例
  • 从刀具磨损到作物生长:盘点5个工业界‘物理+AI’混合建模的落地案例与代码复现要点
  • 多通道LCR测试仪选型指南:赛秘尔在产线效率与精度之间的平衡方案 - 品牌推荐大师
  • 别再死记硬背了!用‘借位法’5分钟搞定子网划分,网工面试必看
  • Marked.js:现代Web开发中的高效Markdown解析方案
  • 提升开发效率,用快马平台快速生成openclaw技术方案对比验证代码