這兩天想這在Android上翻牆,誰不想科學上網啊!於是倒弄一個叫做GAE Proxy的代理軟體。
該軟體提供一鍵代理,但前提是機器必須root和支援iptables,如果不支援iptables,只能用GAE 內建的瀏覽器翻出去,機器本身的軟體(比如瀏覽器,Youtube用戶端)都不能翻牆。我們的機器已經root了,也支援iptables命令,但機器本身軟體就是翻不了。
找找問題,試了我的神機HUAWEI 8650,可以,是正常的。又試了棒子的9250,也沒問題。人家的都可以,為啥我們的產品不行呢。
用lsmod看了一下,神機和9250裡面一個模組都沒有,也就是說全部都編譯進核心了,而我們的機器,大部分非核心都編譯成模組的,在啟動的時候在載入。難道模組真的會有問題?? iptables確實也是編譯為模組的。
看了GAE官網上,想要自由地翻,iptables應至少支援DNAT或REDIRECT中的一種。好吧,咱也載入。載入完後,還是不行。
這個時候鬱悶了,把iptables相關的 全部編譯進核心,竟然神奇的可以了。說明肯定是模組不全。
logcat看一下這個GAE Proxy在啟動的時候都幹了什麼事情,這個代理跟squid差不多,都是藉助iptables轉寄。
D/GAEProxy( 1274): /data/data/org.gaeproxy/iptables -t nat -A OUTPUT -p tcp -d 10.0.0.0/8 -j RETURN
D/GAEProxy( 1274): /data/data/org.gaeproxy/iptables -t nat -A OUTPUT -p tcp -d 172.16.0.0/12 -j RETURN
D/GAEProxy( 1274): /data/data/org.gaeproxy/iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to 8123
D/GAEProxy( 1274): /data/data/org.gaeproxy/iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to 8124
然後再用 iptables -L -t nat看一下,是最後出了問題,在做連接埠重新導向的時候失敗了。提示
運行iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to 8123
iptables: No chain/target/match by that name
看了iptables指南中寫道:
這說明你要用的鏈或 target、或 match 不存在,原因有很多,但最普遍的
是你拼錯了名字。當你想使用一個停用模組時也會產生這種錯誤。模組之所
以不可用,可能是因為你沒有裝載正確的模組,或者核心裡不包含那個模組,或
者是 iptables 自動裝載模組時失敗了。通常,你不止應該考慮上面提到的所有
解決辦法,還要考慮規則中 target 的拼字錯誤,或者其他的原因。
拼字錯誤不可能,那就是沒有裝載正確模組。可以,這NAT,REDIRECT 我都載入了啊,用lsmod看都是有的。
真的找不出還缺什麼模組,失敗了又不提示缺哪個模組,手機上都是編譯進核心的,也無法比較。
這個時候突然想到我的PC也是剛配了翻牆,而且都正常,lsmod看一下,比較不同。終於發現了,缺少xt_tcpudp模組!
modprobe xt_tcpudp
然後再試,果然通了。
總結:想無拘束地翻牆,需要三個模組(這些模組可能依賴其他模組)
modprobe iptable_nat
modprobe ipt_REDIRECT
modprobe xt_tcpudp
這樣就可以了。