nftables(5)表达式(3)PAYLOAD EXPRESSIONS

PAYLOAD EXPRESSIONS

Payload expressions在nftables中扮演着重要的角色,因为它们允许用户定义复杂的规则,这些规则可以基于数据包的内容(即有效载荷)来过滤、修改或允许数据包通过。这些表达式可以执行诸如数据拷贝、比较、位操作等多种操作,以实现对数据包内容的精细控制。

ETHERNET HEADER EXPRESSION

Ethernet header expressions(以太网头部表达式)用于引用或操作以太网帧的头部字段。这些表达式允许你根据数据包的源MAC地址(saddr)、目的MAC地址(daddr)或EtherType(类型)来过滤或修改数据包。

ether {daddr | saddr | type}
KeywordDescriptionType
daddr目标MAC地址ether_addr
saddr源MAC地址ether_addr
typeEtherTypeether_type

VLAN HEADER EXPRESSION

VLAN表达式用于匹配VLAN(虚拟局域网)头部字段。VLAN头部是附加在以太网帧上的一个额外层,用于在逻辑上分割网络,而不需要物理地重新配置网络。VLAN表达式包含几个关键字,每个关键字对应VLAN头部中的一个字段。

vlan表达式用于匹配vlan报头字段。这个表达式在ip、ip6和inet家族中不起作用,除非vlan接口配置了reorder_hdr off设置。默认值是reorder_hdr,它将自动从数据包中删除vlan标签。

vlan {id | dei | pcp | type}
KeywordDescriptionType
idVLAN 标识符(VID)integer (12 bit)
dei丢弃资格指示符integer (1 bit)
pcp优先级代码点integer (3 bit)
typeEtherTypeether_type

ARP HEADER EXPRESSION

对于ARP(地址解析协议)头部表达式,它用于匹配ARP数据包中的各个字段。ARP是一种用于将网络层地址(如IPv4地址)解析为链路层地址(如以太网MAC地址)的协议。

arp {htype | ptype | hlen | plen | operation | saddr { ip | ether } | daddr { ip | ether }
KeywordDescription Type
htypeARP 硬件类型integer (16 bit)
ptypeEtherType(协议类型)ether_type
hlen硬件地址长度integer (8 bit)
plen协议地址长度integer (8 bit)
operation操作码arp_op
saddr ether以太网发送方地址(Ethernet sender address)ether_addr
daddr ether以太网目标地址(Ethernet target address)ether_addr
saddr ipIPv4 发送方地址(IPv4 sender address)ipv4_addr
daddr ipIPv4 目标地址(IPv4 target address)ipv4_addr

IPV4 HEADER EXPRESSION

IPv4头部表达式,它用于匹配IPv4数据包中的各个字段

ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
KeywordDescriptionType
versionIP头部版本(4)integer (4 bit)
hdrlengthIP头部长度(包括选项)integer (4 bit)
dscp区分服务代码点(Differentiated Services Code Point)dscp
ecn显式拥塞通知(Explicit Congestion Notification)ecn
length总包长度integer (16 bit)
idIP标识符(ID)integer (16 bit)
frag-off分片偏移量(Fragment offset)integer (16 bit)
ttl生存时间(Time to live)integer (8 bit)
protocol上层协议(Upper layer protocol)inet_proto
checksumIP头部校验和(IP header checksum)integer (16 bit)
saddr源地址(Source address)ipv4_addr
daddr目的地址(Destination address)ipv4_addr

ICMP HEADER EXPRESSION

icmp {type | code | checksum | id | sequence | gateway | mtu}
KeywordDescription Notestype
typeICMP消息类型定义了ICMP消息的类型,如Echo请求(0)、Echo应答(0)、目标不可达(3)等。icmp_type
codeICMP代码(针对特定类型的进一步细分)对于某些ICMP消息类型,code字段提供了额外的信息。例如,在目标不可达消息中,code可以表示网络不可达、主机不可达等。integer (8 bit)
checksumICMP头部校验和用于验证ICMP头部在传输过程中是否未被更改。integer (16 bit)
id标识符(通常与Echo请求/应答相关)在ICMP Echo请求和应答消息中,id字段用于匹配请求和应答。integer (16 bit)
sequence序列号(通常与Echo请求/应答相关)在ICMP Echo请求和应答消息中,idsequence一起用于唯一标识每个请求和相应的应答。integer (16 bit)
gateway网关(已弃用或特定于某些实现)在某些旧的ICMP消息类型或特定实现中,gateway字段可能用于表示网关地址。然而,在现代ICMP实现中,这个字段通常不再使用。integer (16 bit)
mtu最大传输单元(MTU)(特定于“目的不可达”消息中的“需要分片但DF设置”代码)当ICMP消息表示“需要分片但DF(Don't Fragment)位已设置”的目标不可达时,mtu字段会包含导致问题的MTU值。integer (16 bit)

IGMP HEADER EXPRESSION

igmp {type | mrt | checksum | group}
KeywordDescriptionType
type表示IGMP(Internet Group Management Protocol,互联网组管理协议)消息的类型字段。这个字段用于区分不同类型的IGMP消息,如成员查询、成员报告等。igmp_type
mrt表示IGMP消息中的最大响应时间字段。这个字段指定了接收方应该在其响应中包括其组成员身份的最长时间。它是用来控制网络中的多播组成员关系报告速率的。integer (8 bit)
checksum表示IGMP消息的校验和字段。校验和用于验证IGMP消息在传输过程中是否未被篡改或损坏。它是一个基于消息内容的计算值,接收方会使用相同的算法重新计算并验证该值。integer (16 bit)
group表示多播组地址。在IGMP消息中,这个字段用于指定消息所关联的多播组地址。多播组地址允许网络中的设备向一组设备发送单个数据包,而不是分别向每个设备发送。integer (32 bit)

IPV6 HEADER EXPRESSION

ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}

 IPv6 数据包头部表达式允许您根据 IPv6 头部中的特定字段来匹配和处理数据包

KeywordDescriptionType
versionIP header version (6)integer (4 bit)
这个字段标识了IP头部的版本,对于IPv6来说,这个值总是6。它允许网络设备区分IPv4和IPv6数据包。
dscpDifferentiated Services Code Pointdscp
差分服务代码点(DSCP)是一个6位的字段,位于IPv6头部的流量类别字段中(该字段总共8位,但其中2位用于ECN)。DSCP用于标记数据包的优先级或服务质量(QoS)要求,以便网络中的设备可以据此进行特殊处理。
ecnExplicit Congestion Notificationecn
显式拥塞通知(ECN)是DSCP字段中的最后两位。它用于在网络发生拥塞时,由路由器向数据包的发送者提供拥塞指示,而不是直接丢弃数据包。这有助于更有效地管理网络拥塞,并减少数据包丢失。
flowlabelFlow labelinteger (20 bit)
流标签是一个20位的字段,用于标识属于同一流的数据包。它允许发送者和接收者将多个数据包视为一个逻辑流,并对其进行特殊处理,如流量控制、服务质量保证等。
lengthPayload lengthinteger (16 bit)
这个字段表示IPv6头部之后的数据(包括扩展头部和上层协议数据)的总长度(以字节为单位)。请注意,它不包括IPv6头部本身的长度,因为IPv6头部的长度是固定的(40字节,不包括任何扩展头部)。
nexthdrNexthdr protocolinet_proto
下一个头部(Next Header)字段指定了紧跟在IPv6头部之后的内容的类型。它可能是一个扩展头部、一个传输层头部(如TCP、UDP等),或者是一个表示没有更多头部的值(如59,表示没有进一步的头部,并且数据部分是原始数据)。inet_proto类型表明这是一个代表网络协议的标识符。
hoplimitHop limitinteger (8 bit)
跳数限制(Hop Limit)类似于IPv4中的TTL(生存时间)字段。它限制了数据包在到达目的地之前可以经过的最大路由器数量(即“跳数”)。每当数据包经过一个路由器时,这个值就会减1。当这个值减到0时,数据包就会被丢弃。
saddrSource addressipv6_addr
源地址(Source Address)字段包含了发送数据包的主机的IPv6地址。这个地址是全局唯一的,用于标识数据包的起源。
daddrDestination addressipv6_addr
目的地址(Destination Address)字段包含了数据包被发送到的目标主机的IPv6地址。这个地址也是全局唯一的,用于指示数据包应该被发送到哪个位置。

ICMPV6 HEADER EXPRESSION

ICMPv6是IPv6网络中的控制消息协议,用于报告错误、传递控制信息等。当你在网络监控、数据包过滤或路由策略中使用这个表达式时,它允许你根据ICMPv6消息的具体字段来匹配和过滤数据包。

icmpv6 {type | code | checksum | parameter-problem | packet-too-big | id | sequence | max-delay | taddr | daddr}
KeywordDescriptionType
typeICMPv6 type fieldicmpv6_type
这个字段表示ICMPv6消息的类型。ICMPv6定义了多种类型的消息,每种类型都对应着不同的功能或错误报告。例如,类型128是回显请求(Echo Request),类型129是回显应答(Echo Reply),类型1(尽管在ICMPv6中不常见,但在某些情况下可能使用)是目的地不可达(Destination Unreachable)等。icmpv6_type类型通常是一个枚举或特殊的标识符,用于在编程或配置中引用这些类型。
codeICMPv6 code fieldinteger (8 bit)
这个字段在某些ICMPv6消息类型中提供关于消息类型的进一步细分或具体错误代码。例如,在目的地不可达消息中,code字段可以指示不可达的具体原因(如网络不可达、主机不可达、协议不可达等)。它是一个8位的整数,允许最多256种不同的代码。
checksumICMPv6 checksum fieldinteger (16 bit)
这个字段是ICMPv6消息(包括头部和数据)的校验和,用于检测数据在传输过程中是否发生了错误。它是一个16位的整数,通过特定的算法计算得出,并在接收端进行验证。
parameter-problempointer to probleminteger (32 bit)
当ICMPv6消息类型为“参数问题”(通常是类型0,但code字段会进一步细分)时,这个字段包含一个指向有问题的参数(如头部中的某个字段)的指针(实际上是偏移量)。它是一个32位的整数,但由于IPv6头部和ICMPv6消息结构的限制,实际使用的偏移量通常不会超过16位或24位的范围。然而,为了与IPv4中的类似字段保持一致或预留未来扩展的可能性,这里将其定义为32位。
packet-too-bigoversized MTUinteger (32 bit)
当ICMPv6消息类型为“数据包太大”(类型2)时,这个字段指示了导致该消息发送的数据链路层可以支持的最大传输单元(MTU)大小。它是一个32位的整数,但实际上,由于MTU值通常远小于32位整数的范围,因此这个字段的很大一部分位是未使用的。然而,将其定义为32位可以确保与IPv4中的类似字段保持一致,并预留未来扩展的可能性。
idID of echo request/responseinteger (16 bit)
这个字段在ICMPv6的回显请求(Echo Request)和回显应答(Echo Reply)消息中使用,用于唯一标识请求和响应之间的对应关系。它是一个16位的整数,由发送者选择,并在相应的应答中返回。
sequencesequence number of echo request/responseinteger (16 bit)
这个字段是在ICMPv6的回显请求和回显应答消息中使用的,它提供了请求和响应之间的序列号。它是一个16位的整数,允许发送者发送多个请求并区分它们的应答。
max-delaymaximum response delay of MLD queriesinteger (16 bit)
这个字段在ICMPv6的多播监听器发现(Multicast Listener Discovery, MLD)消息中使用,它指定了MLD查询消息的最大响应延迟。MLD是IPv6中用于多播地址管理的协议。这个字段是一个16位的整数,表示在发送MLD查询后,接收者应该等待多长时间以收集响应。
taddrtarget address neighbor solicit/advert, redirect or MLDipv6_addr
这个字段在多种ICMPv6消息类型中使用,包括邻居请求(Neighbor Solicitation)、邻居通告(Neighbor Advertisement)、重定向(Redirect)以及某些MLD消息。它表示消息的目标地址,即邻居请求或通告中请求或通告的IPv6地址,或重定向消息中原始数据包的目标地址。
daddrdestination address of redirectipv6_addr
这个字段仅在ICMPv6的重定向消息中使用。它表示重定向消息的目标地址,即原始数据包应该被发送到的IPv6地址。这个地址通常是比原始

TCP HEADER EXPRESSION

tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
KeywordDescriptionType
sport源端口,标识发送应用程序的端口号inet_service
dport目标端口,标识接收应用程序的端口号inet_service
sequence序列号,用于按顺序交付和流控制integer (32 bit)
ackseq确认号,指示发送确认的端点期望接收的下一个序列号integer (32 bit)
doff数据偏移量,以32位字为单位指定TCP头部的长度,也称为头部长度integer (4 bit)
reserved保留区域,当前未使用,并设置为0integer (4 bit)
flagsTCP标志,用于控制TCP处理,如URG(紧急指针)、ACK(确认)、PSH(推送)、RST(重置)、SYN(同步序列号)、FIN(发送方没有更多数据)tcp_flag
window窗口大小,指示接收方愿意接收而无需发送确认的字节数integer (16 bit)
checksum校验和,用于检测TCP头部和数据中的错误integer (16 bit)
urgptr紧急指针,如果设置了URG标志,则此字段指示数据段中紧急数据的第一个字节的偏移量integer (16 bit)

UDP HEADER EXPRESSION

udp {sport | dport | length | checksum}
KeywordDescriptionType
sport源端口,标识发送数据包的源应用程序的端口号inet_service
dport目标端口,标识接收数据包的目标应用程序的端口号inet_service
length总包长度,表示整个数据包的长度(包括头部和数据部分)integer (16 bit)
checksum校验和,用于检测数据包在传输过程中是否发生错误integer (16 bit)

SCTP HEADER EXPRESSION

SCTP(Stream Control Transmission Protocol,流控制传输协议)是一种面向连接的、可靠的、基于消息的传输层协议,由IETF在RFC 4960中定义。SCTP头部(Header)是SCTP报文(Packet)的起始部分,它包含了用于标识和控制整个报文的重要信息。

sctp {sport | dport | vtag | checksum}
sctp chunk CHUNK [ FIELD ]
CHUNK := data | init | init-ack | sack | heartbeat |heartbeat-ack | abort | shutdown | shutdown-ack | error |cookie-echo | cookie-ack | ecne | cwr | shutdown-complete| asconf-ack | forward-tsn | asconf
FIELD := COMMON_FIELD | DATA_FIELD | INIT_FIELD | INIT_ACK_FIELD |SACK_FIELD | SHUTDOWN_FIELD | ECNE_FIELD | CWR_FIELD |ASCONF_ACK_FIELD | FORWARD_TSN_FIELD | ASCONF_FIELD
COMMON_FIELD := type | flags | length
DATA_FIELD := tsn | stream | ssn | ppid
INIT_FIELD := init-tag | a-rwnd | num-outbound-streams |num-inbound-streams | initial-tsn
INIT_ACK_FIELD := INIT_FIELD
SACK_FIELD := cum-tsn-ack | a-rwnd | num-gap-ack-blocks |num-dup-tsns
SHUTDOWN_FIELD := cum-tsn-ack
ECNE_FIELD := lowest-tsn
CWR_FIELD := lowest-tsn
ASCONF_ACK_FIELD := seqno
FORWARD_TSN_FIELD := new-cum-tsn
ASCONF_FIELD := seqno
KeywordDescriptionType
sport源端口,标识发送数据包的源应用程序的端口号inet_service
dport目标端口,标识接收数据包的目标应用程序的端口号inet_service
vtag验证标签,用于唯一标识一个SCTP关联(Association)的随机标识符integer (32 bit)
checksum校验和,用于检测SCTP头部和用户数据的完整性integer (32 bit)
chunk搜索块,表示数据包中是否存在某个特定类型的块without FIELD, boolean indicating existence

SCTP chunk 字段

NameWidth in bitsChunkNotes
type8all不直接有用,由块类型定义
flags8all语义根据每个块的具体类型定义
length16all此块(不包括填充)的长度(以字节为单位)
tsn32data传输序列号,用于标识数据包中的数据传输顺序
stream16data流标识符,用于标识属于哪个流的数据
ssn16data流序列号,用于标识流内数据的顺序
ppid32data负载协议标识符,标识数据的上层协议类型
init-tag32init, init-ack初始化标签,用于在关联建立过程中唯一标识
a-rwnd32init, init-ack, sack公告的接收窗口信用,指示接收方愿意接收的数据量
num-outbound-streams16init, init-ack出站流的数量,由发送方指定
num-inbound-streams16init, init-ack入站流的数量,由接收方指定
initial-tsn32init, init-ack初始传输序列号,用于关联建立时的同步
cum-tsn-ack32sack, shutdown确认的累积传输序列号,表示已成功接收的数据包
num-gap-ack-blocks16sack包含的Gap Ack块的数量,用于指示数据包的缺失范围
num-dup-tsns16sack接收到的重复传输序列号的数量
lowest-tsn32ecne, cwr最低的传输序列号,与ECN或CWR控制消息相关
seqno32asconf-ack, asconf序列号,用于ASCONF和ASCONF-ACK块的控制消息同步
new-cum-tsn32forward-tsn新的累积传输序列号,用于FORWARD TSN块以指示接收方已接收到的数据

DCCP HEADER EXPRESSION

DCCP(Datagram Congestion Control Protocol,数据报拥塞控制协议)是一种传输层协议,用于解决多种拥塞问题,特别适用于那些不需要TCP的数据可靠性和重传功能,但希望进行会话并需要拥塞控制的应用程序。

dccp {sport | dport | type}
KeywordDescriptionType
sportSource portinet_service
dportDestination portinet_service
typePacket typedccp_pktty

AUTHENTICATION HEADER EXPRESSION

AUTHENTICATION HEADER (AH) 是IPSec协议套件中的一个组件,用于为IP数据包提供数据源的身份验证和数据完整性保护。AH协议通过在IP数据包中添加一个认证头部来实现这些功能,但不提供加密服务。

ah {nexthdr | hdrlength | reserved | spi | sequence}
KeywordDescriptionType
nexthdrNext header protocol指示AH头部之后的数据类型inet_proto
hdrlengthAH Header lengthAH头部的长度(以32位字为单位,不包括这个字段本身),但通常AH头部的长度是固定的integer (8 bit)
reservedReserved areainteger (16 bit)
spiSecurity Parameter Index一个唯一的标识符,用于区分同一目的地IP地址的不同安全关联(SA)integer (32 bit)
sequenceSequence number一个唯一的标识符,用于区分同一目的地IP地址的不同安全关联(SA)integer (32 bit)

ENCRYPTED SECURITY PAYLOAD HEADER EXPRESSION

ENCRYPTED SECURITY PAYLOAD(ESP)是IPSec(Internet Protocol Security)协议套件中的一个重要组成部分,它用于为IP数据包提供加密、数据完整性和可选的身份验证服务。

esp {spi | sequence}
Security Parameters Index (SPI)
描述:一个用于唯一标识安全关联(SA)的伪随机值。SPI与目的IP地址、安全协议(ESP)和IPSec协议类型(如IPv4或IPv6)一起,用于唯一确定一个安全关联。
作用:在接收端,SPI用于查找与接收到的ESP数据包相关联的安全关联,以便进行后续的解密和验证操作。
Sequence Number
描述:一个单调递增的序列号,用于防止重放攻击。
作用:接收端会检查序列号的顺序,以确保接收到的数据包是按顺序发送的,而不是被重放的旧数据包。

IPCOMP HEADER EXPRESSION

IPCOMP HEADER(IP有效载荷压缩协议头部)是IPComp(IP Payload Compression Protocol)协议中的一个重要组成部分,它用于标识IP数据报中的压缩有效载荷,并包含了解压缩所需的一些关键信息。

comp {nexthdr | flags | cpi}
Next Header字段(或称为Protocol字段,在IPv4中):这是一个8位的字段,用于存储原始IP头中的协议字段(IPv4)或Next Header字段(IPv6)的值。在解压缩后,这个值将被恢复到IP头中,以指示原始的上层协议类型。
Flags字段:这是一个8位的保留字段,当前必须设置为0,接收节点必须忽略它。这个字段为将来可能的扩展保留。
Compression Parameter Index(CPI)字段:这是一个16位的字段,用于标识用于压缩该IP数据报的压缩算法。CPI的值可以是预定义的(0-63),也可以是节点之间协商的(61440-65535)。当使用预定义的CPI值时,不需要额外的信息来指定压缩算法。

GRE HEADER EXPRESSION

GRE HEADER(GRE头部)是Generic Routing Encapsulation(通用路由封装)协议中的一个关键组成部分,它定义了如何在一种网络协议的数据报文中封装另一种网络协议的数据报文。GRE头部在GRE隧道技术中扮演着重要角色,它包含了处理封装和解封装过程所需的一些重要信息。

gre {flags | version | protocol}
gre ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
gre ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}

使用举例

netdev filter ingress gre ip daddr 100.1.1.1 counter
#netdev filter ingress gre:指定了网络设备过滤器规则应用于入口流量的GRE封装。
#ip daddr 100.1.1.1:表示匹配IPv4目标地址为100.1.1.1的数据包。在这种情况下,规则将捕获具有该目标地址的数据包。
counter:启用了计数器功能,用于跟踪匹配到的数据包数量。

GENEVE HEADER EXPRESSION

GENEVE HEADER(Geneve头部)是Generic Network Virtualization Encapsulation(通用网络虚拟化封装)协议中的一个关键组成部分,它定义了如何在网络数据包中封装和传输虚拟化网络流量。Geneve协议定义于RFC 8926,是一种虚拟化隧道通信技术,其头部设计提供了高度的灵活性和可扩展性。

geneve {vni | flags}
geneve ether {daddr | saddr | type}
geneve vlan {id | dei | pcp | type}
geneve ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
geneve ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
geneve tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
geneve udp {sport | dport | length | checksum}

使用举例

#捕获内部使用 Geneve 封装的 UDP 数据包,然后在解开 Geneve 封装后,进一步匹配 UDP 目标端口为 80 的数据包,并对其进行计数。
netdev filter ingress udp dport 6081 geneve tcp dport 80 counter

GRETAP HEADER EXPRESSION

GRETAP(Generic Routing Encapsulation over Tunnelling Layer 2)是一种协议,,用于在 Layer 2 级别进行隧道封装。

gretap {vni | flags}
gretap ether {daddr | saddr | type}
gretap vlan {id | dei | pcp | type}
gretap ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
gretap ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
gretap tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
gretap udp {sport | dport | length | checksum}

使用举例

netdev filter ingress gretap tcp dport 80 counter
#用于匹配内部封装在 GRE(Generic Routing Encapsulation)over TAP(Tunneling Layer 2 Packet)协议中的 TCP 目标端口为 80 的数据包,并对其进行计数。
#netdev filter ingress gretap:规定了该过滤器规则应用于入口流量的 GRE over TAP 封装。
#tcp dport 80:表示匹配 TCP 目标端口为 80 的数据包。此规则将捕获目标端口为 80 的 TCP 数据包。
#counter:启用了计数器功能,用于跟踪匹配到的数据包数量。

VXLAN HEADER EXPRESSION

VXLAN(Virtual Extensible LAN,虚拟可扩展局域网)头部是VXLAN封装过程中的关键部分,它定义了如何在网络数据包中封装和传输虚拟化网络流量。VXLAN头部通过一系列字段来标示和处理数据包,以确保数据在跨物理网络的虚拟网络间正确传输。

vxlan {vni | flags}
vxlan ether {daddr | saddr | type}
vxlan vlan {id | dei | pcp | type}
vxlan ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
vxlan ip6 {version | dscp | ecn | flowlabel | length | nexthdr | hoplimit | saddr | daddr}
vxlan tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
vxlan udp {sport | dport | length | checksum}

使用举例

netdev filter ingress udp dport 4789 vxlan udp dport 80 counter
#捕获封装在 VXLAN 中,并且目的端口为 TCP 端口 80 的数据包,并对其进行计数

EXTENSION HEADER EXPRESSIONS

扩展头部表达式(Extension Header Expressions)是一种强大的特性,它允许你根据数据包中特定协议的扩展头部或选项来进行匹配和过滤。

hbh {nexthdr | hdrlength}
frag {nexthdr | frag-off | more-fragments | id}
rt {nexthdr | hdrlength | type | seg-left}
dst {nexthdr | hdrlength}
mh {nexthdr | hdrlength | checksum | type}
srh {flags | tag | sid | seg-left}
tcp option {eol | nop | maxseg | window | sack-perm | sack | sack0 | sack1 | sack2 | sack3 | timestamp} tcp_option_field
ip option { lsrr | ra | rr | ssrr } ip_option_fieldexthdr {hbh | frag | rt | dst | mh}
tcp option {eol | nop | maxseg | window | sack-perm | sack | sack0 | sack1 | sack2 | sack3 | timestamp}
ip option { lsrr | ra | rr | ssrr }
dccp option dccp_option_type
Table 60. IPv6 extension headers

IPv6 extension headers

KeywordDescription
hbhHop by Hop Option Header - 逐跳选项头部。这个头部允许中间路由器查看和处理包含在其中的选项。它通常用于需要所有经过的路由器都了解和处理的信息,比如一些安全或路由相关的选项。逐跳选项头部是IPv6中第一个可选的扩展头部,如果有多个扩展头部,它必须紧跟在IPv6基本头部之后。
rtRouting Header - 路由头部。这个头部用于源路由选择,指定了数据包应该经过的中间节点(路由器或主机)的顺序。它允许发送方控制数据包在网络中的路径。路由头部可以是严格源路由(要求数据包严格按照指定的路径传输)或松散源路由(数据包必须访问指定的节点,但可以在这些节点之间选择任何路径)。
fragFragmentation Header - 分片头部。当IPv6数据包的大小超过路径上的某个链路的MTU(最大传输单元)时,它会被分片。分片头部包含了关于分片的信息,比如这是原始数据包的哪个分片、分片的偏移量以及是否还有更多的分片。注意,IPv6中通常只在源节点进行分片,而IPv4允许在路径上的任何节点进行分片。
dstDestination Options Header - 目的地选项头部。这个头部用于向目的节点或中间节点提供关于数据包处理的额外信息。与逐跳选项头部不同,目的地选项头部只被目的节点和那些被明确指定要处理这些选项的中间节点查看。这可以用于实现如流控制、认证、加密等高级功能。
mhMobility Header - 移动性头部。这个头部用于支持IPv6中的移动性管理,它允许移动节点(MN)在改变其网络接入点时保持其IPv6地址不变。移动性头部包含了关于移动节点的位置信息,使得数据包能够被正确地路由到移动节点当前的位置。
srhSegment Routing Header - 段路由头部。这个头部是IPv6扩展头部的一个较新的成员,用于实现段路由(Segment Routing)功能。段路由是一种网络架构,它允许数据包按照一系列预定义的段(或路径段)进行转发,而不需要传统的IP路由查找。这可以简化网络操作并提高转发的效率。段路由头部包含了关于这些段的信息,使得数据包能够按照预定的路径进行转发。

TCP Options

KeywordDescription (详细解释)TCP Option Fields
eolEnd of Option List:此选项表示TCP选项列表的结束。它不包含任何额外的数据字段,仅用于标记选项列表的终止。-
nopNo-Operation (TCP Nop padding option):此选项是一个填充选项,用于对齐后续选项的起始位置或确保TCP头部的大小是整数倍。它不执行任何操作,仅包含选项类型字段(通常为1)。- (仅包含1字节的NOP选项代码)
maxsegTCP Maximum Segment Size (MSS):此选项用于通知对方TCP端点,本端点能够接收的最大TCP段(segment)中的数据长度(以字节为单位)。它是TCP流量控制的一部分。length (选项总长度), size (MSS值)
windowTCP Window Scaling:此选项用于增加TCP窗口大小的表示范围。它通过一个左移因子来扩展默认的窗口大小字段,允许更大的窗口值,从而提高网络吞吐量。length (选项总长度), count 
sack-permTCP SACK Permitted:此选项用于通知对方TCP端点,本端点支持选择性确认(SACK)。SACK是一种TCP扩展,允许接收方通知发送方哪些数据块已经成功接收,从而允许发送方更有效地重发丢失的数据块。length (通常为2,因为此选项不包含额外的数据字段)
sack/sackNTCP Selective Acknowledgement:这些选项(sack通常作为sack0的别名)用于发送方确认接收方已经成功接收了哪些数据块。每个SACK块都包含了一个序列号范围,表示接收方已经成功接收的数据。N表示块编号(如果有多个SACK块)。length (选项总长度), left (序列号范围的左边界), right (序列号范围的右边界)
timestampTCP Timestamps:此选项用于在TCP连接中交换时间戳信息。时间戳可以用于计算往返时间(RTT),从而帮助TCP实现更精确的流量控制和拥塞控制。此外,它还可以用于保护TCP连接免受某些类型的攻击。length (选项总长度), tsval (发送方的时间戳), tsecr (最近接收到的对端时间戳的回声)

IP Options

KeywordDescriptionIP Option Fields
lsrrLoose Source Route:此选项允许发送方指定一系列IP地址,作为数据包应该经过的“松散”源路由。这里的“松散”意味着数据包不需要严格按照指定的顺序经过这些地址,但必须经过它们。type (选项类型), length (选项总长度), ptr (指针,指向当前正在处理的地址的偏移量), addr (一个或多个IP地址,表示源路由中的下一跳)
raRouter Alert:此选项用于通知沿途的路由器,数据包需要特别的处理。例如,它可能指示路由器检查数据包的有效载荷中是否有需要由上层协议(如RSVP)处理的特定信息。type (选项类型), length (通常为4,因为此选项通常只包含一个字节的value字段), value (路由器应该检查的值或代码,具体含义取决于value的值)
rrRecord Route:此选项用于记录数据包经过的每一个路由器的IP地址。它允许发送方了解数据包在到达目的地之前经过了哪些路由。type (选项类型), length (选项总长度,包括所有记录的地址), ptr (指针,指向下一个要记录的地址的位置), addr (一个或多个IP地址,记录数据包经过的路由器的IP)
ssrrStrict Source Route:与lsrr类似,但此选项要求数据包必须严格按照指定的顺序经过这些地址。如果某个地址无法到达,数据包将被丢弃。type (选项类型), length (选项总长度), ptr (指针,指向当前正在处理的地址的偏移量), addr (一个或多个IP地址,表示源路由中的下一跳,必须严格遵循)

使用举例

# 查找 TCP 选项
filter input tcp option sack-perm exists counter# 匹配 TCP 选项
matching TCP options.# 匹配 TCP 最大段大小小于 536
filter input tcp option maxseg size lt 536# 匹配 IPv6 扩展头
matching IPv6 exthdr.# 查找 IP 选项
ip filter input frag more-fragments 1 counter# 查找 IP 选项 LSRR 是否存在
filter input ip option lsrr exists counter# 查找 DCCP 选项
filter input dccp option 40 exists counter

CONNTRACK EXPRESSIONS

CONNTRACK EXPRESSIONS通常用于定义和匹配网络数据包与conntrack系统跟踪的连接之间的关系。这些表达式允许防火墙规则根据数据包是否属于已建立的连接、相关的连接或其他conntrack状态来做出决策。

用途

  1. 状态匹配
    • 使用conntrack表达式,可以匹配数据包是否属于某个特定的连接状态,如ESTABLISHED(已建立)、RELATED(相关)、NEW(新连接)等。
    • 例如,iptables规则可以使用-m conntrack --ctstate ESTABLISHED,RELATED来匹配所有已建立或相关的连接的数据包。
  2. 连接跟踪
    • conntrack系统维护了一个所有被跟踪连接的列表,每个连接都由一个struct nf_conn实例表示。
    • 当数据包通过Netfilter钩子函数时,conntrack系统会分析该数据包,确定它属于哪个连接,并初始化数据包结构中的指针以指向相应的struct nf_conn实例。
  3. 状态分析
    • conntrack系统通过分析数据包的OSI模型第3层和第4层(有时也包括更高层)来确定连接的状态。
    • 这种状态分析为防火墙规则提供了基础,使得它们能够基于连接的状态来做出有意义的决策。
ct {state | direction | status | mark | expiration | helper | label | count | id}
ct [original | reply] {l3proto | protocol | bytes | packets | avgpkt | zone}
ct {original | reply} {proto-src | proto-dst}
ct {original | reply} {ip | ip6} {saddr | daddr}

 Conntrack expressions

KeywordDescriptionType
state连接的当前状态,如NEWESTABLISHEDRELATED等。ct_state
direction数据包相对于连接的方向,如原始(Original)或回复(Reply)。ct_dir
status连接的额外状态信息,如是否已过期、是否被忽略等。ct_status
mark分配给连接的标记(Mark),可用于自定义过滤规则。mark
expiration连接的过期时间。time
helper与连接关联的协议助手(Helper)的名称。string
label分配给连接的标签,用于基于标签的过滤。这通常在nftablesconnlabel.conf中定义。ct_label
l3proto连接使用的第三层(网络层)协议,如IPv4或IPv6。nf_proto
saddr对于给定方向,连接的源地址。ipv4_addr/ipv6_addr
daddr对于给定方向,连接的目的地址。ipv4_addr/ipv6_addr
protocol连接使用的第四层(传输层)协议,如TCP、UDP等。inet_proto
proto-src对于给定方向,连接使用的源端口号(以整数形式表示)。integer (16 bit)
proto-dst对于给定方向,连接使用的目的端口号(以整数形式表示)。integer (16 bit)
packets在给定方向上看到的数据包数量,或者原始和回复数据包的总和。integer (64 bit)
bytes在给定方向上看到的数据字节总数,与packets关键字类似。integer (64 bit)
avgpkt平均每个数据包的字节数,基于packetsbytes计算得出。integer (64 bit)
zone连接跟踪区域(Zone),用于区分不同的命名空间或网络区域。integer (16 bit)
count当前符合条件的连接数量(注意:这个字段在常规的Conntrack表达式中可能不直接作为过滤条件,而是用于统计或报告)。integer (32 bit)
id连接的唯一标识符(ID)。ct_id

使用举例

# 创建一个名为 ssh_flood 的动态 IPv4 地址集
nft add set filter ssh_flood '{ type ipv4_addr; flags dynamic; }'# 添加规则:限制并行连接数,超过 2 个连接的源 IP 地址将被添加到 ssh_flood 地址集,并拒绝进一步连接
nft add rule filter input tcp dport 22 add @ssh_flood '{ ip saddr ct count over 2 }' reject

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/43583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验1 —— 安全策略的练习

实验拓扑图 实验要求 1.DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问; 2.生产区不允许访问互联网,办公区和游客区允许访问互联网 3.办公区…

RabbitMQ保证消息被成功发送和消费

一 : 在使用 RabbitMQ 作为消息队列时,保证消息被成功发送和消费是一个非常重要的问题。以下是一些关键点和最佳实践,以确保消息的可靠传输和处理。* 配置方式: 保证消息被成功发送 确认模式(Confirm Mode):生产者可以…

在SpringBoot使用AOP防止接口重复提交

前言 防止接口重复提交有跟多种方法,可以在前端做处理。同样在后端也能处理,而且后端的处理也有很多中方法。最先能想到的就是加锁,也可以直接在该接口的实现过程中进行处理(可以参考防止数据重复提交的6种方法(超简单)&#xff…

动手学Avalonia:基于硅基流动构建一个文生图应用(一)

文生图 文生图,全称“文字生成图像”(Text-to-Image),是一种AI技术,能够根据给定的文本描述生成相应的图像。这种技术利用深度学习模型,如生成对抗网络(GANs)或变换器(T…

【Mac】Charles for Mac(HTTP协议抓包工具)及同类型软件介绍

软件介绍 Charles for Mac 是一款功能强大的网络调试工具,主要用于HTTP代理/HTTP监视器。以下是它的一些主要特点和功能: 1.HTTP代理:Charles 可以作为HTTP代理服务器,允许你查看客户端和服务器之间的所有HTTP和SSL/TLS通信。 …

金航标kinghelm宋仕强在介绍自己公司时说

金航标kinghelm宋仕强在介绍自己公司时说,金航标成立于2007年,成立地点在华强北雷圳大厦803室,后搬到华强北广业大厦24楼CD室,后搬迁到龙华展滔科技大厦C座C809和C817室,现在的办公地址为龙岗区坂田街道百瑞达大厦&…

WSL安装USB驱动

wsl用不了USB盘,需要安装驱动 1、安装windows驱动 https://github.com/dorssel/usbipd-win/releases 下载msi,并且安装 2、linux里面安装 sudo apt install linux-tools-5.4.0-77-generic hwdata sudo update-alternatives --install /usr/local/bin/usb…

PageDTO<T>,PageQuery,BeanUtils,CollUtils的封装

一、PageDTO<T> import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.annotation.JsonIgnore; import com.tianji.common.utils.BeanUtils; import com.tianji.common.utils.CollUtils; import com.tianji.common.utils.…

C#中的MD5摘要算法与哈希算法

文章目录 一、哈希算法基础二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#实现示例MD5算法示例哈希算法示例字符串MD5值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制&#xff0c;它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的&#xff0…

IDEA中配置代理,解决Codearts Snap登陆不了的问题

问题描述&#xff1a;在mac电脑中的idea中安装了华为的codearts snap插件&#xff0c;一直登录不了&#xff0c;账号是没问题的&#xff0c;后来我怀疑是我的代理有问题&#xff0c;找到IDEA中的代理设置先是有这个问题“You have JVM property "https.proxyHost" se…

千呼新零售2.0分销商城视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

C语言 将两个字符串连接起来,不用strcat函数

编一个程序,将两个字符串连接起来,不要用strcat函数。 #include <stdio.h>void my_strcat(char *s1, const char *s2) {while (*s1) {s1;}while (*s2) {*s1 *s2;s1;s2;}*s1 \0; }int main() {char s1[100] "Hello, ";char s2[] "World!";my_str…

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…

uniapp 打包成安卓APP预览base64pdf实现方法

下载PDF.js 问题描述 在uniapp中预览base64的PDF&#xff0c;可以使用web-view组件嵌入一个PDF.js的实例。以下是一个简单的示例&#xff1a; 解决方案&#xff1a; 1.在页面的.vue文件中添加web-view组件&#xff1a; <template><view style"width: 50%;&qu…

【机器学习】支持向量机与主成分分析在机器学习中的应用

文章目录 一、支持向量机概述什么是支持向量机&#xff1f;超平面和支持向量大边距直觉 二、数据预处理与可视化数据集的基本信息导入必要的库加载数据集数据概况数据可视化特征对的散点图矩阵类别分布条形图平均面积与平均光滑度的散点图变量之间的相关性热图 三、模型训练&am…

JS【详解】类 class ( ES6 新增语法 )

本质上&#xff0c;类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…

podman 替代 docker ? centos Stream 10 已经弃用docker,开始用podman了!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

浅谈React

forwardRef和useImperativeHandle的联动使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

Java中锁的分类、原理、使用场景、注意事项、优缺点等详解

Java开发中&#xff0c;锁是保证多线程安全的重要手段。Java提供了多种类型的锁来满足不同的同步需求。在这篇文章中&#xff0c;我将为您介绍以下几种常见的锁类型&#xff1a; 偏向锁/轻量级锁/重量级锁 偏向锁&#xff1a;当一个线程获取一个对象的锁时&#xff0c;如果发现…