nftables 文档

nftables 文档

我一直在从“高级”(awall、ufw、firewall-cmd 等)防火墙工具迁移到nftables“脚本”,但文档体验并不是最好的。手册页和 nftables wiki(以及其他来源,如 Gentoo 和 Arch wiki、Ubuntu 和 Debian 手册页等)似乎并未涵盖所有内容。

例如“meta l4proto”,我在 Gentoo wiki 上发现它可以接受“ipv6-icmp”来检查 v6 ping,但这仅在示例中显示,并没有在其他地方记录。

手册页仅提供:

l4proto 第 4 层协议,跳过 ipv6 扩展标头 整数(8 位)

另一个例子是“meta”表达式关键字本身。有使用它的匹配示例,也有不使用它的匹配示例(例如:meta iff foovs iff foo)。那么,它只是“冗长”的事情吗?还是它改变了规则的行为/匹配?

从手册页中:

元表达式有两种类型:非限定元表达式和限定元表达式。限定元表达式要求在元键前使用 meta 关键字,非限定元表达式可以直接使用元键指定,也可以作为限定元表达式指定。

因此,虽然我可以从不同来源破解防火墙(大多数示例似乎最具参考价值),但这一切似乎都适得其反,我没有足够的信心在生产中部署我不理解的 nftables。有没有真正完整的 nftables 来源?

我研究过由“高级”防火墙工具生成的 nftables,它们似乎都使用了非常混合的风格。

附件是我玩过的脚本:

#!/usr/bin/nft -f

flush ruleset

table inet my {
    set CloudflareDNSv4 {
        type ipv4_addr
        elements = {1.1.1.1, 1.0.0.1}
    }

    set CloudflareDNSv6 {
        type ipv6_addr
        elements = {2606:4700:4700::1111, 2606:4700:4700::1001}
    }

    chain MY_INPUT {
        type filter hook input priority 0; policy drop;

        ct state invalid drop

        meta l4proto icmp counter jump PING
        meta l4proto ipv6-icmp counter jump PING

        ct state established,related accept

        meta iif "lo" accept
        meta iif != "lo" ip  daddr 127.0.0.1/8 drop
        meta iif != "lo" ip6 daddr ::1/128 drop

        tcp dport 22 accept

        log prefix "IN Dropped packet: " drop
        counter
    }

    chain MY_FORWARD {
        type filter hook forward priority 0; policy drop;

        log prefix "FW Dropped packet: " drop
        counter
    }

    chain MY_OUTPUT {
        type filter hook output priority 0; policy drop;

        ct state established,related accept
        ct state invalid drop

        meta oif "lo" accept
        meta oif != "lo" ip  saddr 127.0.0.1/8 drop
        meta oif != "lo" ip6 saddr ::1/128 drop

        udp dport  53 jump DNS
        udp dport 853 jump DNS

        meta l4proto icmp accept
        meta l4proto ipv6-icmp accept

        log prefix "OUT Dropped packet: " drop
        counter
    }

    chain DNS {
        ip  daddr @CloudflareDNSv4 accept
        ip6 daddr @CloudflareDNSv6 accept

        drop
    }

    chain PING {
        counter packets 0 bytes 0
        limit rate over 10/second burst 5 packets drop

        icmp type {
            echo-reply,                 # 0
            destination-unreachable,    # 3
            echo-request,               # 8
            time-exceeded,              # 11
            parameter-problem,          # 12
        } accept
        icmpv6 type {
            destination-unreachable,    # 1
            packet-too-big,             # 2
            time-exceeded,              # 3
            parameter-problem,          # 4
            echo-request,               # 128
            echo-reply,                 # 129
        } accept

        drop
    }
}

相关内容