android平臺利用iptables控制網絡訪問

1.什麼是Iptable

百度百科對於Iptables有詳細的介紹。簡單地說,IptablesLinux內核提供的一套IP信息包過濾系統,對外由Iptables命令提供設置過濾規則的入口。

Android是基於Linux操作系統,支持Iptables。執行Iptables命令需要root權限。

 

2.如何配置Iptables命令鏈?

假設一個安卓系統網絡訪問管理體系,需要針對不同的app、不同的域名配置不同的網絡訪問控制策略(允許訪問/禁止訪問),譬如,規定使用UC瀏覽器可以訪問sina,使用360瀏覽器不可以訪問sohu,等等。

root過的Android設備上,通過adb shell,調試Iptables命令鏈。

 

1步:根據user id區分不同的app

Android系統安裝apk的時候,會爲每一個應用分配一個userIduserId在此設備上將唯一且不再變化(但同一個app在不同的設備上userId可能不同)。另外,應用也可以通過在AndroidManifest.xml中通過android:shareUserId字段來和其他應用共享userId,但有其他限制,比如簽名等,此處不展開。

Android系統中/data/system/packages.xml用來記錄系統中所有安裝的應用信息,其中可以查到userId。針對某一個應用,根據其包名查到userId。包名可以通過在手機上啓動應用,然後adb shell下通過dumpsys window查看。假設查到UC瀏覽器的userId10060

簡便起見,即以10060UC使用的規則鏈(chain)名。

 

2步:創建規則鏈並且關聯到app

adb shell下執行命令創建規則鏈:

iptables -N 10060

執行下面命令將規則鏈10060UC瀏覽器關聯:

iptables -A OUTPUT -m owner --uid-owner 10060 -j 10060

語義說明:向OUTPUT規則鏈附加一條規則:如果IP信息報匹配到uid10060,則跳轉(-j)到規則鏈10060iptables支持區分不同的uid以跳轉到不同的規則鏈。通過iptables -L可以查詢到當前內核已有的規則鏈。其中OUTPUT是內核自動創建的處理本地生成的IP信息包的規則鏈。

在具體配置規則鏈10060之前,可以運行下面命令將10060內容清掉:

iptables -F 10060

爲什麼要在OUTPUT中添加規則鏈,而不是在INPUT

因爲往往需要實現網絡訪問白名單功能,即允許訪問某個域名,其他的不允許。有很多網站的內容IP包並不僅僅是自己的域名下,還包括一些其他的域名,譬如新浪的域名是http://www.sina.com.cn/,新浪微博的域名是http://weibo.com/,新浪域名下的很多網頁可能內容來自新浪微博。這種情況難以統計清楚或預估,所以如果在INPUT中只放行白名單域名關鍵字的IP包,往往會丟失內容。

OUTPUT中添加規則鏈,利用Http協議中的Host頭域,只放行白名單域名的請求。能更好的地實現白名單需求。

 

3步:配置訪問規則

白名單功能:

允許訪問某一域名(www.abc.com)禁止訪問其他域名

iptables -A 10060 -p tcp -m string --string Host: --algo bm -j MARK --set-mark 1

iptables -A 10060 -p tcp -m mark --mark 1 -m string --string abc --algo bm -j ACCEPT

iptables -A 10060 -p tcp -m mark --mark 1 -j REJECT

 

黑名單功能:

禁止訪問某一域名(www.abc.com)允許訪問其他域名

iptables -A 10060 -m string --string abc --algo bm -j REJECT

iptables -A 10060 -j ACCEPT

 

說明:對於黑名單,邏輯比較簡單,只要把所有包含abcIPREJECT即可,其餘的ACCEPT,即使沒有第二條命令,默認也是ACCEPT

對於白名單,針對Host頭域,原因如上。對於包含HostIP包先做一次mark(標記),然後對此標記的IP包判斷是否包含abc

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