簡易 APN Proxy (APN代理)的搭建
本文轉載自莓玩沒了 簡易 APN Proxy (APN代理)的搭建。美博園沒有測試,用過的朋友請反饋。
2012年2月1日,新增加了一種方案,請看 《搭建增強型代理伺服器(APN Proxy)》
2012-01-03 更新 3proxy 及 監控進程腳本,分別見 B 3) 和
曾經在twitter被封鎖的時候,我在長城寬頻干過一件事,那就是將twitter的請求和通訊使用SSH,讓全網用戶可以無阻訪問,不過也因此付出了代價,略不去說了。
後來得廚神 @paveo 的創意,何不將其用在手機等移動設備上?廚神的APN現在已經很成熟並在免費有限量專供中。我今天這裡寫得,是如何搭建自己的APN Proxy(APN 代理),但在閱讀下面內容之前,需要一個剛性要求:一台在國內的Unix-Like的主機(可以是Linux/FreeBSD/Mac Osx Server/Solaris等等)並且是公網IP地址以及在國外的VPS主機(Unix類)。這個要求可以看出成本比較高,所以我看到淘寶上已經有人開始出售APN代理了,這個可以理解。
第一部分 原理
原理圖1
如上圖所示,我們要實現的功能原理是,將上網請求先發送到「國內VPS」,再由「國內VPS」通過SSH隧道轉送到國外,最終實現無阻上網。點擊查看大圖可以看出,主要配置是在「國內VPS」上,包括配置SSH -D、Squid、Privoxy或者Polipo(socks代理程序你可以選自己喜歡的)。
第二 配置
1 國外VPS
國外VPS上,你需要有一個SSH帳戶,並且請注意,使用密鑰方式登錄你的SSH而非密碼,之所以如此,是為了下一步建立長久的SSH以及斷線自動重連做準備,這個很重要。關於「SSH 免密碼 密鑰 登錄」請使用google看一下。
這裡有一個小插曲,部分centos 上如果默認的話,SSH帳戶會報錯,大約 是adminitstatly close之類,這有可能是 openfile數目問題,可以輕鬆解決。我非Linux愛好者,所以是臨時google,並沒有記錄下來,你只要記得如果遇到同樣問題,5分鐘之內就可以google解決。
2 國內VPS
這一節將會是我們的主戰場,基本上,我將會按下面的邏輯圖來進行配置,這其中會涉及很多文件的配置,需要你注意哦,最後部分我會提供部分配置文檔下載,由於我使用的是FreeBSD,因此會有少量差異,我想這不會難倒你,對么?
A SSH 隧道
其實就是我們平時上網用的 SSH -D 方式,在本地打開 7070連線埠到國外VPS的SSH建立隧道,這樣我們出國的流量就經過加密了。我們平時使用 ssh -qN -D 7070 demo@excample.com 來連接,但是現在我們要站在伺服器的角度考量問題:如果SSH -D方式中斷了,怎麼辦?
這裡我們要做的事情是,建立一個機制,使得在SSH隧道出現問題的時候可以自動重啟自動連接,有一個現成的工具可以使用 autossh (FreeBSD請使用 whereis autossh ),autossh 可以傳遞大多數ssh的參數,包含 -D ,然後會監視這個會話連接,如果出現中斷就可以自動重連接。
不過,如果 ssh 連接本身沒有中斷,但是進程卡死,sleep 狀態,autossh 也不頂了怎麼辦?於是又要寫一個腳本,定時檢查 autossh 進程或者乾脆定時重啟 autossh 。
以下為腳本
#!/bin/sh
export AUTOSSH_PIDFILE=/var/run/autossh.pid
pidfile="/var/run/autossh.pid"
if [ -f $pidfile ];then
kill `cat $pidfile`
touch $pidfile
else
touch $pidfile
fi
/usr/local/bin/autossh -M 9000 -f -q -N -D 7070 root@excample.com
######################
#腳本 autossh.sh 結束#
######################
注意上面最後一句 autossh -M ,這個參數是監控連線埠,大體是通過此連線埠來判斷 ssh 隧道是不是有問題,這個連線埠你可以隨意指定。
你也可以將這個腳本加入到 crontab 中(使用crontab -e),比如我,設定半小時執行一次,目的是每半小時無論SSH連接是否正常都會重啟一下隧道連接,也可以設定在夜間重啟,總之,隨你如何了。
接下來,為了防止假死情況發生(我指autossh本身),我又再次寫了一段腳本,用來實時監控 autossh 進程,一旦進程中斷,這個新腳本就可以重新啟動SSH連接。這個腳本是用來監控進程PID是否存在,PidFile有沒有進程號,連線埠7070存在否。(注意,這是在FreeBSD寫得腳本,因此你需要改成適用於你系統的,比如 sockstat 其他系統沒有這個命令,用以查看連線埠使用,你可以使用 netstat 來取代 )
#!/bin/sh
while :
do
stillRunning=$(ps awx |grep "(autossh)" |grep -v "grep" | awk '{print $1}')
dead=`cat /var/run/autossh.pid`
port=`sockstat -4l | grep :7070`
[ -z "$stillRunning" -o -z "$dead" -o -z "$port" ] && /etc/autossh.sh
sleep 10
done
########################
#mon-autossh.sh腳本結束#
########################
mon-autossh.sh中使用了無限循環,你也可以使用crontab來做定時檢測,使用上面的腳本會吃系統資源儘管對於單服務類型的主機來說這一點也不是問題。
做完以上步驟,這時候我們就在本地建立了一個連線埠映射,即一個 7070連線埠的 socks5 代理。
我們即將進行下一步,但有個問題擋在面前,為何我們不直接將這個sokes5代理應用到squid上卻非要安裝 Privoxy或者polipo?這是因為,squid 雖然支持二級代理,但是要求父代理必須是 HTTP ,因此我們的 ssh 生成的 socks5 代理就不能用了,我們就藉助第三方軟體來給squid 穿上 ssh 的外衣,這就是即將用到的 privoxy 或者 polipo 中的一種,注意,你只需要安裝其中一種,我之所以將兩種都寫出來,是因二者有不同,希望你能了解個中不同,選擇自己需要的。
B 代理轉換 Privoxy 或者 Polipo,以及最好用的 3Proxy
1) Privoxy
我想使用過tor的人應該很熟悉這個軟體,或者使用opera瀏覽器的人。這個程序強大的地方除了可以將 socks5 代理轉為 HTTP 外,還在於它支持按照規則轉發(比如將GFW認證的網站與普通網站區分開)、廣告過濾。也就是說,Privoxy 這個程序已經可以取代 squid 的功能,所以若你選擇了 Privoxy 配置完好,就可以不看下面的部分了(只是認證環節我一直無法搞定)。不多說了,下面附上配置,分為兩部分 Privoxy 的 config 和 gfw.action ,前者是全局設定,後者則是只將gfw的網站代理出國,其他網站仍然走國內路由,提高訪問速度。
########
#以下是 privoxy 的 config
########
user-manual /usr/local/share/doc/privoxy/user-manual
confdir /usr/local/etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
### 下面這個 block.action 就是默認的過濾規則,可以去廣告
#actionsfile block.action
#### 下面 gfw.action 就是我們需要的,只有符合這個規則才走國外代理
#### 請在 config 同目錄下創建 gfw.action
actionsfile gfw.action
filterfile default.filter
#filterfile user.filter
logfile logfile
hostname www.chinablock.me
#forward-socks5 / 127.0.0.1:7070 .
# 下面這一行表示 打開 8118連線埠,你可以用手機直接連接進來
###################################################
listen-address 0.0.0.0:8118
### 下面的配置我不多說,都是必要項,有興趣的可以日後研究
###
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 5120
#connection-sharing 0
forwarded-connect-retries 3
accept-intercepted-requests 0
allow-cgi-request-crunching 0
activity-animation 1
split-large-forms 0
keep-alive-timeout 0
socket-timeout 120
handle-as-empty-doc-returns-ok 1
#### 配置結束 #######################################
OK了,這個就默認的 Privoxy 的 config 了,接下來我們要定義 gfw.action ,要把 autoproxy 里的那麼多網址加進來,會累死你的,幸運地有網友已經提前做好了,請訪問這裡:
https://github.com/cckpg/autoproxy2privoxy
然後修改 gfw.action 為 {+forward-override{forward-socks5 127.0.0.1:7070 .}} ,注意 那個「 . 」,很必要。
如果按以上方式,其實你已經配置好了代理,並且打開你的手機,在代理那裡輸入 IP : 8118 就可以訪問世界了。iphone/ipad/touch/需要到app store 下載安裝「易apn」這個軟體,然後在專網那裡自定一個 apn 代理就可以了。
當然,選用squid自有選用的道理,配置完之後同樣也可以被squid拿來使用。我們接著配置另一個代理 polipo (兩個代理軟體,你只需要選擇一個)
2) Polipo
我想大家可以注意到 tor的默認組合已經從 tor + Privoxy 轉換到了 tor + polipo ,前者我們在上面已經說過優點,缺點就是太難配置了(其實我覺得也不難啊,就是規則寫起來麻煩點點),而polipo優點是自帶緩存功能,有一定的加速效果,再者就是可以將幾個SSH通道做負載均衡,就是說你可以建立多個SSH -D連接然後綁定到一個polipo上。另一個好處就是配置簡單易用,不過過濾功能就比privoxy弱了許多(也可以ad-block,不過真沒必要)。
所以我當前在用的方案就是 Squid + Polipo ,polipo 可以不設置緩存,設置了也不會影響,緩存工作交給squid來就OK。這一部分的配置可以參閱: https://xijie.wordpress.com/2011/05/28/squid3polipo-use-sock5/ ,;但是只參閱而不要使用這個配置,除非同時連接多個ssh主機。下面給出我的polipo配置
#config file for polipo @ /usr/local/etc/polipo/
proxyAddress = "0.0.0.0" # IPv4 only
proxyPort = 8119
allowedClients = 127.0.0.1,211.161.103.253
allowedPorts=1-65535
proxyName = "APN代理"
socksParentProxy = "localhost:7070"
socksProxyType = socks5
chunkHighMark = 819200
objectHighMark = 128
diskCacheFilePermissions=0640
diskCacheDirectoryPermissions=0750
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
disableVia=false
censoredHeaders = from, accept-language
pmmFirstSize = 16384
pmmSize = 8192
maxConnectionAge = 5m
maxConnectionRequests = 120
serverMaxSlots = 8
serverSlots = 4
tunnelAllowedPorts = 1-65535
#End
大體上,如上的配置,就已經成功,同 B 1) 一樣,這個時候只要設置代理為 8119 就可以上網了,可以不必向下閱讀Squid部分了。
3) 3Proxy
儘管我很喜歡使用polipo,但是在和squid配合使用時會有點點小毛病,而且3Proxy的功能更合乎我的需求:多連線埠代理,同時開放 socks5和http,並且可以做負載均衡,本例中不介紹,你可以查閱相關文章,我直接附上我的配置
###########################################
#!/usr/local/bin/3proxy
config /usr/local/etc/3proxy.cfg
nserver 8.8.8.8
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
daemon
log /var/log/3proxy.log D
rotate 10
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
archiver gz /usr/bin/gzip %F
auth iponly
allow * 127.0.0.1,220.161.103.253 * *
parent 1000 socks5 127.0.0.1 7070 #使用父代理SSH -D
proxy -a -p8117 #-a 是指匿名,-p指連線埠
external 12.34.56.78
internal 12.34.56.78 #你可以在這裡改成127.0.0.1,原文檔中有說明
allow * * * 80-88,8080-8088 HTTP
allow * * * 443,8443 HTTPS
#####################
## 腳本結束 #####
#####################
需要說明的是,3Proxy的配置文件 3proxy.cfg,你可以加上執行許可權,直接就可以運行。這也是目前我在使用的 Squid + 3Proxy 構架,建議各位可以嘗試一下這個。
C Squid 配置
如果你可以使用Squid 3.1 ,那麼請選擇它,但是它的性能不如 Squid 2.7 可是多了一個特性,就是可以限速,這個在 Squid 2.7 上是沒有的,我使用的是 Squid 2.7 ,性能最好的一個版本。
我在這裡要說的是,使用squid的原因是為了更大的緩存,限速以及更好的根據IP和網域區分國內國外網站從而決定是否走國外代理。所以我摘要解釋一下配置,並提供一個配置下載連接。
由於我是squid 2.7 ,有些參數 squid 3.0+已經不再支持 比如 acl all src 0.0.0.0/0 ,這一條如果是在 squid 3.0中就會有問題,需要刪除,因為squid 3.0 已經默認 All 這個分組了。
首先是squid的密碼驗証,你可以設置也可以不設置,在我的配置文件中已經為你默認註解掉,但是都已經配置好,包括摘要驗証digest和基本驗証basic,還有 auth ttl 都已經設定好,需要的話,自己創建一個password文件然後就可以用了,password直接使用明文 plaint_txt 就可以,或者用httpd 一個password生成器(有web端,google 一下就OK)。
然後設定squid 引用我們在 B 中設定的代理,使用:
cache_peer 127.0.0.1 parent 8119 6000 no-query
其中 6000 是一個 icp 連線埠?反正沒什麼用,我也不知道。。。。
下面這一句,不用我說你也猜出作用了:
visible_hostname APN-Squid-Proxy-@bao3
http_port 3128
接下來是要求squid按規則區分國內國外路由的文件引用:
include /usr/local/etc/squid/gfw.squid
include /usr/local/etc/squid/proxyroute.squid
好吧,這兩個文件我也已經創建好了,在下載鏈接里,你去下載吧。接下來是告訴 Squid proxyroute 這個規則中的請求直接走國內的IP,而 gfw 這個規則中的網域則不允許直接走國內IP而是走國外IP。最後 never_direct allow all 是要求所有的未在proxyroute 這個規則中的請求都走國外IP上網。( Proxyroute 這個規則中全是IP地址,而且都是中國IP地址 )
always_direct allow proxyroute
never_direct allow gfw
never_direct allow all
#always_direct allow proxyroute
#never_direct allow proxyroute
#always_direct deny gfw
#always_direct allow all
###################################################################
Squdi 配置文件的最後一部分,是關於cache 參數的,我已經設定好但卻是依照我的系統進行的,所以你可以自由調整你的需要
文件 gfw.squid ,是存儲了絕大多數被國家GFWed了的網域,當一個新網域被封殺時,你可以手動在下面加入。而 proxyroute 則包含了中國所有的IP地址段,你可以定期到 https://code.google.com/p/chnroutes/
自己手動更新,但是請注意,默認生成的route.txt並不使用squid使用,需要使用vi/emacs/sed/awk 等等自己更正。
https://t.co/0ywZ57Ey Squid 配置資料夾下載(有用的文件只有 squid.conf gfw.squid proxyroute.squid ,其他的都臨時文件或者默認文件 )
最後,也許有人會問,為何你沒有提及加密的問題?手機APN 代理 設置好了,可是沒有加密怎麼辦?
我們平時提到加密,一般是口令驗証或者通信加密。口令驗証是傳遞迴伺服器,由squid完成,這個我在配置文件頭部已經寫好了,但口令驗証不能保證通信內容不被監視,這就需要通訊加密。
我們提到通訊加密,最熟悉的就是SSL證書方式,也有其他方式,但這些通訊加密方式都有一個共性----需要在客戶端(手機)和服務端(Squid)之間協調演算法並能加密和解密。但是我們的手機APN設置那裡顯然是無法設置解密或者加密方式,直接了當地說,APN Proxy 的設置處無法實現雙向通訊加密,如果非要實現,就需要藉助特定軟體來做到,因為軟體可以識別密鑰並能正確加密。
當然,以上是基於通信理論和自己實踐得出,也可能真的有 APN Proxy 可以在系統 APN 那裡設定加密套接字????
祝福各位~~~我反正是爽死了,每天都用著 HTTP Proxy 。
原文標題:簡易 APN Proxy (APN代理)的搭建 - 美博園
美博園文章均為「原創 - 首發」,請尊重辛勞撰寫,轉載請以上面完整鏈接註明來源!
軟體著作權歸原作者!個別轉載文,本站會註明為轉載。
網 友 留 言
1條評論 in “簡易 APN Proxy (APN代理)的搭建”這裡是你留言評論的地方

