Skip to content

数据类型

nft describe 您可以使用 nft describe 来获取有关数据类型的信息,找出特定选择器的数据类型,并列出该选择器的预定义符号常量

shell
[root@localhost ~]# nft describe iif
meta expression, datatype iface_index (network interface index) (basetype integer), 32 bits
[root@localhost ~]# nft describe iifname
meta expression, datatype ifname (network interface name) (basetype string), 16 characters
[root@localhost ~]#

以下是可用匹配项的不完整列表:

  • meta (元属性,例如 interfaces)
  • icmp (ICMP 协议)
  • icmpv6 (ICMPv6 协议)
  • ip (IP 协议)
  • ip6 (IPv6 协议)
  • tcp (TCP 协议)
  • udp (UDP 协议)
  • sctp (SCTP 协议)
  • ct (连接跟踪 connection tracking)
yml
meta:
  oif <output interface INDEX>
  iif <input interface INDEX>
  oifname <output interface NAME>
  iifname <input interface NAME>

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

icmp:
  type <icmp type>

icmpv6:
  type <icmpv6 type>

ip:
  protocol <protocol>
  daddr <destination address>
  saddr <source address>

ip6:
  daddr <destination address>
  saddr <source address>

tcp:
  dport <destination port>
  sport <source port>

udp:
  dport <destination port>
  sport <source port>

sctp:
  dport <destination port>
  sport <source port>

ct:
  state <new | established | related | invalid>

1. 数据包元信息匹配

元选择器允许您匹配 - 在某些情况下,设置 - 数据包元信息。也就是说,本地主机拥有的有关数据包的信息(例如如何/何时接收数据包),这些信息不一定在数据包本身中携带。

以下元选择器通过数据包本身携带的信息来匹配数据包:

KeywordSettableDescriptionData Type 数据类型Notes
pkttypeYpacket type (unicast, broadcast, multicast, other)pkt_typehost 0[不建议使用]
单拨unicast 0
广播broadcast 1
多播multicast 2
其他other 3
length数据包长度(以字节为单位)integer (32 bit)
protocol数据包 协议/EtherType 协议值ether_typeas in skb->protocol
nfprotoNetFilter 数据包协议族integer (32 bit)如IPv4、IPv6,etc....;仅在 Inet 表中有用
l4protolayer 4 protocol 第 4 层协议integer (8 bit) 整数(8 位)像TCP、UDP,etc......;跳过 IPv6 扩展标头

2. 接口匹配

元选择器根据传入或传出接口匹配数据包,以下仅列出常用的匹配方式,完整内容请参考官网

KeywordSettableDescriptionData TypeNotes
iif输入接口索引iface_index比 iifname 更快,因为它只需要比较一个 32 位无符号整数而不是一个字符串。接口索引是动态分配的,因此不要将其用于动态创建和销毁的接口,例如。PPP0 中。
iifname输入接口名称ifname
oif输出接口索引iface_index比 oifname 更快,因为它只需要比较一个 32 位无符号整数而不是一个字符串。 接口索引是动态分配的,因此不要将其用于动态创建和销毁的接口,例如。PPP0 中。
oifname输出接口名称ifname
shell
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:03:19:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.26/24 brd 192.168.1.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 2408:8244:8600:43f:20c:29ff:fe03:19e8/64 scope global dynamic noprefixroute 
       valid_lft 245803sec preferred_lft 159403sec
    inet6 fe80::20c:29ff:fe03:19e8/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@localhost ~]# nft add rule inet test chain1 meta iif 2 accept #
[root@localhost ~]# nft add rule inet test chain1 meta iif ens33  accept #
[root@localhost ~]# 
[root@localhost ~]# nft -a -n list table inet test
table inet test { # handle 21
	chain chain2 { # handle 2
		comment "常规链"
	}

	chain chain1 { # handle 58
		comment "常规链"
		type filter hook input priority 0; policy accept;
		tcp dport 22 accept # handle 66
		tcp dport 12 accept # handle 70
		tcp dport 443 accept # handle 67
		tcp dport 114 accept # handle 71
		tcp dport 1443 accept # handle 68
		ip saddr 192.168.1.21 counter packets 0 bytes 0 # handle 75
		iif "ens33" accept # handle 76
		iif "ens33" accept # handle 77
	}

	chain chain4 { # handle 60
		type filter hook input priority 110; policy accept;
		tcp dport 22 accept # handle 65
	}
}
[root@localhost ~]#

3. 按数据包标记、路由类别和领域进行匹配

KeywordSettableDescriptionData Type 数据类型Notes
markY数据包标记mark
priorityYTC 数据包优先级tc_handledetailed usage example 详细使用示例
rtclassid路由领域realmRouting realm references: 路由领域引用:linux-ip.netpolicyrouting.org