nftables用法介绍(Nftables)

一、nftables简介

nftables是Linux内核中新一代的数据包过滤、分类和转发框架,可以用于代替之前广泛使用的iptables和ip6tables,并提供更好的性能和可扩展性,同时支持IPv4和IPv6。它允许用户定义、分类和过滤数据包,使管理员可以更加灵活、精细地控制网络流量。

二、nftables配置

为了开始使用nftables,您首先需要像安装iptables一样,从源代码中安装nftables。安装后,您需要执行以下步骤启用nftables:

1. 启用nftables服务

$ systemctl enable nftables.service

2. 将防火墙规则添加到nftables.conf文件中

nftables.conf是一个配置文件,可用于指定nftables规则。这个文件将被读入,以初始化nftables的防火墙规则集合。


#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;

        # 允许外部主机访问SSH
        ct state new,established tcp dport 22 accept

        # 允许外部主机访问HTTP和HTTPS
        ct state new,established tcp dport {80, 443} accept

        # 允许回环接口上的所有数据包
        iif lo accept

        # 其他数据包都将被拒绝
        reject with icmpx type admin-prohibited
    }
}

3. 加载nftables防火墙规则

你可以使用nft或nftables命令行工具加载规则,例如:

$ nft -f /etc/nftables.conf

三、nftables示例代码

1. 允许某个IP地址访问端口


#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;

        ip saddr 192.168.1.50 tcp dport 22 accept
    }
}

2. 阻止某个IP地址访问端口


table inet filter {
    chain input {
        type filter hook input priority 0;

        ip saddr 192.168.1.50 drop
    }
}

3. 防止针对SSH暴力破解

将以下脚本保存到/etc/nftables.conf中以防止SSH暴力攻击。该规则将在5分钟内允许三个尝试,如果更多的尝试被阻止,则将为源IP地址禁用端口22访问。


#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set bruteforce {
        type ipv4_addr
        flags interval
        size 65535
        interval 5m
        timeout 1h
    }
    chain input {
        type filter hook input priority 0;

        ct state new tcp dport 22 {
            add @bruteforce { ip saddr timeout 30s }
            # 如果来源IP地址在黑名单中,则禁止访问
            if @bruteforce >= 3 { drop }
            # otherwise accept
            accept
        }

        # 允许外部主机访问SSH
        ct state new,established tcp dport 22 accept

        # 允许外部主机访问HTTP和HTTPS
        ct state new,established tcp dport {80, 443} accept

        # 允许回环接口上的所有数据包
        iif lo accept

        # 其他数据包都将被拒绝
        reject with icmpx type admin-prohibited
    }
}

4. 将数据包路由到不同的链中

以下示例将TCP数据包重定向到TCP链中,将UDP数据包重定向到UDP链中:


table inet filter {
    chain input {
        type filter hook input priority 0;

        # 将TCP数据包重定向到TCP链中
        ip protocol tcp jump TCP

        # 将UDP数据包重定向到UDP链中
        ip protocol udp jump UDP

        # 其他数据包都将被拒绝
        reject with icmpx type admin-prohibited
    }
    chain TCP {
        type filter hook input priority 0;
        # 处理TCP数据包的规则
        ...
    }
    chain UDP {
        type filter hook input priority 0;
        # 处理UDP数据包的规则
        ...
    }
}

5. 管理nftables防火墙规则

以下命令可以用于管理nftables防火墙规则:


# 显示当前规则集以及规则的统计信息
$ nft list ruleset
# 刷新规则集和计数器
$ nft flush ruleset
# 测试规则是否匹配
$ nft test rule {table} {chain} {rule}
# 添加一条规则
$ nft add rule {table} {chain} {rule}
# 删除一条规则
$ nft delete rule {table} {chain} {rule}
# 显示规则集占用的内存
$ nft --debug=netlink --handle --echo <file>

四、总结

nftables提供了比iptables更灵活和可扩展的防火墙框架,并在Linux内核中得到广泛的应用。它允许用户定义、分类和过滤数据包,从而更好地控制网络流量,保障网络安全。本文介绍了nftables的安装和配置步骤,并给出了几个示例代码,可以帮助读者更好地了解并使用nftables。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平