搭建增強型代理伺服器(APN Proxy)
本文轉載自莓玩沒了搭建增強型代理伺服器(APN Proxy),是上一篇簡易 APN Proxy (APN代理)的搭建的進階篇。美博園沒有測試,用過的朋友請反饋。
我在上一篇博文中已經寫了如何搭建簡單APN代理,這一個月中我一直在測試(苦逼的IT男,別人過年帶老婆回家,我是帶著ipad+SSH 在家測試),於是推翻掉上一篇文章中的方案,使用本文的方案。
本篇原理與上一篇相仿,不同的實現則是使用 Ziproxy+Privoxy(上一篇是使用Squid+Privox/3Proxy/polipo),我的系統是 FreeBSD 8.2-Release ,你可以選用你喜歡的Unix-Like主機。使用Squdi實現的好處是在訪問時可以有緩存:由於讓PC(或者手持設備---以下統稱裝置)加快網速, 以抵消由於使用代理帶來的網速慢,因此比使用VPN絕對是要快多了。
本文假定你有兩台主機,國內主機使用SSH連接到國外主機,事實上如果你只有一台國外主機,則可以直接使用Ziproxy而無需Privoxy,但是請務 必注意,在只有一台國外主機的情況下,請將Ziproxy的連線埠改成一組特殊連線埠,抱歉,不能直說是哪幾個連線埠,但是聰明的你應該可以猜到,實在不想猜, 就直接到twitter上問吧
我想多數人在裝置應該使用過Opera瀏覽器,當我們打開一個網頁的時候,Opera用自己的OperaTurbo技術加速打開,實際上大家也發現了,用 它打開網頁後圖像變的模糊了,這是因為被伺服器壓縮過。而我們今天使用的這個方案就是採用壓縮方式來達到節約流量和提高網速。
Ziproxy的主要作用是壓縮HTTP請求和優化精簡圖片,它可以把JS,CSS,HTML和JPEG,PNG,GIF都壓縮,然後再傳遞給你的裝置使 用,更好玩的是,它還可以區分用戶,比如你想給手機用戶使用代理,那麼創建一個針對手機的配置,把圖片壓縮的重一點;而想把代理給ipad或者電腦用,就 創建一個針對電腦的配置,把圖片壓縮的輕一點;兩個配置的連線埠只要不同就OK了。
Privoxy在這個方案中有兩個作用:1 將SSH的 socks5 代理轉化為HTTP代理然後給ziproxy使用 ,這是因為 Ziproxy只支持http的父代理。2 區分網站。Privoxy會將被 某國家 屏蔽的網站轉發到SSH 代理上,而將沒有屏蔽的直接走你的國內主機線路。
方案開始實施:
1 建立到國外主機的連接( SSH -D)
我是使用autossh的,建立你也使用這個工具,它會監視你的ssh連接,在斷線時可以自動重連接,不過你可以自己動手寫腳本
我的SSH 連接在本地開的連線埠是 7070 ,這個是大家現在的標配了,不多說。
2 安裝和配置Privoxy
freebsd上可以用ports安裝也可以直接pkg_add -r ;其他系統也一樣有自己的方式安裝,Unix-Like中似乎只有Mac有點區別,幸好不會有人用Mac server做這個方案。 😀
這裡著重說一下配置
Privoxy的配置文件默認是config ,我的位置是在 freebsd 的 /usr/local/etc/privoxy/
配置文件很短,我們要修改一下
ota# cat /usr/local/etc/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
#actionsfile block.action
actionsfile GFW.action
filterfile default.filter
#filterfile user.filter
logfile logfile
hostname www.test.me
#forward-socks5 / 127.0.0.1:7070 .
listen-address 127.0.0.1:8116
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
諸位請注意以上代碼中黑底紫字部分,是我們的關鍵,其他欄位都是是否開關一些功能和是不是支持廣告過濾和屏蔽惡意網站。在紫色字體中,我故意註解掉了 forward-socks5的代理轉發功能,這個意圖是希望Privoxy默認不轉發到SSH,即默認情況下讓Privoxy直接走國內IP。可是我們 想讓一些特殊網站走國外IP,這就是紫色字體中的 actionsfile gfw.action 這裡指定。
gfw.action 是一個專門收集一些特殊網站的文件並在些文件中規定了這些網站走SSH -D 的代理(連線埠是7070).這個文件起先我是自己寫的,一個一個加上去,後來直接用正則過濾了autoproxy2pac中的URL,後來我發現一個更好 玩的,你可以直接在這裡下載gfw.action這個文件,傳送門-> 愛我就摸我一下.。
從以上網站下載的gfw.action文件還不能被我們直接使用,原作者已經提到,需要我們將其中的代理連線埠改成自己的,我是直接用
sed -i 's/7127/7070/' /usr/local/etc/privoxy/gfw.action
你可以使用vi打開來改第一行(註:FreeBSD 上sed不能使用這條語句需要安裝GNU Sed,即gsed方可)。
經過這一步,Privoxy將會默認直接走國內路由,訪問特殊網站時則會自動選擇SSH代理,達到了區分網站的目的,接下來我們就可以實現將訪問流量進行壓縮的操作
3 Ziproxy 配置
安裝好Ziproxy,Debian/Ubuntu都有源可以直接裝。而Ziproxy的配置,在我的 FreeBSD 上存在於 /usr/local/etc/ziproxy/ 下 (這也是FreeBSD一個優點,所有第三方都放在這個位置),cp ziproxy.conf.sample ziproxy.conf ,使用默認配置。
默認配置當然不合我們的要求,修改以下參數:
1 Port = 6060
這是指Ziproxy 的監聽連線埠,這個連線埠將來用來給你的其他裝置用
2 #Address = "127.0.0.1"
這個是指將Ziproxy的代理綁定到你主機的哪個IP上(如果有多個的話),默認是綁定到所有的IP上,但需要注意一下是否是這樣,免得手機連接不上代理卻是因這個,那就是笑話了。
3 #OnlyFrom = "127.0.0.1"
這個是訪問限制,可以限制哪些IP可以訪問你的代理(APN Proxy),我是允許所有人訪問,但這極不安全,可以使用SASL認證,目前我還在研究中。。。。
4 # MaxActiveUserConnections = 20
這是用來限制一個用戶可以產生多少條連接,默認是不限制,但這樣就可能被人用來下載迅雷等等,你可以加上限制
5 NextProxy="127.0.0.1"
下一跳代理,也就是父級代理。我們的手機連通過 Port=6060連線埠連接到你的這台主機後,ziproxy會把連接直接丟給 127.0.0.1的下一個代理(也就是我們的Privoxy)
6 NextPort=8116
下一跳代理的連線埠,我設定的是8116。
7 ConventionalProxy = true
這一項沒什麼好說,一定要是true,我人為改為false就失敗了。
4 掃尾
[你沒有必要看這裡,因為做完前3步你的伺服器就已經完全可以運行了]
大家可以跳過一步,之所以加上,是因為我自己有兩個海外的SSH 主機,防止一個斷掉也或者用於網路質量不好的時候切換線路。於是自己寫了一段腳本,這段腳本只能運行在FreeBSD下,因為裡面有幾個命令其他系統沒有,不過都有替代命令。
腳本的目的是監視兩個SSH生成的連線埠7070和8080,如果其中一個斷掉了(比如SSH 7070),就自動強制Privoxy使用另一個(SSH 8080),並且嘗試立刻重新連接(SSH 7070)。這樣在APN Proxy就可以盡量不受影響。下面是腳本
#!/bin/sh
export AUTOSSH_PIDFILE=/var/run/autossh.pid
while :
do
sshport=`sockstat -4l | grep :8080 | awk '{print $3}'`
sshpid=$( sockstat -4l | grep autossh | grep 9101 | awk '{print $3}' )
pidfile=`cat /var/run/autossh.pid`
privoxypid=`cat /var/run/privoxy/privoxy.pid`
if [ -z "$sshport" -o -z "$sshpid" ]; then
kill -9 $sshpid
kill -9 $sshport
/usr/local/bin/autossh -M 9100 -f -q -N -D 8080 root@206.253.165.50
/usr/local/bin/gsed -i 's/8080/7070/' /usr/local/etc/privoxy/gfw.action&&kill -HUP $privoxypid
#echo Now Start AutoSSH@PID `cat $pidfile`
fi
ssh1port=`sockstat -4l | grep :7070 | awk '{print $3}'`
ssh1pid=$( sockstat -4l | grep autossh | grep 9001 | awk '{print $3}' )
if [ -z "$ssh1port" -o -z "$ssh1pid" ]; then
kill -9 $ssh1port
kill -9 $ssh1pid
/usr/local/bin/autossh -M 9000 -f -q -N -D 7070 root@216.231.135.225
/usr/local/bin/gsed -i 's/7070/8080/' /usr/local/etc/privoxy/gfw.action&& kill -HUP $privoxypid
fi
sleep 10
done
這段代碼已經穩定運行了20天了,我現在隨便重啟一台海外的主機,這腳本都可以自動切換到另一台,很是舒服。這屬於額外設置,你可以不必理會。
經過以上設置,你的APN 代理算是初步弄好了,還記得我前面提到的可以創建不同的ziproxy來區分不同用戶嗎,那你就可以分享給別人了。但是需要注意的是,儘管這種方式不會被 RST重置,但是仍然不可能脫離有關部門的監管。並且如果他人分享APN 代理給你用,你也需要注意,這是不加密的,你的信息被會輕易獲取,所以最好是跟自己的鐵哥們合著用或者直接自己使用
最後寫完的時候看到網上有這麼一文章,與我的思路一致,不同之處在於,將SSH 方式使用openvpn,這樣不必使用privoxy了;區分代理走國內還是走國外也是由openvpn實現,而我是使用privoxy。這思路也不錯, 用我的方案可以壓縮+過濾,用他的,則應該沒有這功能,大家可以參考這裡:
https://ayanamist.tumblr.com/post/16227815835/apn-proxy
有人只有一台海外主機,那你幸福了,所有都不需要做,直接安裝ziproxy,然後默認設置情況下改一下Port為特殊連線埠就可以直接代理了,區別只在於沒有了廣告過濾和路由區分,不過如果是在電腦上或者使用ios,則可以用 autoproxy2pac來達到自動路由。
原文標題:搭建增強型代理伺服器(APN Proxy) - 美博園
美博園文章均為「原創 - 首發」,請尊重辛勞撰寫,轉載請以上面完整鏈接註明來源!
軟體著作權歸原作者!個別轉載文,本站會註明為轉載。
網 友 留 言
7條評論 in “搭建增強型代理伺服器(APN Proxy)”這裡是你留言評論的地方
我只有海外主機,只安裝了ziproxy,將etc下的資料夾都cp到/etc下了,如何啟動啊?
@William LU:
對不起,這個沒有測試過,改天測試一下。剛剛看到裡面的代碼都連在一起了,等下修改一下程序。謝謝反饋。