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.pswp.cn/web/43583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43583.shtml
英文地址,請注明出處:http://en.pswp.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;如果發現…