高效率的iptables GEOIP模組

手邊有台vpn server上面用iptables跑policy routing,連往大陸地區就從特定interface出去,之前的做法是到apnic取得大陸地區最新的ip list後,再利用script一行一行餵進去iptables裡面,即使做過CIDR merge後,還是快要達到800筆record,每每上線使用者一多、或是流量變大時機器的loading就會增加,這種作法不用分析也大概猜得出來,iptables內部作rule match是採用list match,當rule量很大的時候,效能當然會變差。

當初在做的時候,有考慮過採用iptables的geoip模組,後來沒有採用的原因有二:

  1. 需要打patch-o-matic這個patch,要重編kernel太麻煩。
  2. 檢查過該模組對於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的朋友可以改用這個模組。

安裝方式:

  1. 這裡下載最新的xtables-addons。(目前最新版本為1.9)
  2. 解開後
    cd xtables-addons
    ./autogen.sh
    ./confiure ; make ; make install
  3. 搞定收工,夠簡單吧。

如果你是要使用geoip模組,由於作者修改了資料儲存的結構,如果你採用舊的csv2bin產生的檔案會無法使用,你必須下列步驟:

  1. 下載作者轉換好的檔案(每個月會更新一次),放在/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,實在傷當開心阿。

本篇發表於 Linux, 技術 並標籤為 , , , , , , 。將永久鏈結加入書籤。

高效率的iptables GEOIP模組 有 3 則回應

  1. arnan 說道:

    CIDR merge 有用什麼好用的工作處理的嗎? 還是人工阿orz

  2. clyang 說道:

    有的, 剛好用這來寫一篇 :Q

  3. 通告: How to merge CIDR | 查理布朗的倒楣世界

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*

您可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>