簡體   English   中英

在用戶模式下被 sock_raw 捕獲后,如何在內核中丟棄數據包?

[英]How can i drop packet in kernel after catched it by sock_raw in usermode?

我已經使用 sock_raw 從內核獲取所有 ip 數據包。

socket(PF_PACKET, SOCK_RAW, htons(protocol);

但是內核中的數據包仍然存在,我該如何丟棄它?

你不能。 當您在原始套接字上接收到數據包時,內核會創建一個副本並將其交付給接收進程。 在此期間,將根據通常的語義繼續處理該數據包。 到您的進程收到該消息時,它很可能已經完成(即,堆棧通常會執行的所有操作)。

但是,如果實際上沒有將數據包發送到您的機器上(例如,僅由於您的網絡接口處於混雜模式而收到數據包),或者沒有本地進程[或內核組件]有興趣接收數據包,該數據包將被丟棄。

如果您只希望接收到達接口的所有數據包而不處理它們,則可以簡單地以混雜模式啟動接口,而無需為其提供IP地址。 然后,數據包將被傳遞到原始套接字,但隨后將被堆棧丟棄。

老問題,但其他人可能會發現這個答案很有用。

取決於用例,但您實際上可以在從 AF_PACKET SOCK_RAW 獲取入口數據包后丟棄它們。 為此,請在我們有刪除操作的地方放置一個入口 qdisc。 例子:

sudo tc qdisc add dev eth0 ingress
sudo tc filter add dev eth0 parent ffff: matchall action drop

解釋:這是可行的,因為 AF_PACKET 從 per-device tap 嗅探數據包的副本,這比內核網絡堆棧的數據包處理管道中的入口 qdisc 早一點。 這樣你就可以實現一個簡單的用戶空間切換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM