Linux防火墙配置实战:nftables规则编写与iptables迁移方案

nftables为什么取代iptables成为Linux默认防火墙

Linux系统管理中,防火墙配置是服务器安全加固的基础环节。自Linux内核3.13起,nftables被引入作为iptables的替代方案,并在内核4.1后逐步成为推荐选项。nftables通过统一的虚拟机引擎处理网络包过滤,解决了iptables在IPv4/IPv6/ARP/Bridge多套规则并行维护时的复杂性问题。现代主流发行版(Debian 10+、CentOS 8+、Ubuntu 20.04+)已默认使用nftables后端。

nftables相对于iptables的核心改进包括:规则语法更紧凑、支持原子性规则替换、原生支持集合和字典数据结构、无需额外模块即可处理IPv6。但大量存量服务器仍运行iptables规则,迁移过程中需要保证业务不中断。

nftables基础规则语法

nftables使用表(table)、链(chain)、规则(rule)三层结构。表按协议族划分,链定义钩子点和处理优先级,规则定义匹配条件和执行动作。

# 创建filter表(IPv4和IPv6共用)
nft add table inet my_filter

# 创建input链,挂载到入站钩子
nft add chain inet my_filter input '{ type filter hook input priority 0; policy drop; }'

# 允许本地回环
nft add rule inet my_filter input iif "lo" accept

# 允许已建立连接的流量
nft add rule inet my_filter input ct state established,related accept

# 允许SSH(限制来源IP段)
nft add rule inet my_filter input tcp dport 22 ip saddr 10.0.0.0/8 accept

# 允许HTTP和HTTPS
nft add rule inet my_filter input tcp dport { 80, 443 } accept

# 允许ICMP(ping)
nft add rule inet my_filter input ip protocol icmp accept
nft add rule inet my_filter input ip6 nexthdr ipv6-icmp accept

# 丢弃无效数据包并记录日志
nft add rule inet my_filter input ct state invalid log prefix "DROP-INVALID: " drop

使用inet协议族可以同时处理IPv4和IPv6流量,避免维护两套独立规则表。policy drop设置了默认拒绝策略,只允许明确放行的流量通过。

使用集合简化批量规则管理

nftables的集合(set)功能是iptables所不具备的,可以大幅简化批量IP或端口管理。

# 定义允许SSH访问的IP集合
nft add set inet my_filter allowed_ssh '{ type ipv4_addr; flags interval; }'
nft add element inet my_filter allowed_ssh '{ 10.0.0.0/8, 172.16.0.0/12, 192.168.1.100 }'

# 引用集合的规则
nft add rule inet my_filter input tcp dport 22 ip saddr @allowed_ssh accept

# 定义需要封禁的IP集合(支持动态添加)
nft add set inet my_filter blacklist '{ type ipv4_addr; timeout 1h; }'
nft add rule inet my_filter input ip saddr @blacklist drop

# 动态添加封禁IP(自动1小时后过期)
nft add element inet my_filter blacklist '{ 203.0.113.50 }'

# 定义服务端口集合
nft add set inet my_filter web_ports '{ type inet_service; }'
nft add element inet my_filter web_ports '{ 80, 443, 8080, 8443 }'
nft add rule inet my_filter input tcp dport @web_ports accept

集合的timeout参数特别适合安全加固场景,被封禁的IP在指定时间后自动解除,避免人工维护封禁列表。interval标志支持CIDR网段格式的IP。

iptables规则迁移到nftables

存量服务器从iptables迁移到nftables,可以使用官方提供的翻译工具自动转换规则。

# 安装翻译工具
apt install iptables-nftables-compat  # Debian/Ubuntu

# 导出现有iptables规则
iptables-save > /tmp/iptables.rules

# 自动翻译为nftables语法
iptables-restore-translate -f /tmp/iptables.rules > /tmp/nftables.rules

# 检查翻译结果
cat /tmp/nftables.rules

# 加载翻译后的规则
nft -f /tmp/nftables.rules

# 验证规则是否生效
nft list ruleset

自动翻译工具能处理大部分常见规则,但以下情况需要手动调整:自定义链的引用关系可能翻译不完整;iptables的limit模块参数格式在nftables中略有不同;LOG目标的日志前缀和级别参数需要重新校验;多表(raw/mangle/nat/filter)间的优先级关系需要确认。

持久化规则与高可用集群同步

nftables规则默认保存在内存中,重启后丢失。持久化方案因发行版而异:

# Debian/Ubuntu:使用nftables.service
nft list ruleset > /etc/nftables.conf
systemctl enable nftables

# CentOS/RHEL:使用firewalld后端
firewall-cmd --permanent --add-rich-rule='rule source address="10.0.0.0/8" port port=22 protocol=tcp accept'
firewall-cmd --reload

# 高可用集群中通过配置管理工具同步规则
# Ansible示例
- name: Deploy nftables rules
  copy:
    content: "{{ lookup('template', 'nftables.conf.j2') }}"
    dest: /etc/nftables.conf
  notify: reload nftables

- name: Reload nftables
  command: nft -f /etc/nftables.conf
  when: nftables_reload | bool

服务器故障排查时,nftables的计数器功能可以定位被丢弃的流量类型。通过为每条规则添加counter参数,可以统计匹配的数据包数量和字节数,快速判断哪条规则阻断了业务流量。在高可用集群环境中,nftables规则应通过Ansible或SaltStack等配置管理工具统一分发,避免节点间规则不一致导致安全漏洞。IDC数据中心的硬件防火墙与主机nftables应分层部署,硬件防火墙负责边界防护,nftables负责主机级细粒度控制。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fang-huo-qiang-pei-zhi-shi-zhan-nftables-gui-ze-bian/

(0)
小编小编
上一篇 11小时前
下一篇 11小时前

相关推荐