PAYLOAD EXPRESSIONS
Payload expressions在nftables中扮演著重要的角色,因為它們允許用戶定義復雜的規則,這些規則可以基于數據包的內容(即有效載荷)來過濾、修改或允許數據包通過。這些表達式可以執行諸如數據拷貝、比較、位操作等多種操作,以實現對數據包內容的精細控制。
ETHERNET HEADER EXPRESSION
Ethernet header expressions(以太網頭部表達式)用于引用或操作以太網幀的頭部字段。這些表達式允許你根據數據包的源MAC地址(saddr)、目的MAC地址(daddr)或EtherType(類型)來過濾或修改數據包。
ether {daddr | saddr | type}
Keyword | Description | Type |
---|---|---|
daddr | 目標MAC地址 | ether_addr |
saddr | 源MAC地址 | ether_addr |
type | EtherType | ether_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}
Keyword | Description | Type |
---|---|---|
id | VLAN 標識符(VID) | integer (12 bit) |
dei | 丟棄資格指示符 | integer (1 bit) |
pcp | 優先級代碼點 | integer (3 bit) |
type | EtherType | ether_type |
ARP HEADER EXPRESSION
對于ARP(地址解析協議)頭部表達式,它用于匹配ARP數據包中的各個字段。ARP是一種用于將網絡層地址(如IPv4地址)解析為鏈路層地址(如以太網MAC地址)的協議。
arp {htype | ptype | hlen | plen | operation | saddr { ip | ether } | daddr { ip | ether }
Keyword | Description? | Type |
---|---|---|
htype | ARP 硬件類型 | integer (16 bit) |
ptype | EtherType(協議類型) | 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 ip | IPv4 發送方地址(IPv4 sender address) | ipv4_addr |
daddr ip | IPv4 目標地址(IPv4 target address) | ipv4_addr |
IPV4 HEADER EXPRESSION
IPv4頭部表達式,它用于匹配IPv4數據包中的各個字段
ip {version | hdrlength | dscp | ecn | length | id | frag-off | ttl | protocol | checksum | saddr | daddr }
Keyword | Description | Type |
---|---|---|
version | IP頭部版本(4) | integer (4 bit) |
hdrlength | IP頭部長度(包括選項) | integer (4 bit) |
dscp | 區分服務代碼點(Differentiated Services Code Point) | dscp |
ecn | 顯式擁塞通知(Explicit Congestion Notification) | ecn |
length | 總包長度 | integer (16 bit) |
id | IP標識符(ID) | integer (16 bit) |
frag-off | 分片偏移量(Fragment offset) | integer (16 bit) |
ttl | 生存時間(Time to live) | integer (8 bit) |
protocol | 上層協議(Upper layer protocol) | inet_proto |
checksum | IP頭部校驗和(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}
Keyword | Description? | Notes | type |
---|---|---|---|
type | ICMP消息類型 | 定義了ICMP消息的類型,如Echo請求(0)、Echo應答(0)、目標不可達(3)等。 | icmp_type |
code | ICMP代碼(針對特定類型的進一步細分) | 對于某些ICMP消息類型,code 字段提供了額外的信息。例如,在目標不可達消息中,code 可以表示網絡不可達、主機不可達等。 | integer (8 bit) |
checksum | ICMP頭部校驗和 | 用于驗證ICMP頭部在傳輸過程中是否未被更改。 | integer (16 bit) |
id | 標識符(通常與Echo請求/應答相關) | 在ICMP Echo請求和應答消息中,id 字段用于匹配請求和應答。 | integer (16 bit) |
sequence | 序列號(通常與Echo請求/應答相關) | 在ICMP Echo請求和應答消息中,id 和sequence 一起用于唯一標識每個請求和相應的應答。 | 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}
Keyword | Description | Type |
---|---|---|
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 頭部中的特定字段來匹配和處理數據包
Keyword | Description | Type |
---|---|---|
version | IP header version (6) | integer (4 bit) |
這個字段標識了IP頭部的版本,對于IPv6來說,這個值總是6。它允許網絡設備區分IPv4和IPv6數據包。 | ||
dscp | Differentiated Services Code Point | dscp |
差分服務代碼點(DSCP)是一個6位的字段,位于IPv6頭部的流量類別字段中(該字段總共8位,但其中2位用于ECN)。DSCP用于標記數據包的優先級或服務質量(QoS)要求,以便網絡中的設備可以據此進行特殊處理。 | ||
ecn | Explicit Congestion Notification | ecn |
顯式擁塞通知(ECN)是DSCP字段中的最后兩位。它用于在網絡發生擁塞時,由路由器向數據包的發送者提供擁塞指示,而不是直接丟棄數據包。這有助于更有效地管理網絡擁塞,并減少數據包丟失。 | ||
flowlabel | Flow label | integer (20 bit) |
流標簽是一個20位的字段,用于標識屬于同一流的數據包。它允許發送者和接收者將多個數據包視為一個邏輯流,并對其進行特殊處理,如流量控制、服務質量保證等。 | ||
length | Payload length | integer (16 bit) |
這個字段表示IPv6頭部之后的數據(包括擴展頭部和上層協議數據)的總長度(以字節為單位)。請注意,它不包括IPv6頭部本身的長度,因為IPv6頭部的長度是固定的(40字節,不包括任何擴展頭部)。 | ||
nexthdr | Nexthdr protocol | inet_proto |
下一個頭部(Next Header)字段指定了緊跟在IPv6頭部之后的內容的類型。它可能是一個擴展頭部、一個傳輸層頭部(如TCP、UDP等),或者是一個表示沒有更多頭部的值(如59,表示沒有進一步的頭部,并且數據部分是原始數據)。inet_proto 類型表明這是一個代表網絡協議的標識符。 | ||
hoplimit | Hop limit | integer (8 bit) |
跳數限制(Hop Limit)類似于IPv4中的TTL(生存時間)字段。它限制了數據包在到達目的地之前可以經過的最大路由器數量(即“跳數”)。每當數據包經過一個路由器時,這個值就會減1。當這個值減到0時,數據包就會被丟棄。 | ||
saddr | Source address | ipv6_addr |
源地址(Source Address)字段包含了發送數據包的主機的IPv6地址。這個地址是全局唯一的,用于標識數據包的起源。 | ||
daddr | Destination address | ipv6_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}
Keyword | Description | Type |
---|---|---|
type | ICMPv6 type field | icmpv6_type |
這個字段表示ICMPv6消息的類型。ICMPv6定義了多種類型的消息,每種類型都對應著不同的功能或錯誤報告。例如,類型128是回顯請求(Echo Request),類型129是回顯應答(Echo Reply),類型1(盡管在ICMPv6中不常見,但在某些情況下可能使用)是目的地不可達(Destination Unreachable)等。icmpv6_type 類型通常是一個枚舉或特殊的標識符,用于在編程或配置中引用這些類型。 | ||
code | ICMPv6 code field | integer (8 bit) |
這個字段在某些ICMPv6消息類型中提供關于消息類型的進一步細分或具體錯誤代碼。例如,在目的地不可達消息中,code 字段可以指示不可達的具體原因(如網絡不可達、主機不可達、協議不可達等)。它是一個8位的整數,允許最多256種不同的代碼。 | ||
checksum | ICMPv6 checksum field | integer (16 bit) |
這個字段是ICMPv6消息(包括頭部和數據)的校驗和,用于檢測數據在傳輸過程中是否發生了錯誤。它是一個16位的整數,通過特定的算法計算得出,并在接收端進行驗證。 | ||
parameter-problem | pointer to problem | integer (32 bit) |
當ICMPv6消息類型為“參數問題”(通常是類型0,但code 字段會進一步細分)時,這個字段包含一個指向有問題的參數(如頭部中的某個字段)的指針(實際上是偏移量)。它是一個32位的整數,但由于IPv6頭部和ICMPv6消息結構的限制,實際使用的偏移量通常不會超過16位或24位的范圍。然而,為了與IPv4中的類似字段保持一致或預留未來擴展的可能性,這里將其定義為32位。 | ||
packet-too-big | oversized MTU | integer (32 bit) |
當ICMPv6消息類型為“數據包太大”(類型2)時,這個字段指示了導致該消息發送的數據鏈路層可以支持的最大傳輸單元(MTU)大小。它是一個32位的整數,但實際上,由于MTU值通常遠小于32位整數的范圍,因此這個字段的很大一部分位是未使用的。然而,將其定義為32位可以確保與IPv4中的類似字段保持一致,并預留未來擴展的可能性。 | ||
id | ID of echo request/response | integer (16 bit) |
這個字段在ICMPv6的回顯請求(Echo Request)和回顯應答(Echo Reply)消息中使用,用于唯一標識請求和響應之間的對應關系。它是一個16位的整數,由發送者選擇,并在相應的應答中返回。 | ||
sequence | sequence number of echo request/response | integer (16 bit) |
這個字段是在ICMPv6的回顯請求和回顯應答消息中使用的,它提供了請求和響應之間的序列號。它是一個16位的整數,允許發送者發送多個請求并區分它們的應答。 | ||
max-delay | maximum response delay of MLD queries | integer (16 bit) |
這個字段在ICMPv6的多播監聽器發現(Multicast Listener Discovery, MLD)消息中使用,它指定了MLD查詢消息的最大響應延遲。MLD是IPv6中用于多播地址管理的協議。這個字段是一個16位的整數,表示在發送MLD查詢后,接收者應該等待多長時間以收集響應。 | ||
taddr | target address neighbor solicit/advert, redirect or MLD | ipv6_addr |
這個字段在多種ICMPv6消息類型中使用,包括鄰居請求(Neighbor Solicitation)、鄰居通告(Neighbor Advertisement)、重定向(Redirect)以及某些MLD消息。它表示消息的目標地址,即鄰居請求或通告中請求或通告的IPv6地址,或重定向消息中原始數據包的目標地址。 | ||
daddr | destination address of redirect | ipv6_addr |
這個字段僅在ICMPv6的重定向消息中使用。它表示重定向消息的目標地址,即原始數據包應該被發送到的IPv6地址。這個地址通常是比原始 |
TCP HEADER EXPRESSION
tcp {sport | dport | sequence | ackseq | doff | reserved | flags | window | checksum | urgptr}
Keyword | Description | Type |
---|---|---|
sport | 源端口,標識發送應用程序的端口號 | inet_service |
dport | 目標端口,標識接收應用程序的端口號 | inet_service |
sequence | 序列號,用于按順序交付和流控制 | integer (32 bit) |
ackseq | 確認號,指示發送確認的端點期望接收的下一個序列號 | integer (32 bit) |
doff | 數據偏移量,以32位字為單位指定TCP頭部的長度,也稱為頭部長度 | integer (4 bit) |
reserved | 保留區域,當前未使用,并設置為0 | integer (4 bit) |
flags | TCP標志,用于控制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}
Keyword | Description | Type |
---|---|---|
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
Keyword | Description | Type |
---|---|---|
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 字段
Name | Width in bits | Chunk | Notes |
---|---|---|---|
type | 8 | all | 不直接有用,由塊類型定義 |
flags | 8 | all | 語義根據每個塊的具體類型定義 |
length | 16 | all | 此塊(不包括填充)的長度(以字節為單位) |
tsn | 32 | data | 傳輸序列號,用于標識數據包中的數據傳輸順序 |
stream | 16 | data | 流標識符,用于標識屬于哪個流的數據 |
ssn | 16 | data | 流序列號,用于標識流內數據的順序 |
ppid | 32 | data | 負載協議標識符,標識數據的上層協議類型 |
init-tag | 32 | init, init-ack | 初始化標簽,用于在關聯建立過程中唯一標識 |
a-rwnd | 32 | init, init-ack, sack | 公告的接收窗口信用,指示接收方愿意接收的數據量 |
num-outbound-streams | 16 | init, init-ack | 出站流的數量,由發送方指定 |
num-inbound-streams | 16 | init, init-ack | 入站流的數量,由接收方指定 |
initial-tsn | 32 | init, init-ack | 初始傳輸序列號,用于關聯建立時的同步 |
cum-tsn-ack | 32 | sack, shutdown | 確認的累積傳輸序列號,表示已成功接收的數據包 |
num-gap-ack-blocks | 16 | sack | 包含的Gap Ack塊的數量,用于指示數據包的缺失范圍 |
num-dup-tsns | 16 | sack | 接收到的重復傳輸序列號的數量 |
lowest-tsn | 32 | ecne, cwr | 最低的傳輸序列號,與ECN或CWR控制消息相關 |
seqno | 32 | asconf-ack, asconf | 序列號,用于ASCONF和ASCONF-ACK塊的控制消息同步 |
new-cum-tsn | 32 | forward-tsn | 新的累積傳輸序列號,用于FORWARD TSN塊以指示接收方已接收到的數據 |
DCCP HEADER EXPRESSION
DCCP(Datagram Congestion Control Protocol,數據報擁塞控制協議)是一種傳輸層協議,用于解決多種擁塞問題,特別適用于那些不需要TCP的數據可靠性和重傳功能,但希望進行會話并需要擁塞控制的應用程序。
dccp {sport | dport | type}
Keyword | Description | Type |
sport | Source port | inet_service |
dport | Destination port | inet_service |
type | Packet type | dccp_pktty |
AUTHENTICATION HEADER EXPRESSION
AUTHENTICATION HEADER (AH) 是IPSec協議套件中的一個組件,用于為IP數據包提供數據源的身份驗證和數據完整性保護。AH協議通過在IP數據包中添加一個認證頭部來實現這些功能,但不提供加密服務。
ah {nexthdr | hdrlength | reserved | spi | sequence}
Keyword | Description | Type |
nexthdr | Next header protocol指示AH頭部之后的數據類型 | inet_proto |
hdrlength | AH Header lengthAH頭部的長度(以32位字為單位,不包括這個字段本身),但通常AH頭部的長度是固定的 | integer (8 bit) |
reserved | Reserved area | integer (16 bit) |
spi | Security Parameter Index一個唯一的標識符,用于區分同一目的地IP地址的不同安全關聯(SA) | integer (32 bit) |
sequence | Sequence 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
Keyword | Description |
---|---|
hbh | Hop by Hop Option Header?- 逐跳選項頭部。這個頭部允許中間路由器查看和處理包含在其中的選項。它通常用于需要所有經過的路由器都了解和處理的信息,比如一些安全或路由相關的選項。逐跳選項頭部是IPv6中第一個可選的擴展頭部,如果有多個擴展頭部,它必須緊跟在IPv6基本頭部之后。 |
rt | Routing Header?- 路由頭部。這個頭部用于源路由選擇,指定了數據包應該經過的中間節點(路由器或主機)的順序。它允許發送方控制數據包在網絡中的路徑。路由頭部可以是嚴格源路由(要求數據包嚴格按照指定的路徑傳輸)或松散源路由(數據包必須訪問指定的節點,但可以在這些節點之間選擇任何路徑)。 |
frag | Fragmentation Header?- 分片頭部。當IPv6數據包的大小超過路徑上的某個鏈路的MTU(最大傳輸單元)時,它會被分片。分片頭部包含了關于分片的信息,比如這是原始數據包的哪個分片、分片的偏移量以及是否還有更多的分片。注意,IPv6中通常只在源節點進行分片,而IPv4允許在路徑上的任何節點進行分片。 |
dst | Destination Options Header?- 目的地選項頭部。這個頭部用于向目的節點或中間節點提供關于數據包處理的額外信息。與逐跳選項頭部不同,目的地選項頭部只被目的節點和那些被明確指定要處理這些選項的中間節點查看。這可以用于實現如流控制、認證、加密等高級功能。 |
mh | Mobility Header?- 移動性頭部。這個頭部用于支持IPv6中的移動性管理,它允許移動節點(MN)在改變其網絡接入點時保持其IPv6地址不變。移動性頭部包含了關于移動節點的位置信息,使得數據包能夠被正確地路由到移動節點當前的位置。 |
srh | Segment Routing Header?- 段路由頭部。這個頭部是IPv6擴展頭部的一個較新的成員,用于實現段路由(Segment Routing)功能。段路由是一種網絡架構,它允許數據包按照一系列預定義的段(或路徑段)進行轉發,而不需要傳統的IP路由查找。這可以簡化網絡操作并提高轉發的效率。段路由頭部包含了關于這些段的信息,使得數據包能夠按照預定的路徑進行轉發。 |
TCP Options
Keyword | Description (詳細解釋) | TCP Option Fields |
---|---|---|
eol | End of Option List:此選項表示TCP選項列表的結束。它不包含任何額外的數據字段,僅用于標記選項列表的終止。 | - |
nop | No-Operation (TCP Nop padding option):此選項是一個填充選項,用于對齊后續選項的起始位置或確保TCP頭部的大小是整數倍。它不執行任何操作,僅包含選項類型字段(通常為1)。 | - (僅包含1字節的NOP選項代碼) |
maxseg | TCP Maximum Segment Size (MSS):此選項用于通知對方TCP端點,本端點能夠接收的最大TCP段(segment)中的數據長度(以字節為單位)。它是TCP流量控制的一部分。 | length ?(選項總長度),?size ?(MSS值) |
window | TCP Window Scaling:此選項用于增加TCP窗口大小的表示范圍。它通過一個左移因子來擴展默認的窗口大小字段,允許更大的窗口值,從而提高網絡吞吐量。 | length ?(選項總長度),?count ? |
sack-perm | TCP SACK Permitted:此選項用于通知對方TCP端點,本端點支持選擇性確認(SACK)。SACK是一種TCP擴展,允許接收方通知發送方哪些數據塊已經成功接收,從而允許發送方更有效地重發丟失的數據塊。 | length ?(通常為2,因為此選項不包含額外的數據字段) |
sack /sackN | TCP Selective Acknowledgement:這些選項(sack 通常作為sack0 的別名)用于發送方確認接收方已經成功接收了哪些數據塊。每個SACK塊都包含了一個序列號范圍,表示接收方已經成功接收的數據。N 表示塊編號(如果有多個SACK塊)。 | length ?(選項總長度),?left ?(序列號范圍的左邊界),?right ?(序列號范圍的右邊界) |
timestamp | TCP Timestamps:此選項用于在TCP連接中交換時間戳信息。時間戳可以用于計算往返時間(RTT),從而幫助TCP實現更精確的流量控制和擁塞控制。此外,它還可以用于保護TCP連接免受某些類型的攻擊。 | length ?(選項總長度),?tsval ?(發送方的時間戳),?tsecr ?(最近接收到的對端時間戳的回聲) |
IP Options
Keyword | Description | IP Option Fields |
---|---|---|
lsrr | Loose Source Route:此選項允許發送方指定一系列IP地址,作為數據包應該經過的“松散”源路由。這里的“松散”意味著數據包不需要嚴格按照指定的順序經過這些地址,但必須經過它們。 | type ?(選項類型),?length ?(選項總長度),?ptr ?(指針,指向當前正在處理的地址的偏移量),?addr ?(一個或多個IP地址,表示源路由中的下一跳) |
ra | Router Alert:此選項用于通知沿途的路由器,數據包需要特別的處理。例如,它可能指示路由器檢查數據包的有效載荷中是否有需要由上層協議(如RSVP)處理的特定信息。 | type ?(選項類型),?length ?(通常為4,因為此選項通常只包含一個字節的value 字段),?value ?(路由器應該檢查的值或代碼,具體含義取決于value 的值) |
rr | Record Route:此選項用于記錄數據包經過的每一個路由器的IP地址。它允許發送方了解數據包在到達目的地之前經過了哪些路由。 | type ?(選項類型),?length ?(選項總長度,包括所有記錄的地址),?ptr ?(指針,指向下一個要記錄的地址的位置),?addr ?(一個或多個IP地址,記錄數據包經過的路由器的IP) |
ssrr | Strict 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狀態來做出決策。
用途
- 狀態匹配:
- 使用conntrack表達式,可以匹配數據包是否屬于某個特定的連接狀態,如
ESTABLISHED
(已建立)、RELATED
(相關)、NEW
(新連接)等。 - 例如,iptables規則可以使用
-m conntrack --ctstate ESTABLISHED,RELATED
來匹配所有已建立或相關的連接的數據包。
- 使用conntrack表達式,可以匹配數據包是否屬于某個特定的連接狀態,如
- 連接跟蹤:
- conntrack系統維護了一個所有被跟蹤連接的列表,每個連接都由一個
struct nf_conn
實例表示。 - 當數據包通過Netfilter鉤子函數時,conntrack系統會分析該數據包,確定它屬于哪個連接,并初始化數據包結構中的指針以指向相應的
struct nf_conn
實例。
- conntrack系統維護了一個所有被跟蹤連接的列表,每個連接都由一個
- 狀態分析:
- 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
Keyword | Description | Type |
---|---|---|
state | 連接的當前狀態,如NEW 、ESTABLISHED 、RELATED 等。 | ct_state |
direction | 數據包相對于連接的方向,如原始(Original)或回復(Reply)。 | ct_dir |
status | 連接的額外狀態信息,如是否已過期、是否被忽略等。 | ct_status |
mark | 分配給連接的標記(Mark),可用于自定義過濾規則。 | mark |
expiration | 連接的過期時間。 | time |
helper | 與連接關聯的協議助手(Helper)的名稱。 | string |
label | 分配給連接的標簽,用于基于標簽的過濾。這通常在nftables 的connlabel.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 | 平均每個數據包的字節數,基于packets 和bytes 計算得出。 | 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