nftables 以 ip 區段為單位做操作

範例

table inet auto_ban {
	set ip6_prefix {
		# 儲存型態為 IPv6 地址,這個案例只有前 64 bit 有效,後面都是 0
		type ipv6_addr;
		# dynamic 讓這個集合可以由其他規則動態新增項目
		flags dynamic,timeout;
		# 預設的時效,超時自動刪除
		timeout 1h;
		# 集合最大大小,防止使用過多記憶體,超量不知道會怎處理
		size 65536;
	}
	chain input_limit {
		type filter hook input priority filter;
		# 只取前 64 bit 做比對,後面都是 0 ,符合就設定追蹤並通過
		ip6 saddr & ffff:ffff:ffff:ffff:: == @ip6_prefix meta nftrace set 1 accept
		# 新增項目時只取前 64 bit,後面都是 0
		meta nfproto ipv6 add @ip6_prefix { ip6 saddr & ffff:ffff:ffff:ffff:: }
	}
}

觀念

可以跟相同型態的資料做 and (&), or (|), xor (^), lshift (>>) 等各種位元運算

必須使用該型態的表達方式才能做運算否則即使長度相同也會語法解析失敗,比如 ip6 saddr == 0x1 就會解析失敗

,

Related posts

Serde 對現有值進行複寫的反序列化

Serde 反序列化除了基於預設值複寫外,也可以基於其他現有值複寫,通過不在文件上寫明的公開穩定特徵方法 serde::Deserialize::deserialize_in_place() 可以做到。

原始碼中的註解表示,這個方法被隱藏的原因是新手很少使用。我說這很常用吧....

Rust 巨集語法 macro_rules

參考:

https://doc.rust-lang.org/reference/macros-by-example.htmlhttps://veykril.github.io/tlborm/decl-macros/minutiae/fragment-specifiers.html

巨集語法太廣了,看起來還有 @內部規則 之類的用法,之後再看...

定義巨集

macro_rules! 巨集名稱 {
比對規則 => { 產生程式 };
...
}

比對規則

參數輸入

使用巨集時填入的參數會基於 Rust 語法被編譯器分解為帶階層的字串組,再對規則做比對

a+b 會分解為 a +...

在 Rust 用 trait 實現 OOP 的單層多重繼承

有了這寫法,就可以輕鬆實現多種功能隨意組合了

純方法,沒有依賴結構

直接寫 trait 跟 impl Trait for Struct {}

有依賴結構

// 功能 A
mod func_a {
#
pub struct FuncAStruct...

vim 操作

啟動參數

-p 可將多個檔案各別開到標籤頁

快速鍵

= 文字重新排版、格式化

za 開關 fold

. 重複文字操作

@: 重複指令操作

^ / Home 前往行開頭

$ / End 前往行結尾

g t...

原子操作 memory order 設定

這個設定可以限制 CPU 亂序執行的執行順序,簡單說明如表:

設定值讀寫順序relaxedOO不影響acquireOX後面的程式要等這行執行完了才會執行,即後面的程式不會早於此操作執行。releaseXO前面的程式要都執行完了才會執行後面的程式,即前面的程式不會晚於此操作執行acq_relOO等同 acquire + releaseseq_cstOO視操作類型加上 acquire, release, acq_rel 其一,並依序向其他線程同步consumeOX等同 acquire,但只向與該變數有關的線程同步據說編譯器沒實作這東西,沒驗證是否為真

整理資訊原文

memory_order_relaxed:純原子操作,不影響順序memory_order_acquire:只能用於取值,且確保後面變數的讀寫操作不會再取值前開始(即保證後面的變數操作不會被往前排)memory_order_release:只能用於寫值,寫值前會確保前面變數的讀寫操作都完成了(即保證前面的變數操作不會被往後排)關聯點:使用 memory_order_acquire 的線程會向使用 memory_order_release...

Leave a Comment

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *