時間過得真快,距離這個系列的上一篇文章《商業(yè)級4G代理搭建指南【準(zhǔn)備篇】》發(fā)布的時間已經(jīng)過了兩個星期了,上個星期由于各種瑣事纏身,周二開始就沒空寫文章了,所以就咕咕咕了。
那么在準(zhǔn)備篇中,我們了解了一下搭建 4G 代理所需要的軟硬件,也知道了各種選擇的優(yōu)劣勢?,F(xiàn)在,我們就可以開始實際搭建了,相信大家也是期待已久了。
基本思路
從這篇文章的標(biāo)題中我們可以看出,這一次的搭建方案主要用到的是 Docker,你可能會很好奇,Docker 跟搭建 4G 代理有什么關(guān)系嗎?
嗯,關(guān)系很大,我們把整件事情梳理一下,先來看看搭建 4G 代理時的基本流程:
*
調(diào)用網(wǎng)卡撥號,撥號成功后會創(chuàng)建一個虛擬網(wǎng)卡。(正常情況下使用這個虛擬網(wǎng)卡就能上網(wǎng)了)
*
在多網(wǎng)卡的情況下,重復(fù)第一步,會得到多個虛擬網(wǎng)卡。
*
啟動代理服務(wù)器,使其使用虛擬網(wǎng)卡作為出網(wǎng)網(wǎng)卡,并使用接入內(nèi)網(wǎng)的實體網(wǎng)卡作為入網(wǎng)網(wǎng)卡。
但是呢,有個問題,根據(jù)我之前的測試結(jié)果來看,目前在 Linux 環(huán)境下還沒有一個 HTTP
代理服務(wù)器是可以做到分別指定出網(wǎng)網(wǎng)卡和入網(wǎng)網(wǎng)卡的,嗯...這就很麻煩了,因為如果我們無法這么做的話,就會出現(xiàn)類似于下面這樣的問題:
* 出網(wǎng)和入網(wǎng)都在虛擬網(wǎng)卡上,使用代理服務(wù)器必須要走公網(wǎng)訪問。
* 入網(wǎng)為實體網(wǎng)卡,但出網(wǎng)被代理服務(wù)器鎖定為了某一個,無法利用到多網(wǎng)卡。
嗯...那么不用 HTTP 代理服務(wù)器,用那些經(jīng)常被用來做一些騷操作的 Socks5 代理服務(wù)器呢?如果可以指定網(wǎng)卡的話,再用像 Privoxy
之類的工具把 Socks5 代理轉(zhuǎn)成 HTTP 代理就好了。(某知名扶墻軟件的 Windows 版本就是這么轉(zhuǎn)的 HTTP 代理)
在經(jīng)過一番嘗試后,我發(fā)現(xiàn)雖然有些 Socks5
代理服務(wù)器的文檔中是說可以指定網(wǎng)卡,但按照說明操作后,似乎并不能直接做到我想要的效果(要么還是鎖定在某一個上面、要么上不了網(wǎng)),所以還是存在一些問題的。可能是需要配合路由表設(shè)置來進行操作吧,不過我對網(wǎng)絡(luò)工程的了解不怎么深,搞了幾天也沒搞出來,于是乎還得想想別的辦法。
這時候,我想到了一個東西——Docker,它可以用來解決這個問題!
因為 Docker
容器被創(chuàng)建后,不管外界的網(wǎng)卡有多少個,容器內(nèi)部的網(wǎng)卡都只會有一個Docker自己的虛擬網(wǎng)卡(容器間通信用的)和一個本地環(huán)回接口(不用管它),而且我們在容器內(nèi)進行撥號操作時,產(chǎn)生的那個新的虛擬網(wǎng)卡也不會影響到外界或其他容器,這樣的話,代理服務(wù)器就不需要指定網(wǎng)卡了,直接啟動就能跑!
那么現(xiàn)在整個流程就跑通了,進入實際操作環(huán)節(jié)看看吧!
系統(tǒng)方面
這個 Docker 版的搭建方式,系統(tǒng)方面的選擇很多,由于我使用的樣例設(shè)備是樹莓派,所以這里就選擇使用了 Raspbian(樹莓派專屬版
Debian)。如果你使用的是其他設(shè)備的話,直接選擇一個自己常用的系統(tǒng)就好。
那么準(zhǔn)備好之后的第一步當(dāng)然是先下載并安裝 Docker,這里我直接使用 Docker 官方提供的一鍵安裝腳本來進行安裝:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh #
出自官方文檔:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script
這個一鍵安裝腳本理論上來講所有 Linux 發(fā)行版都可以使用,畢竟已經(jīng)出來很長時間了,如果不行的話請自行使用搜索引擎查找相關(guān)資料。
裝好 Docker 之后,你有兩個選擇:
* 進入體驗?zāi)J?,了解一下具體操作細(xì)節(jié)是怎么樣的。
* 不看這一段,翻到本文最下方直接使用我寫好的輪子。
啟動容器
體驗的話,我們就直接這么啟動一個 Docker 容器吧,執(zhí)行以下命令:
sudo docker run -it --rm --privileged -p 3128:3128 ubuntu:18.04 bash
上面這條命令的意思是,啟動一個內(nèi)部系統(tǒng)為 Ubuntu18.04 的容器,并進入容器內(nèi)部的 Shell 執(zhí)行 bash 命令,如果退出 bash
就自動銷毀容器;然后映射容器內(nèi)的端口3128到外界,映射出來的外界端口也是3128;最后privileged 參數(shù)是開啟特權(quán)模式,用于將網(wǎng)卡設(shè)備映射進容器內(nèi)。
如果下載鏡像很慢的話,可以搜一下“Docker 加速器”,也可以直接扶墻。
測試一下網(wǎng)卡是否正常
進入容器內(nèi)部后,我們可以執(zhí)行一下 ls /dev/ttyUSB*
看一下網(wǎng)卡有沒有正常被識別出來(在容器外也是一樣的,因為開了特權(quán)模式),如果是和我買的同一款 4G 網(wǎng)卡的話,在只插入一張網(wǎng)卡的情況下你會看到4個
ttyUSB 設(shè)備。
不同 4G 網(wǎng)卡和硬件組合可能會有差異,請以實際情況為準(zhǔn)。
如果你可以看到4?4G網(wǎng)卡個數(shù)個 ttyUSB 設(shè)備的話,就說明沒有問題,可以開始下一步了。
撥號上網(wǎng)
接下來要做的就是撥號了,撥號方面可以選擇使用 Wvdial 這種工具,也可以選擇使用像 Fanconn 這樣的商家提供的撥號腳本(直接調(diào)用
PPPD),使用起來的效果會有一些區(qū)別。如果商家沒有提供撥號腳本的話,就用 Wvdial 吧,它能自動生成配置,上手即用。
我這邊的話,由于 Fanconn 的技術(shù)人員直接提供了個撥號腳本,那我就用這個腳本了,Wvdial
的文檔網(wǎng)上有很多很詳盡的,這里就不再多提,需要的朋友自行搜索即可。
如果你用的是 Fanconn 的這個撥號腳本(怎么弄進容器內(nèi)就不用我說了吧?),那么直接在 apt install ppp 安裝好撥號工具之后,用
chmod +x quectel-pppd.sh 給撥號腳本加個運行權(quán)限,然后 ./quectel-pppd.sh /dev/ttyUSB3 即可。
撥號時使用的 /dev/ttyUSB3 是指 4G 網(wǎng)卡的第四個通信端口,文檔中的解釋為:ttyUSB3→For PPP connections or AT
command communication,翻譯一下就是用于 PPP 連接或 AT 命令通信。
撥號之后用 ifconfig 之類的工具即可看到類似下圖中的狀態(tài):
可以看到,如前文所述,現(xiàn)在有三個網(wǎng)卡,一個是 Docker 自己的、一個是本地環(huán)回接口(這個不用管)、一個是撥號產(chǎn)生的虛擬網(wǎng)卡。
如果不是在 Docker 容器內(nèi)使用的話,還會有個 wwan0(或其他名字),那個是 4G 網(wǎng)卡本體。
測試是否能正常上網(wǎng)
現(xiàn)在如果你用 curl 的 --interface 參數(shù)指定虛擬網(wǎng)卡進行請求的話(如:curl --interface ppp0 https://ip.cn
),是已經(jīng)可以請求成功的了,IP 也會是你所使用的 SIM 卡對應(yīng)的運營商分配的。
由于 Docker 的鏡像通常都是極度精簡的,所以 Ubuntu 鏡像里并沒有預(yù)裝像 net-tools、iputils-ping、vim、curl
之類的這些包,需要自行安裝。所以如果你發(fā)現(xiàn) ifconfig、ping、curl、vim 用不了,不要驚慌,這是正?,F(xiàn)象,執(zhí)行apt install 包名
命令安裝即可。
如果你無法直接請求成功的話,就可能是 DNS 解析出問題了,可以嘗試 ping 一個公網(wǎng) IP(如:ping 1.1.1.1)和一個域名(如:ping
ip.cn),如果 IP 能 ping 通但域名會報 DNS 解析失敗的話,就可以確認(rèn)是 DNS 設(shè)置問題了。
4G 撥號時如果出現(xiàn) DNS 設(shè)置問題,通常是因為撥號工具沒有正常地將運營商返回的 DNS 服務(wù)器設(shè)置寫入到配置中,我們可以手動配置一下(你要強制指定某一個
DNS 也可以):
# 以下為阿里云的公共DNS echo 'nameserver 223.5.5.5' >> /etc/resolv.conf echo
'nameserver 223.6.6.6' >> /etc/resolv.conf
在 Docker 容器中,這個 /etc/resolv.conf
文件可能還會有兩條內(nèi)容,是容器本身所需要的,建議不要刪除/覆蓋,否則會出現(xiàn)容器間無法使用容器名互相通信的情況。
啟動代理服務(wù)器
那么在測試撥號后確實可以通過 4G 網(wǎng)卡上網(wǎng)了之后,我們就可以把代理服務(wù)器啟動了,這里我使用的是 TinyProxy。
測試發(fā)現(xiàn),Squid 對資源的占用更大一些,不利于多網(wǎng)卡情況下的使用,會影響到 4G 網(wǎng)卡的數(shù)量上限。
先 apt install tinyproxy 一波,然后 vim /etc/tinyproxy/tinyproxy.conf 修改一下配置。
要修改的配置主要有:
* Port 配置項改為3128,因為我們前面映射出來的端口是3128。
* Listen 配置項改為0.0.0.0,因為我們需要在其他設(shè)備上使用這個代理服務(wù)器。
* Allow 配置項注釋掉或改為0.0.0.0/0,默認(rèn)的127.0.0.1會導(dǎo)致其他設(shè)備無法訪問。
改完之后保存一波,然后就可以直接執(zhí)行 tinyproxy 啟動了...嗎?
等等,還有一個操作要做!那就是將默認(rèn)路由指向到虛擬網(wǎng)卡上,很簡單,執(zhí)行以下命令即可:
route del -net 0.0.0.0 eth0 route add -net 0.0.0.0 ppp0
這兩條命令的意思是:先將默認(rèn)的、指向 eth0 這個網(wǎng)卡的上網(wǎng)路由刪除,然后添加一個同樣的、指向 ppp0 這個網(wǎng)卡的路由。
改完默認(rèn)路由后的效果就是,即使你不使用 curl 的 --interface 參數(shù),也能直接使用 4G 網(wǎng)卡上網(wǎng)了。
如果沒有改默認(rèn)路由的話,在不指定網(wǎng)卡的情況下,4G 網(wǎng)卡并不會被使用到,因為默認(rèn)路由指向的是 Docker
自身的虛擬網(wǎng)卡,那個網(wǎng)卡通向你原本的內(nèi)網(wǎng)環(huán)境。也就是說,IP 不會變!
那么現(xiàn)在,你可以執(zhí)行 tinyproxy 啟動代理服務(wù)器了。
測試代理服務(wù)器
好了,代理服務(wù)器應(yīng)該已經(jīng)正常啟動了,現(xiàn)在我們可以在另一個設(shè)備上嘗試連接那個容器中的代理服務(wù)器,看看是否能正常通過它使用 4G 網(wǎng)卡上網(wǎng)。
例如我這里樹莓派分配到的IP是:192.168.137.66,那么我就可以用這樣的 curl 命令或 Python 代碼進行測試:
curl:
curl "https://ip.cn" curl -x "192.168.137.66:3128" "https://ip.cn"
Python:
import requests resp = requests.get("https://ip.cn", proxies={"https":
"http://192.168.137.66:3128"}) no_proxy_resp = requests.get("https://ip.cn")
print(resp.text) print(no_proxy_resp.text)
測試出來的結(jié)果應(yīng)該與前面在容器內(nèi)部測試時的一致,在使用代理后 IP 就變成了運營商分配的基站 IP。
更換 IP
那么最核心的問題來了,怎么更換 IP 呢?
其實和使用那些撥號 VPS 架設(shè)代理服務(wù)器一樣,我們只需要重新?lián)軅€號就能換 IP 了,直接 kill 掉 pppd
進程就可以讓它斷開撥號,斷開后重新執(zhí)行一遍撥號腳本就是重新?lián)芴柫恕?br>
斷開撥號方面 Fanconn 的技術(shù)人員也提供了一個腳本,同樣在 chmod +x quectel-ppp-kill 賦予運行權(quán)限之后,執(zhí)行
./quectel-ppp-kill 就可以了。
但需要注意的是,蜂窩網(wǎng)絡(luò)的撥號在斷開后,IP 仍然會保留一段時間(具體多久不清楚,可能跟連接的基站也有關(guān)系),所以我們需要強制性地讓網(wǎng)卡重新搜網(wǎng)。
冷門小知識:手機上開啟關(guān)閉飛行模式的效果就是重新搜網(wǎng),通常只是關(guān)閉“移動數(shù)據(jù)”的話,效果是與斷開撥號一致的。
怎么做呢?很簡單,就兩行命令:
AT+CFUN=0 AT+CFUN=1
但注意哦,這是 AT 命令,不是 Linux 下的 Shell 命令,AT 命令是一種調(diào)制解調(diào)器命令語言,我們?nèi)绻枰獙⑺鼒?zhí)行起來,需要這么做:
echo "AT+CFUN=0" > /dev/ttyUSB2 # 中間間隔1秒左右 echo "AT+CFUN=1" > /dev/ttyUSB2
這里使用的 /dev/ttyUSB2 是指 4G 網(wǎng)卡的第三個通信端口,文檔中的解釋為:ttyUSB2→For AT command
communication,與第四個通信端口類似,只是它不能用于 PPP 連接、只能用于 AT 命令通信而已。
不同樣使用第四個通信端口的原因是那個端口有被占用的可能性,直接區(qū)分開最穩(wěn)妥,本來網(wǎng)卡也就是提供了兩個 AT 命令通信渠道的。
在使網(wǎng)卡重新搜網(wǎng)后的幾秒至十幾/幾十秒內(nèi)的時間里,你無法正常撥號,需要等待它初始化完成后才可以撥號成功,具體等待時間以信號強度為準(zhǔn),我測試的時候通常5秒以內(nèi)就可以了。
所以如果你在斷開后一直撥號失敗,不妨過一會兒再試。
總結(jié)
那么現(xiàn)在操作流程也跑通了,我們也了解到了整個的內(nèi)部細(xì)節(jié),最后要做的就是把每個網(wǎng)卡都分別分配一個容器,這樣我們就能實現(xiàn)文章開頭所提到的——“使用虛擬網(wǎng)卡作為出網(wǎng)網(wǎng)卡,并使用接入內(nèi)網(wǎng)的實體網(wǎng)卡作為入網(wǎng)網(wǎng)卡”的效果了。
實際操作起來的話,就是把指定網(wǎng)卡的部分給配置化,然后在啟動容器的時候傳入就好了,使用 Docker 的容器環(huán)境變量相關(guān)設(shè)置可以很輕松地實現(xiàn)這個功能。
最后,我們可以以這個思路,構(gòu)建一個 docker-compose 模板,模板的核心內(nèi)容一是做個簡易的4G網(wǎng)卡容器集群,二是啟動個
Squid,用來聚合代理服務(wù)器,這樣我們使用的時候只需要指定一個代理服務(wù)器就能隨機更換了,操作起來更加方便。
好了,上面就是 Docker
版搭建方式的思路和整個的搭建流程,如果你懶得看的話,直接用我寫好的輪子也是可以的,只需要發(fā)送消息【Docker版4G代理】到公眾號【NightTeam】即可。
評價
最后的最后,我給這個搭建方式打個評價吧。
這個搭建方式并不完美,因為變量太多,而且很多地方肯定不如系統(tǒng)級原生支持的那么穩(wěn)定,長期使用可能會出現(xiàn)各種奇奇怪怪的問題。
然后 Docker 的資源占用其實挺高的,會浪費相當(dāng)多的內(nèi)存在啟動容器上,如果只是兩三個網(wǎng)卡還好,如果數(shù)量大一點的話,像樹莓派2B
這種小內(nèi)存的設(shè)備根本就扛不住。
另外代理服務(wù)器本身對資源的消耗也是比較高的,高頻調(diào)用下對樹莓派2B 的小 CPU 壓力還是蠻大的,即使我對它的 CPU
進行了超頻,在并發(fā)測試時也還是會出現(xiàn)輕松打滿 CPU 的情況。
但是!截止目前,我還有兩種基于路由器系統(tǒng)的搭建方案沒寫出來!所以...敬請期待后續(xù)的其他搭建方案(斜眼笑)。
文章作者:「夜幕團隊 NightTeam」 - Loco
夜幕團隊成立于 2019 年,團隊包括崔慶才、周子淇、陳祥安、唐軼飛、馮威、蔡晉、戴煌金、張冶青和韋世東。
涉獵的編程語言包括但不限于 Python、Rust、C++、Go,領(lǐng)域涵蓋爬蟲、深度學(xué)習(xí)、服務(wù)研發(fā)、對象存儲等。團隊非正亦非邪,只做認(rèn)為對的事情,請大家小心。
熱門工具 換一換