VPS自搭建Ngrok內(nèi)網(wǎng)穿透服務(wù)

原文鏈接: http://yangbingdong.com/2017/self-hosted-build-ngrok-server/

前言

Ngrok可以干嘛?我們經(jīng)常會(huì)有 "把本機(jī)開發(fā)中的 web 項(xiàng)目給朋友看一下" 或 "測(cè)試一下支付寶、微信的支付功能" 這種臨時(shí)需求,為此專門購(gòu)買個(gè)域名然后在 VPS或云主機(jī) 上部署一遍就有點(diǎn)太浪費(fèi)了。那么這時(shí)候嫌吠,Ngrok就是個(gè)很好的東西,它可以實(shí)現(xiàn)我們的這種需求。而且 Ngrok 官網(wǎng)本身還提供了公共服務(wù)筷转,只需要注冊(cè)一個(gè)帳號(hào),運(yùn)行它的客戶端悬而,就可以快速把內(nèi)網(wǎng)映射出去呜舒。不過(guò)這么好的服務(wù),沒(méi)多久就被了~幸好Ngrok是開源的笨奠,那么我們可以自己搭建一個(gè)Ngrok袭蝗!

域名泛解析

因?yàn)閮?nèi)網(wǎng)穿透需要用到多級(jí)域名唤殴,這里,博主的這個(gè)域名是在Namesilo購(gòu)買的到腥,然后轉(zhuǎn)到DNSPod解析:


如圖所示朵逝,我搞買的域名是yangbingdong.com,將ngrok.yangbingdong.com通過(guò)A記錄解析導(dǎo)VPS的ip地址,再將*.ngrok.yangbingdong.com通過(guò)CNAME解析導(dǎo)ngrok.yangbingdong.com乡范,完成泛解析配名。

服務(wù)端安裝

安裝GO環(huán)境

這里博主選擇通過(guò)下載最新版解壓安裝。

apt-get update
apt-get -y install build-essential mercurial git
wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.8.1.linux-amd64.tar.gz
mkdir $HOME/go
echo 'export GOROOT=/usr/local/go' >> /etc/profile.d/go.sh
echo 'export GOPATH=$HOME/go' >> /etc/profile.d/go.sh
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> /etc/profile.d/go.sh
source /etc/profile.d/go.sh

安裝Ngrok

cd /usr/local/src/
git clone https://github.com/tutumcloud/ngrok.git ngrok
export GOPATH=/usr/local/src/ngrok/

生成自簽名SSL證書晋辆,ngrok為ssl加密連接:

cd ngrok
NGROK_DOMAIN="ngrok.yangbingdong.com"
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt 
cp device.key assets/server/tls/snakeoil.key
GOOS=linux GOARCH=amd64
make clean
make release-server release-client

注意:上面的ngrok.yangbingdong.com換成自己的域名渠脉。

  • 如果是32位系統(tǒng),GOARCH=386; 如果是64為系統(tǒng),GOARCH=amd64
  • 如果要編譯linux,GOOS=linux;如果要編譯window,GOOS=windows

啟動(dòng)server

cd /usr/local/src/ngrok/bin && ./ngrokd -domain="ngrok.yangbingdong.com" -httpAddr=":8002" -httpsAddr=":8003" -tunnelAddr=":4000"

ngrok.yangbingdong.com換成自己的域名瓶佳。其他端口可自己配置芋膘。
順利的話,可以正常編譯涩哟,在bin下面可以看到「ngrokd」和「ngrok」索赏,其中「ngrokd」是服務(wù)端執(zhí)行程序,「ngrok」是客戶端執(zhí)行程序

后臺(tái)運(yùn)行:

cd /usr/local/src/ngrok/bin && nohup ./ngrokd -domain="ngrok.yangbingdong.com" -httpAddr=":8002" -httpsAddr=":8003" -tunnelAddr=":4000"  > /dev/null 2>&1 &
apt-get install screen
screen -S 任意名字(例如:keepngork)
然后運(yùn)行ngrok啟動(dòng)命令
最后按快捷鍵
ctrl+A+D
既可以保持ngrok后臺(tái)運(yùn)行

設(shè)置開機(jī)啟動(dòng)

vim /etc/init.d/ngrok_start:
cd /usr/local/src/ngrok/bin
./ngrokd -domain="ngrok.yangbingdong.com" -httpAddr=":8002" -httpsAddr=":8003" -tunnelAddr=":4000"

chmod 755 /etc/init.d/ngrok_start

客戶端使用

下載客戶端

scp -P 26850 root@12.34.56.78:/usr/local/src/ngrok/bin/ngrok ~/

12.34.56.78換成自己的VPS ip贴彼。

啟動(dòng)客戶端

寫一個(gè)簡(jiǎn)單的配置文件潜腻,隨意命名如 ngrok.cfg:

server_addr: ngrok.yangbingdong.com:4000
trust_host_root_certs: false

然后啟動(dòng):

./ngrok -subdomain ybd -config=ngrok.cfg 8080

其中ybd是自定義的域名前綴,ngrok.cfg是上面創(chuàng)建的配置文件器仗,8080是本地需要映射到外網(wǎng)的端口融涣。
沒(méi)有意外的話訪問(wèn)ybd.ngrok.yangbingdong.com:8002就會(huì)映射到本機(jī)的8080端口了。

控制臺(tái):

就是上圖的Web Interface精钮,通過(guò)這個(gè)界面可以看到遠(yuǎn)端轉(zhuǎn)發(fā)過(guò)來(lái)的 http 詳情威鹿,包括完整的 request/response 信息,相當(dāng)于附帶了一個(gè)抓包工具轨香。

另外忽你,Ngrok支持多種協(xié)議,啟動(dòng)的時(shí)候可以指定通過(guò)-proto指定協(xié)議臂容,例如:

http協(xié)議

./ngrok -subdomain ybd -config=ngrok.cfg -proto=http 8080

tcp協(xié)議

./ngrok -subdomain ybd -config=ngrok.cfg -proto=tcp 8080

應(yīng)該會(huì)看到:

ngrok                                               (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    tcp://ybd.ngrok.yangbingdong.com:8002-> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

Nginx添加server

雖然可以訪問(wèn)科雳,但是帶著端口就讓人不舒服,80端口又被Nginx占用脓杉,那么可以用過(guò)Nginx反向代理Ngrok糟秘。
Nginx的配置一般在/etc/nginx/conf.d或者/usr/local/nginx/conf.d里面:

#ngrok.yangbingdong.com.conf
upstream ngrok {
    server 127.0.0.1:8002;
    keepalive 64;
}

server {
    listen 80;
    server_name *.ngrok.yangbingdong.com;
    access_log /var/log/nginx/ngrok_access.log;
    proxy_set_header "Host" $host:8002;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:8002;
        proxy_pass_header Server;
        proxy_redirect off;
        proxy_pass  http://ngrok;

    }
    access_log off;
    log_not_found off;
}

重啟Nginx:

nginx -s reload 

維護(hù)腳本

在網(wǎng)上看到的某大神寫的維護(hù)腳本:

wget https://gist.githubusercontent.com/IvanChou/1be8b15b1b41bf0ce2e9d939866bbfec/raw/1a2445599fe7fd706505a6e103a9dc60b4d3a0ed/ngrokd -O ngrokd

##修改 腳本中的配置
vi ngrokd

chomd +x ngrokd
sudo mv ngrokd /etc/init.d/ngrokd

常見(jiàn)錯(cuò)誤

在ngrok目錄下執(zhí)行如下命令,編譯ngrokd

$ make release-server

出現(xiàn)如下錯(cuò)誤:
GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/client/assets/assets_release.go \
        assets/client/…
make: bin/go-bindata: Command not found
make: *** [client-assets] Error 127
go-bindata被安裝到了$GOBIN下了球散,go編譯器找不到了尿赚。修正方法是將$GOBIN/go-bindata拷貝到當(dāng)前ngrok/bin下。

$cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin

遇到的問(wèn)題:source與./

寫了一個(gè)Ngrok的安裝腳本,然后chmod +x ngrok-installation.sh賦權(quán)凌净,再./ngrok-installation.sh執(zhí)行悲龟。
但是遇到了一個(gè)奇怪的問(wèn)題:在腳本里面設(shè)置了環(huán)境變量并source讓其生效,然而出現(xiàn)的結(jié)果是由于沒(méi)有加載到環(huán)境變量導(dǎo)致找不到命令泻蚊,百思不得解躲舌,Google了一把丑婿,發(fā)現(xiàn)了原因:

source命令與shell scripts的區(qū)別是:
我們?cè)趖est.sh設(shè)置了AA環(huán)境變量性雄,它只在fork出來(lái)的這個(gè)子shell中生效,子shell只能繼承父shell的環(huán)境變量羹奉,而不能修改父shell的環(huán)境變量秒旋,所以test.sh結(jié)束后,父進(jìn)程的環(huán)境就覆蓋回去诀拭。
source在當(dāng)前bash環(huán)境下執(zhí)行命令迁筛,而scripts是啟動(dòng)一個(gè)子shell來(lái)執(zhí)行命令。這樣如果把設(shè)置環(huán)境變量(或alias等等)的命令寫進(jìn)scripts中耕挨,就只會(huì)影響子shell,無(wú)法改變當(dāng)前的BASH,所以通過(guò)文件(命令列)設(shè)置環(huán)境變量時(shí)细卧,要用source 命令。

然后直接source ngrok-installation.sh筒占,安裝成功贪庙!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翰苫,隨后出現(xiàn)的幾起案子止邮,更是在濱河造成了極大的恐慌,老刑警劉巖奏窑,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导披,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡埃唯,警方通過(guò)查閱死者的電腦和手機(jī)撩匕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)墨叛,“玉大人止毕,你說(shuō)我怎么就攤上這事∥∈担” “怎么了滓技?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棚潦。 經(jīng)常有香客問(wèn)我令漂,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任叠必,我火速辦了婚禮荚孵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纬朝。我一直安慰自己收叶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布共苛。 她就那樣靜靜地躺著判没,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隅茎。 梳的紋絲不亂的頭發(fā)上澄峰,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辟犀,去河邊找鬼俏竞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堂竟,可吹牛的內(nèi)容都是我干的魂毁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼出嘹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼席楚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疚漆,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酣胀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后娶聘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闻镶,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年丸升,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铆农。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狡耻,死狀恐怖墩剖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夷狰,我是刑警寧澤岭皂,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站沼头,受9級(jí)特大地震影響爷绘,放射性物質(zhì)發(fā)生泄漏书劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一土至、第九天 我趴在偏房一處隱蔽的房頂上張望购对。 院中可真熱鬧,春花似錦陶因、人聲如沸骡苞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)解幽。三九已至,卻和暖如春毅否,著一層夾襖步出監(jiān)牢的瞬間亚铁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工螟加, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吞琐。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓捆探,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親站粟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黍图,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容