分類:BSD

神奇的 Packet Filter over Link Layer NIC Driver

剛在某窩上看到有人提到這篇論文
The Design and Implementation of Packet Filter over Link Layer NIC Driver

首先這個標題就很神奇,網卡的 Driver 不是 Link Layer,難道是 Network Layer,也許作者想要特別指明不會支援 PWE3 ?

3.5 預到的瓶頸與解決方法 ,看到

一開想用 pcap 的方式來過濾封包,但後來發現 pcap 的運作方式,是將封包資料從 OS 複製一份給 pcap 用,這樣子造成了pcap 沒辦法真正從 OS 中攔劫掉網路封包,所以後來才改用在網路驅動程式中攔截封包。

這這這,Linux 的 netfilterebtables 本來就有 link layer hook ; FreeBSD 的 ipfw(8) 也一樣有 link layer hook,幹麻寫到 device driver 裡去啊

Update:

還有要申請專利的樣子,看起來對 prior art 完全沒查過啊,裡面說

但以現今防火牆所使用之技術,都實作於TCP layer層級,去比對port number。但我們所實作之封包過濾器,則是位於device driver層級,直接在ethernet device driver中做封包過濾之動作。

一般防火牆如iptables(for Linux)、Norton Internet Security(for Windows)等,都是製作於transport layer和application layer中間

無言以對了,FreeBSD 是在 2003-09 有了 layer 2 ipfw ‘fwd’ support ; Linux 是 2002-04 有了 ebtables

Technorati Tags: , ,

廣告

Minimizing Memory Usage for Creating Application Subprocesses

Minimizing Memory Usage for Creating Application Subprocesses 講解為甚麼要用 posix_spawn() 取代  fork() + exec() 跑外部程式,牽涉兩個問題。

第一個是 VM out of memory,舉例來說,一個 6G 的 process 要跑 /bin/ls,fork() 時也要用到 6G VM,由於 Solaris 不像 Linux 會 memory over comit,swap 開的不夠大就會 out of memory。

第二個是效能問題, fork() 要 copy 一堆資料結構,這點 BSD 用 vfork() 解決,vfork() 不會 copy 那堆資料結構。然而在 multi-thread 時,vfork() 又會造成 parent 和 child 間 dead lock,詳情參照原文。

posix_spawn() 避免了 fork() 要另外佔用 VM 的問題,另外有個好處,就是傳統上發生在 fork() 和 exec() 間一些動作,posix_spawn() 可以做精細的設定,像是 change user and group ID, signal mask, scheduling class, file descripter, shell redirect, etc.

後面提到 Linux  memory over commit 的優缺點,主要的缺點是發生 out of memory 的時機不確定(因為你跟系統要多少,系統都跟你說有,根本無法檢查),等到 VM 真的用完 OOM killer  會隨機挑/試著選 一個 process 砍掉,這在企業系統上是不允許的。

Technorati Tags: