Android 網絡防火牆的實現-Iptables

原文轉自  http://hi.baidu.com/670696652/item/a49ff80d8c7f7d7bbee97e20

Iptables的介紹:

iptables 是與最新的 2.6.x 版本 Linux 內核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則該系統有利於在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。

其工作原理:

netfilter/iptables IP 信息包過濾系統是一種功能強大的工具, 可用於添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火牆所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中, 而這些表集成在 Linux 內核中。 在信息包過濾表中,規則被分組放在我們所謂的 鏈(chain)中。我馬上會詳細討論這些規則以及如何建立這些規則並將它們分組在鏈中。

雖然 netfilter/iptables IP 信息包過濾系統被稱爲單個實體,但它實際上由兩個組件 netfilter和 iptables 組成。

netfilter 組件也稱爲 內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成, 這些表包含內核用來控制信息包過濾處理的規則集。

iptables 組件是一種工具,也稱爲 用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。 除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要從 netfilter.org 下載該工具並安裝使用它。

通過使用用戶空間,可以構建自己的定製規則,這些規則存儲在內核空間的信息包過濾表中。 這些規則具有 目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什麼。 如果某個信息包與規則匹配,那麼使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞並殺死信息包。對於可對信息包執行的其它操作,還有許多其它目標。

根據規則所處理的信息包的類型,可以將規則分組在鏈中。處理入站信息包的規則被添加到 INPUT 鏈中。處理出站信息包的規則被添加到 OUTPUT 鏈中。處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。 另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING ), 以及提供用戶定義的鏈。每個鏈都可以有一個 策略, 它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。

建立規則並將鏈放在適當的位置之後,就可以開始進行真正的信息包過濾工作了。 這時內核空間從用戶空間接管工作。當信息包到達防火牆時,內核先 檢查信息包的頭信息,尤其是信息包的目的地。 我們將這個過程稱爲 路由。

如果信息包源自外界並前往系統,而且防火牆是打開的,那麼內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,並且此信息包要前往另一個外部系統, 那麼信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統並前往外部系統的信息包被傳遞到 FORWARD 鏈。

接下來,將信息包的頭信息與它所傳遞到的鏈中的每條規則進行比較,看它是否與某條規則完全匹配。 如果信息包與某條規則匹配,那麼內核就對該信息包執行由該規則的目標指定的操作。 但是,如果信息包與這條規則不匹配,那麼它將與鏈中的下一條規則進行比較。 最後,如果信息包與鏈中的任何規則都不匹配,那麼內核將參考該鏈的策略來決定如何處理該信息包。 理想的策略應該告訴內核 DROP 該信息包。下圖用圖形說明了這個信息包過濾過程。

使用Iptables進行防火牆軟件設計的解決方案。

由於Iptables已經有了完善的防火牆規則,我們只需要設計一個基於Iptables的Android前臺即可,通過運行腳本,調用iptables設置防火牆規則即可。

 看了一下android的iptables規則說明:

iptables v1.3.7

Usage: iptables -[AD] chain rule-specification [options]
       iptables -[RI] chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LFZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain  Append to chain
  --delete  -D chain  Delete matching rule from chain
  --delete  -D chain rulenum
    Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
    Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
    Replace rule rulenum (1 = first) in chain
  --list    -L [chain]  List the rules in a chain or all chains
  --flush   -F [chain]  Delete all rules in  chain or all chains
  --zero    -Z [chain]  Zero counters in chain or all chains
  --new     -N chain  Create a new user-defined chain
  --delete-chain
            -X [chain]  Delete a user-defined chain
  --policy  -P chain target
    Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
    Change chain name, (moving any references)
Options:
  --proto -p [!] proto protocol: by number or name, eg. `tcp'
  --source -s [!] address[/mask]
    source specification
  --destination -d [!] address[/mask]
    destination specification
  --in-interface -i [!] input name[+]
    network interface name ([+] for wildcard)
  --jump -j target
    target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match -m match
    extended match (may load extension)
  --numeric -n  numeric output of addresses and ports
  --out-interface -o [!] output name[+]
    network interface name ([+] for wildcard)
  --table -t table table to manipulate (default: `filter')
  --verbose -v  verbose mode
  --line-numbers  print line numbers when listing
  --exact -x  expand numbers (display exact values)
[!] --fragment -f  match second or further fragments only
  --modprobe=<command>  try to insert modules using this command
  --set-counters PKTS BYTES set the counter during insert/append
[!] --version -V  print package version.

  

  大家可以學習下Droid wall的源代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章