nftables 是什么? 提供什么功能? 如何使用?

Nftables Wiki:https://wiki.nftables.org/wiki-nftables/index.php/Main_Page

Nftables HowTo: https://farkasity.gitbooks.io/nftables-howto-zh/content/

第一次看到nftables还是在Centos 8 What's New中,于是就开始研究下nftables到底是什么? 提供什么功能? 如何使用?

 

What is nftables?

  nftables is the new packet classification framework that replaces the existing {ip,ip6,arp,eb}_tables infrastructure. 

  Centos 8已将iptables替换为nftables,因此是时候学习nftablesiptables之间的差异。

  Centos 8中Firewalld守护进程使用nftables作为默认后端,在Centos 7中使用的是iptables作为后端。

  nftables简化了双堆栈IPv4/IPv6的管理,它提供了inet基链来允许同时管理IPv4和IPv6流量。

  nftables基于链式布局比iptables数组布局有更好的性能。

 

nftables hook

跟netfilter一样,也有下面5个钩子,常用的也就 input/output/forward 三个hook。

                                             Local
                                            process
                                              ^  |      .-----------.
                   .-----------.              |  |      |  Routing  |
                   |           |-----> input /    \---> |  Decision |----> output \
--> prerouting --->|  Routing  |                        .-----------.              \
                   | Decision  |                                                     --> postrouting
                   |           |                                                    /
                   .-----------.---------------> forward --------------------------- 

Linux kernel 4.2 中新增了ingress hook,This new hook basically provides an alternative to tc ingress filtering. You still need tc for traffic shaping/queue management.

                                 .-----------.             
                                 |           |-----> input ...
---> ingress ---> prerouting --->|  Routing  |
                                 | Decision  |
                                 |           |
                                 |-----------|-----> forward ...

 

 

nftables三个概念:

  table - 指包含chain的一个容器, 没有特定语义

  chain - 指包含在一个table里的rule容器

  rule - 指包含在chain里的action

 

1、Table

  table语法

    $ nft list tables [<family>]

    $ nft list table [<family>] <name> [-n] [-a]

    $ nft (add | delete | flush) table [<family>] <name>

  table语法示例

    - 查询所有表

      $ nft list tables

    - 创建inet表

      $ nft add table inet tb_01

    - 查询指定表

      $ nft list table tb_01 -an

    - 删除表

      $ nft delete table inet tb_01

    - 清除表

      $ nft flush table inet tb_01

2、Chain

  Chian可以创建的Type:

    - filter

    - router

    - nat

  Family支持的Hook:

    - ip/ipv6/inet: prerouting, input, forward, output, postrouting

    - arp: input, output

    - netdev: ingress

  Priority 参考值:

    - NF_IP_PRI_NAT_DST (-100): destination NAT
            - NF_IP_PRI_FILTER (0): filtering operation, the filter table
            - NF_IP_PRI_SECURITY (50): Place of security table where secmark can be set for example
            - NF_IP_PRI_NAT_SRC (100): source NAT

  Policy是控制Chian中Flow的默认判决语句:

    - accept

    - drop

    - queue

    - continue

    - return

  chain语法

    $ nft (add | create) chain [<family>] <table> <name> [ { type <filter|router|nat> hook <hook> [device <device>] priority <priority> \; [policy <policy> \; ] } ]

    $ nft (delete | list | flush) chain [<family>] <table> <name>

            $ nft rename chain [<family>] <table> <name> <newname>

  chain语法示例

    - 在table中添加type为filter的input chian, 优先级为0,Policy默认的动作为 drop

      $ nft add chain inet tb_01 chain_01_input { type filter hook input priority 0 \; policy drop \; }

    - 在table中添加type为filter的output chian, 优先级为0,Policy默认的动作为 accept

      $ nft add chain inet tb_01 chain_01_output { type filter hook input priority 0 \; policy accept \; }

3、Rules

  handle is an internal number that identifies a certain rule.

  position is an internal number that is used to insert a rule before a certain handle.

      matches 和 statements 因为内容太多,请参考文档 https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes#Rules

  rule语法

    $ nft add rule [<family>] <table> <chain> <matches> <statements>

    $ nft insert rule [<family>] <table> <chain> [position <position>] <matches> <statements>

    $ nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements>

    $ nft delete rule [<family>] <table> <chain> [handle <handle>]  

  rule示例 <更多示例 https://wiki.nftables.org/wiki-nftables/index.php/Simple_rule_management>

    - 在chain里添加规则,开放22端口

      $ nft add rule inet tb_01 chain_01_input tcp dport 22 accept

    - 在chain里替换指定规则

      $ nft replace rule inet tb_01 chain_01_input handle 2 tcp dport 22 drop

    - 在chain里删除规则

      $ nft delete rule inet tb_01 chain_01_input handle 2

posted @ 2020-02-19 23:34  Vincen_shen  阅读(1689)  评论(0编辑  收藏  举报