在某次需要之下,我們要針對 URL 進行過濾,但使用了 iptables 發現,iptables 並無法進行 URL 的過濾,當你在輸入 URL 時,iptables 會進行 DNS 的查詢,進而轉換成所對應的 IP Address,然而,一個 DNS 所能對應的將會是多個 IP Address,而且可能是變動的,這可能導致你每次輸入的 DNS,再經由 iptables 轉換後進到 rules,會是錯誤的 IP Address。
在網路上搜尋所對應的資訊,可以利用 Kernel 中所提供的許多種 match module 來進行過濾,但老實說各有利弊,不同的 module 有他自己本身的副作用 (例如可能導致特定的網站也上不去,像是擋錯人的意思),在現階段看起來比較好用的,會是 weburl 這個 match module,但並不是 Kernel 本身所內建的,而是需要自己去進行 Porting。
weburl 出處如下 https://www.gargoyle-router.com/gargoyle/projects/gargoyle/repository/show/netfilter-match-modules/weburl?rev=master
我們會需要修改到 Kernel 與 iptables (Userspace) 的部分,一個是讓 Kernel 本身支援,另外一個是讓 Userspace Application 可以下到 Kernel
1. 首先,我們先處理 Kernel 的部分,
- 將 module 中的 weburl_deps, ipt_weburl.c 這兩個放置於 Kernel Source Code 中的 net/netfilter/ 下。
- 將所需要的 header file,只有 ipt_weburl.h 這一個,放置於 include/linux/netfilter_ipv4/。
- 之後我們需要修改兩個檔案,讓在 make menuconfig 中可以選擇是否要編譯進去。需要修改的有 net/netfilter/Kconfig 和 net/netfilter/Makefile。詳細的修改內容可以參考 github commit 的部分。
2. 接下來,是修改 iptables 的部分,為了不讓版本差異太大,導致編譯不過,最好先看看自己本身 Linux Kernel 和 iptables 的版本,以現有的下去修改,會比較順利。
- 把 extensions 中的 libipt_weburl.c 放置於 iptables Source Code 的 extensions 中
- 一樣把 ipt_weburl.h 這個 header 放置於 iptables Source Code 中的 include/linux/netfilter_ipv4/ 中
3. 最後,各自編譯 Kernel 並重開機載入,然後編譯 iptables 來用,在使用前不要忘記先到 /lib 底下把 module 載入系統中,應該就可以利用 iptables 過濾出 URL。
附上:
github commit (diff): Kernel https://github.com/jackzzjack/linux/commit/aadcb661495791e0a01bb661ec2cf41b5bd24699
bitbucket commit (diff): iptables
weburl source code:
https://www.gargoyle-router.com/gargoyle/projects/gargoyle/repository/revisions/master/show/netfilter-match-modules/weburl
沒有留言:
張貼留言