searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

nftables常用命令

2024-11-20 09:15:26
10
0

1.簇(family)

nftables统一了之前的xtables,提出了簇的概念

ip ipv4
ip6 ipv6
inet internet(IPv4/IPv6)
arp arp ,处理arp数据包
bridge 网桥,处理通过网桥设备的数据包
netdev netdev,处理来自入口的数据包

2.表(tables)

容器,存放chain链的
默认是不存在表的,需要人为的自定义表

1.列出表: nft list tables

2.列出表中的链和规则:nft list table family table 

3.创建新表:nft add table family table

4.删除表

只能删除不包含链的表 (能删除包含链的)
删除表: nft delete table family table

5.清空表

清空一个表中的所有规则:nft flush table family table

 

3.链(chain)

1.基本链

1). 类型(type)
分为 filter / route / nat

- filter:过滤数据包
- route:对数据包进行重路由
- nat:对 数据流 进行 网络地址转换(数据流仅第一个包会因为钩子进入本链,之后的会绕过)

 

类型 hook 描述
filter all all 标准链类型
nat ipv4,ipv6,inet

prerouting,input,

output,postrouting

根据conntrack条目执行本地地址转。 只有连接的第一个数据包实际遍历此链 - 它的规则通常定义创建的 conntrack 条目的详细信息
route ipv4,ipv6 output 如果数据包已经通过该类型的链并将被接受,且 IP 标头的相关部分已更改,则会执行新的路由查找。

 

2)钩子(hook)
hook 有六种主要钩子,通过钩子进而抓取指定区域的流量分别为 INGRESS / PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING(INGRESS/EGRESS 从 Kernel 4.2 后加入 NetDev 地址簇,Kernel 5.10 后加入 inet 地址簇)
IP / IP6 / INET / Bridge 表 family 地址簇 使用 PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING
ARP 地址簇表 可以使用 Input 和 Output
NetDev 地址簇表 可以使用 INGRESS 钩子类型

3)优先级(priority)
Nftables 基础链 优先级 priority 通过 顺序排列 进而 按顺序执行不同hook

4)策略(policy)

 决定经过所有规则后的数据包流向,分别为 Accept(默认) 和 Drop

选择 Accept 则通过匹配并继续执行 Nftables 所配置的 其他链
选择 Drop 则放弃并终止继续执行

 

2.常规链
和规则跳转有关

 

3.列出所有链

显示所有表中包含的chains:nft list chains

4.列出某条链中的所有规则
列出一个链中的所有规则:
# nft list chain family table chain

 

5.创建链

# 常规链 nft add chain family table chain

# 基本链 nft add chain family table chain { type type hook hook priority priority \; }

 

6. 编辑链
要编辑一个链,只需按名称调用并定义要更改的规则。

nft chain family table chain { [ type type hook hook device device priority priority \; policy <policy> \; ] }

例如,将默认表中的input链策略从accept更改为drop:
nft chain inet my_table my_filter_chain {policy drop \;}  # 高危操作,连接会中断

 

7.删除链

nft delete chain family table chain (删除  my_filter_chain  (不带规则))

 

8.清空链中的规则

nft flush chain family table chain  

清空GLOBAL_INGRESS_ALLOWED 链 :nft flush chain bridge sddc-microseg GLOBAL_INGRESS_ALLOWED


4.规则(rule)

只针对 chain 链 捕获的流量处理
重点是声明 statements的使用

1.介绍

1).expression  表达式

meta:(元属性,例如接口)
  oif <output interface INDEX>
  iif <input interface INDEX>
  oifname <output interface NAME>
  iifname <input interface NAME>

  (oif 和 iif 接受字符串参数并转换为接口索引)
  (oifname 和 iifname 更具动态性,但因字符串匹配速度更慢)

icmp:(ICMP协议)
  type <icmp type>

icmpv6:(ICMPv6协议)
  type <icmpv6 type>

ip:(IP协议)
  protocol <protocol>
  daddr <destination address>
  saddr <source address>

ip6:(IPv6协议)
  daddr <destination address>
  saddr <source address>

tcp:(TCP协议)
  dport <destination port>
  sport <source port>

udp:(UDP协议)
  dport <destination port>
  sport <source port>

sctp:(SCTP协议)
  dport <destination port>
  sport <source port>

ct:(链接跟踪)
  state <new | established | related | invalid>

2).action:(与iptables有点类似) -- 用于判断

accept:接受数据包并停止其余规则。
drop:丢弃数据包并停止其余规则。

queue:将数据包排队到用户空间并停止其余规则。

continue:使用下一个规则并继续规则集判断。
return:从当前链返回并继续上一个链的下一条规则。在基链中它相当于接受jump <chain> :跳转到新链,开始执行新链的第一条规则。发出 return 语句后,它将继续执行原链下一个规则goto <chain>:类似于跳转,但执行完毕新链之后,将直接进行新链最终判定而不是包含 goto 语句的链上继续
Nftables 规则的配置需要参考可选项 [handle] 代表指定规则位置,参考 list 时的 handle 值决定可选项 [comment] 未知使用场景,
add 将 规则 插在 原规则列表 后面,insert 将 规则 插在 原规则列表 前面


2.列出规则
1)列出所有规则:nft list ruleset
2)列出表中所有规则:nft list table family table 
3)列出一个链中的所有规则:nft list chain family table chain

3.创建规则
add 是后加;规则添加到handle处。默认是规则添加到链的末尾。
nft add rule family table chain handle handle statement 
insert是指定或者往前加;默认是规则插入到链的开头。
nft insert rule family table chain handle handle statement

添加一条规则允许 SSH 登录
nft add rule inet my_table my_filter_chain tcp dport ssh accept
nft insert rule inet my_table my_filter_chain tcp dport http accept

4.插入规则到指定位置

1)index
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。index 的值从 0 开始增加。ps:
index 类似于 iptables 的 
-I 选项,但有两点需要注意:
-  index 的值是从 0 开始的;
-  index 必须指向一个存在的规则,比如 
nft insert rule … index 0 就是非法的。

[root@11 microseg]# nft insert rule inet my_table my_filter_chain index 1 tcp dport nfs accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain                            table inet my_table {
        chain my_filter_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept
                tcp dport 2049 accept
                tcp dport 22 accept
        }
}
[root@11 microseg]# nft add rule inet my_table my_filter_chain index 0 tcp dport 1234 accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain                            table inet my_table {
        chain my_filter_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept
                tcp dport 1234 accept
                tcp dport 2049 accept
                tcp dport 22 accept
        }
}

2)handle
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。
handle 的值可以通过参数 
--handle 获取在 nftables 中,句柄值是固定不变的,除非规则被删除,这就为规则提供了稳定的索引。而 
index 的值是可变的,只要有新规则插入,就有可能发生变化。一般建议使用 
handle 来插入新规则。也可以在创建规则时就获取到规则的句柄值,只需要在创建规则时同时加上参数 
--echo 和 --handle

[root@11 microseg]# nft --handle  list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
        }
}

[root@11 microseg]#  nft add rule inet my_table my_filter_chain handle 7 tcp dport 1234 accept

[root@11 microseg]# nft --handle  list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8  # 新增
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
        }
}

# echo 和 handle

[root@11 microseg]# nft --echo --handle add rule inet my_table my_filter_chain udp dport 3333 accept
add rule inet my_table my_filter_chain udp dport 3333 accept # handle 9 # 表示为第9个
# new generation 187 by process 1637000 (nft)

[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}


5. 删除规则
单个规则只能通过其句柄删除,首先需要找到删除的规则句柄:

1. 确定句柄

[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}


然后使用句柄值来删除该规则:
[root@11 microseg]# nft delete rule inet my_table my_filter_chain handle 8
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}






0条评论
0 / 1000
pengs
1文章数
0粉丝数
pengs
1 文章 | 0 粉丝
pengs
1文章数
0粉丝数
pengs
1 文章 | 0 粉丝
原创

nftables常用命令

2024-11-20 09:15:26
10
0

1.簇(family)

nftables统一了之前的xtables,提出了簇的概念

ip ipv4
ip6 ipv6
inet internet(IPv4/IPv6)
arp arp ,处理arp数据包
bridge 网桥,处理通过网桥设备的数据包
netdev netdev,处理来自入口的数据包

2.表(tables)

容器,存放chain链的
默认是不存在表的,需要人为的自定义表

1.列出表: nft list tables

2.列出表中的链和规则:nft list table family table 

3.创建新表:nft add table family table

4.删除表

只能删除不包含链的表 (能删除包含链的)
删除表: nft delete table family table

5.清空表

清空一个表中的所有规则:nft flush table family table

 

3.链(chain)

1.基本链

1). 类型(type)
分为 filter / route / nat

- filter:过滤数据包
- route:对数据包进行重路由
- nat:对 数据流 进行 网络地址转换(数据流仅第一个包会因为钩子进入本链,之后的会绕过)

 

类型 hook 描述
filter all all 标准链类型
nat ipv4,ipv6,inet

prerouting,input,

output,postrouting

根据conntrack条目执行本地地址转。 只有连接的第一个数据包实际遍历此链 - 它的规则通常定义创建的 conntrack 条目的详细信息
route ipv4,ipv6 output 如果数据包已经通过该类型的链并将被接受,且 IP 标头的相关部分已更改,则会执行新的路由查找。

 

2)钩子(hook)
hook 有六种主要钩子,通过钩子进而抓取指定区域的流量分别为 INGRESS / PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING(INGRESS/EGRESS 从 Kernel 4.2 后加入 NetDev 地址簇,Kernel 5.10 后加入 inet 地址簇)
IP / IP6 / INET / Bridge 表 family 地址簇 使用 PREROUTING / INPUT / FORWARD / OUTPUT / POSTROUTING
ARP 地址簇表 可以使用 Input 和 Output
NetDev 地址簇表 可以使用 INGRESS 钩子类型

3)优先级(priority)
Nftables 基础链 优先级 priority 通过 顺序排列 进而 按顺序执行不同hook

4)策略(policy)

 决定经过所有规则后的数据包流向,分别为 Accept(默认) 和 Drop

选择 Accept 则通过匹配并继续执行 Nftables 所配置的 其他链
选择 Drop 则放弃并终止继续执行

 

2.常规链
和规则跳转有关

 

3.列出所有链

显示所有表中包含的chains:nft list chains

4.列出某条链中的所有规则
列出一个链中的所有规则:
# nft list chain family table chain

 

5.创建链

# 常规链 nft add chain family table chain

# 基本链 nft add chain family table chain { type type hook hook priority priority \; }

 

6. 编辑链
要编辑一个链,只需按名称调用并定义要更改的规则。

nft chain family table chain { [ type type hook hook device device priority priority \; policy <policy> \; ] }

例如,将默认表中的input链策略从accept更改为drop:
nft chain inet my_table my_filter_chain {policy drop \;}  # 高危操作,连接会中断

 

7.删除链

nft delete chain family table chain (删除  my_filter_chain  (不带规则))

 

8.清空链中的规则

nft flush chain family table chain  

清空GLOBAL_INGRESS_ALLOWED 链 :nft flush chain bridge sddc-microseg GLOBAL_INGRESS_ALLOWED


4.规则(rule)

只针对 chain 链 捕获的流量处理
重点是声明 statements的使用

1.介绍

1).expression  表达式

meta:(元属性,例如接口)
  oif <output interface INDEX>
  iif <input interface INDEX>
  oifname <output interface NAME>
  iifname <input interface NAME>

  (oif 和 iif 接受字符串参数并转换为接口索引)
  (oifname 和 iifname 更具动态性,但因字符串匹配速度更慢)

icmp:(ICMP协议)
  type <icmp type>

icmpv6:(ICMPv6协议)
  type <icmpv6 type>

ip:(IP协议)
  protocol <protocol>
  daddr <destination address>
  saddr <source address>

ip6:(IPv6协议)
  daddr <destination address>
  saddr <source address>

tcp:(TCP协议)
  dport <destination port>
  sport <source port>

udp:(UDP协议)
  dport <destination port>
  sport <source port>

sctp:(SCTP协议)
  dport <destination port>
  sport <source port>

ct:(链接跟踪)
  state <new | established | related | invalid>

2).action:(与iptables有点类似) -- 用于判断

accept:接受数据包并停止其余规则。
drop:丢弃数据包并停止其余规则。

queue:将数据包排队到用户空间并停止其余规则。

continue:使用下一个规则并继续规则集判断。
return:从当前链返回并继续上一个链的下一条规则。在基链中它相当于接受jump <chain> :跳转到新链,开始执行新链的第一条规则。发出 return 语句后,它将继续执行原链下一个规则goto <chain>:类似于跳转,但执行完毕新链之后,将直接进行新链最终判定而不是包含 goto 语句的链上继续
Nftables 规则的配置需要参考可选项 [handle] 代表指定规则位置,参考 list 时的 handle 值决定可选项 [comment] 未知使用场景,
add 将 规则 插在 原规则列表 后面,insert 将 规则 插在 原规则列表 前面


2.列出规则
1)列出所有规则:nft list ruleset
2)列出表中所有规则:nft list table family table 
3)列出一个链中的所有规则:nft list chain family table chain

3.创建规则
add 是后加;规则添加到handle处。默认是规则添加到链的末尾。
nft add rule family table chain handle handle statement 
insert是指定或者往前加;默认是规则插入到链的开头。
nft insert rule family table chain handle handle statement

添加一条规则允许 SSH 登录
nft add rule inet my_table my_filter_chain tcp dport ssh accept
nft insert rule inet my_table my_filter_chain tcp dport http accept

4.插入规则到指定位置

1)index
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。index 的值从 0 开始增加。ps:
index 类似于 iptables 的 
-I 选项,但有两点需要注意:
-  index 的值是从 0 开始的;
-  index 必须指向一个存在的规则,比如 
nft insert rule … index 0 就是非法的。

[root@11 microseg]# nft insert rule inet my_table my_filter_chain index 1 tcp dport nfs accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain                            table inet my_table {
        chain my_filter_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept
                tcp dport 2049 accept
                tcp dport 22 accept
        }
}
[root@11 microseg]# nft add rule inet my_table my_filter_chain index 0 tcp dport 1234 accept
[root@11 microseg]# nft list chain inet my_table my_filter_chain                            table inet my_table {
        chain my_filter_chain {
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept
                tcp dport 1234 accept
                tcp dport 2049 accept
                tcp dport 22 accept
        }
}

2)handle
add 表示新规则添加在索引位置的规则后面,
inser 表示新规则添加在索引位置的规则前面。
handle 的值可以通过参数 
--handle 获取在 nftables 中,句柄值是固定不变的,除非规则被删除,这就为规则提供了稳定的索引。而 
index 的值是可变的,只要有新规则插入,就有可能发生变化。一般建议使用 
handle 来插入新规则。也可以在创建规则时就获取到规则的句柄值,只需要在创建规则时同时加上参数 
--echo 和 --handle

[root@11 microseg]# nft --handle  list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
        }
}

[root@11 microseg]#  nft add rule inet my_table my_filter_chain handle 7 tcp dport 1234 accept

[root@11 microseg]# nft --handle  list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8  # 新增
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
        }
}

# echo 和 handle

[root@11 microseg]# nft --echo --handle add rule inet my_table my_filter_chain udp dport 3333 accept
add rule inet my_table my_filter_chain udp dport 3333 accept # handle 9 # 表示为第9个
# new generation 187 by process 1637000 (nft)

[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}


5. 删除规则
单个规则只能通过其句柄删除,首先需要找到删除的规则句柄:

1. 确定句柄

[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 1234 accept # handle 8
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}


然后使用句柄值来删除该规则:
[root@11 microseg]# nft delete rule inet my_table my_filter_chain handle 8
[root@11 microseg]# nft --handle list chain inet my_table my_filter_chain
table inet my_table {
        chain my_filter_chain { # handle 3
                type filter hook input priority filter; policy accept;
                tcp dport 80 accept # handle 5
                tcp dport 1234 accept # handle 7
                tcp dport 2049 accept # handle 6
                tcp dport 22 accept # handle 4
                udp dport 3333 accept # handle 9
        }
}






文章来自个人专栏
防火墙-nftables使用
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0