手邊有台vpn server上面用iptables跑policy routing,連往大陸地區就從特定interface出去,之前的做法是到apnic取得大陸地區最新的ip list後,再利用script一行一行餵進去iptables裡面,即使做過CIDR merge後,還是快要達到800筆record,每每上線使用者一多、或是流量變大時機器的loading就會增加,這種作法不用分析也大概猜得出來,iptables內部作rule match是採用list match,當rule量很大的時候,效能當然會變差。
當初在做的時候,有考慮過採用iptables的geoip模組,後來沒有採用的原因有二:
- 需要打patch-o-matic這個patch,要重編kernel太麻煩。
- 檢查過該模組對於ip rule的比對作法依然是採用list search。
既然效率沒有比較好,安裝又麻煩,當然就不列入考慮。
後來當兵前,發現有人丟出一個方便的玩意叫做:xtables-addons,只要你的kernel版本是在2.6.17以上、iptables版本在1.4.1以上就可以免patch kernel直接上geoip這個模組。xtables-addons不只提供geoip這模組還提供下列模組,都是可以免patch kernel直接使用的:
- CHAOS
- DELUDE
- DHCPADDR
- ECHO
- IPMARK
- LOGMARK
- SYSRQ
- TARPIT
- TEE
- condition
- fuzzy
- geoip
- ipp2p
- ipset
- length2
- portscan
- quota2
連擋p2p好用的模組ipp2p也可以免patch直接使用,實在相當方便,這也直接解決了上面提到的第一個麻煩,但是當時得知時去翻了一下他的source code,依然是採用list search,所以既然效率沒有增加,也就沒有安裝的動力,不過這個方便的玩意到是列入我的watch list,直到2008年五月的時候丟出了1.5.3版本,從release notes中看到:
improved geoip match: O(log(n)) list search time [previously O(n)]
馬上去翻了他的code,這個版本採用binary search來改進效率,從O(n)進步到O(log(n)),拿這台機器為例,n=800且每個封包就得做一次match,這樣的進步實在可觀阿,無奈那時候在當兵,放假時間寶貴,所以就先擱置了。
直到前幾天,突然想起來有這玩意,就把這玩意裝上去了,效果非常顯著,推薦給有使用geoip的朋友可以改用這個模組。
安裝方式:
- 到這裡下載最新的xtables-addons。(目前最新版本為1.9)
- 解開後
cd xtables-addons
./autogen.sh
./confiure ; make ; make install - 搞定收工,夠簡單吧。
如果你是要使用geoip模組,由於作者修改了資料儲存的結構,如果你採用舊的csv2bin產生的檔案會無法使用,你必須下列步驟:
- 下載作者轉換好的檔案(每個月會更新一次),放在/var/geoip/LE下面即可使用。
如果想要自己轉換,下載回來的檔案解開後有一隻geoip_csv_iv0.pl程式,你可以自行下載maxmind的geoip csv檔案回來轉。(轉出來是一樣的東西)。
安裝好後,使用方法如下:
iptables -t mangle -A PREROUTING -s 192.168.0.0/24 -m geoip –dst-cc CN -j MARK –set-mark 0×1
擺脫之前那醜陋的800筆紀錄,又能降低loading,實在傷當開心阿。

CIDR merge 有用什麼好用的工作處理的嗎? 還是人工阿orz
有的, 剛好用這來寫一篇 :Q
通告: How to merge CIDR | 查理布朗的倒楣世界