ngrok實現(xiàn)內網(wǎng)穿透坏快,讓家里的筆記本也能做服務器

背景

家里淘汰了一臺筆記本,windows系統(tǒng)裝起來很卡憎夷,于是裝了個linux系統(tǒng)莽鸿。這臺筆記本有2G內存,奔騰雙核處理器拾给,配置比我在阿里云上買的ECS高多了富拗,于是想著給它利用起來。研究了一下鸣戴,發(fā)現(xiàn)ngrok內網(wǎng)穿透能實現(xiàn)這個功能啃沪,剛好我也有外網(wǎng)服務器和域名,那就直接開干窄锅。

安裝gcc创千、git和go語言

yum install gcc -y  
yum install git -y
yum install golang -y

源碼編譯

下載源碼

此處從git下載缰雇,選擇的是tutumcloud修改過的源碼,解決了部分包無法獲取的問題追驴。也可以在window下下載zip包械哟,然后再上傳至服務器,解壓即可殿雪。

git clone https://github.com/tutumcloud/ngrok.git ngrok

生成自簽名證書

我們采用自己的服務器自建ngrokd服務暇咆,需要生成自己的自簽名證書,并用該證書編譯一個ngrok客戶端丙曙。
生成證書需要配置一個環(huán)境變量NGROK_BASE_DOMAIN爸业,直接在命令行里定義即可,這個域名是一個基礎域名亏镰,后面ngrok提供http服務的時候扯旷,可以在這個域名前面再加前綴。以ngrok.com的官方服務為例索抓,它提供的服務地址為xxx.ngrok.com钧忽,那么它這個NGROK_BASE_DOMAIN變量就為,“ngrok.com”逼肯。此處耸黑,我用自己的二級域名“ngrok.shawnan.xyz”,后續(xù)提供http服務時篮幢,域名為“xxx.ngrok.shawnan.xyz”大刊。
生成簽名的代碼如下,在ngrok目錄執(zhí)行洲拇。

cd ngrok
NGROK_DOMAIN="ngrok.shawnan.xyz"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

替換證書

生成完成后需要替換證書奈揍,就在當前目錄把編譯要用到的證書替換掉曲尸。

cp base.pem assets/client/tls/ngrokroot.crt

編譯

編譯赋续,編譯一個服務端和一個客戶端,如果是在window下使用另患,就編譯windows的客戶端纽乱。

make release-server release-client

// 編譯windows客戶端
GOOS=windows GOARCH=amd64 make release-client  

編譯后會在bin目錄下生成ngrokd和ngrok文件,ngrokd和ngrok文件分別是ngrok的服務端程序和linux平臺下的客戶端程序昆箕。如果編譯了windows客戶端鸦列,則會生成一個ngrok.exe,是windows下的客戶端程序鹏倘。
到此處編譯工作就完成了薯嗤,下面開始啟動服務。

啟動服務

準備工作

準備工作之一就是首先要確定幾個端口纤泵,分別是ngrok用來轉發(fā)http骆姐、https服務的端口,還有轉發(fā)ssh、ftp等服務的端口玻褪,此處我用到了3個肉渴,分別是http的8088、https的8443带射、ssh的8022同规。此處要記得在linux的防火墻開啟這幾個端口,如果是云服務器窟社,則要配置相應的規(guī)則券勺,否則外網(wǎng)的設備如何也連不進你部署的ngrokd服務。
我們可以在windows下采用telnet命令測試服務器的端口是否已經(jīng)打開:

telnet xx.xx.xxx.xx 222
// 如果返回類似“SSH-2.0-OpenSSH_7.4”的結果桥爽,則222端口就打開了朱灿,如果一直是connecting,則該端口就沒打開

此處假設端口已經(jīng)可用了钠四,下面開始啟動ngrok服務盗扒。

啟動ngrokd服務

通過命令行啟動ngrokd服務很簡單,只需要配置幾個參數(shù)即可缀去,httpAddr侣灶、httpsAddr分別是ngrok用來轉發(fā)http、https服務的端口缕碎,可以自由配置褥影,domain就是你的外網(wǎng)域名。ngrokd 還會開一個4443 端口用來跟客戶端通訊咏雌,這個端口也可通過 -tunnelAddr=”:xxx” 指定凡怎。

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ngrok.shawnan.xyz" -httpAddr=":8088" -httpsAddr=":8443"

nginx映射

服務端啟動完畢之后,還要配置nginx代理赊抖。在服務器上面的nginx的配置文件里面增加如下一段:

server {
    listen 80;
    server_name ngrok.shawnan.xyz *.ngrok.shawnan.xyz;

    location / {
        proxy_pass http://127.0.0.1:8088;
        proxy_redirect off;
        proxy_set_header Host $http_host:8088;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_connect_timeout 90;
        proxy_send_timeout 120;
        proxy_read_timeout 120;
    }
}

此處就把ngrok.shawnan.xyz和*.ngrok.shawnan.xyz上的請求都轉發(fā)到了8088上统倒,實現(xiàn)客戶端可以通過xxx.ngrok.shawnan.xyz域名訪問。

啟動客戶端

http服務

linux在ngrok文件(windows在ngrok.exe)的同級目錄新建配置文件氛雪,ngrok.config房匆,輸入以下內容(域名改成自己的):

server_addr: "ngrok.shawnan.xyz:4443"  
trust_host_root_certs: false  

然后利用以下命令啟動:

ngrok -config=ngrok.config -subdomain=local 8080

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://local.ngrok.shawnan.xyz:8888 -> 127.0.0.1:8080
Forwarding                    https://local.ngrok.shawnan.xyz:8888 -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

啟動后如果正常連接,Tunnel Status會顯示online报亩,這樣就把local.ngrok.shawnan.xyz映射到了你本地的8080端口浴鸿。
如果連接不上會顯示connecting,超時之后還會顯示reconnecting弦追。

tcp服務

除了http服務岳链,ngrok還可以對tcp服務進行轉發(fā),這樣我們就可以通過轉發(fā)22端口利用SSH把局域網(wǎng)內的linux服務器共享到局域網(wǎng)外面去遠程連接了劲件。
比如把本機的22端口轉發(fā)到外網(wǎng)掸哑,還是使用剛才的配置文件左胞,使用如下命令:

ngrok -config=ngrok.config -proto=tcp 22

如果配置文件里面沒有配置端口,ngrok會隨機選擇一個端口進行tcp轉發(fā)举户。比如將本地的22端口轉發(fā)到了ngrok.shawnan.xyz的34538烤宙。

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    tcp://ngrok.shawnan.xyz:34538 -> 127.0.0.1:22
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

此時就可以使用域名和端口遠程連接局域網(wǎng)內的linux機器了。

ssh xxx@ngrok.shawnan.xyz -p 34358

完善配置文件

前面ngrok隨機選擇了一個端口對22端口進行轉發(fā)俭嘁,很不方便躺枕,每次還需要先看一下端口才能遠程ssh連接。此處如果想自定義tcp轉發(fā)的端口供填,則需要完善ngrok的配置文件拐云,通過完善配置文件,可以大大簡化運行命令近她。配置文件前面兩行不變叉瘩,仍舊是配置服務器地址和禁用TLS加密協(xié)議的證書信任。下面配置管道粘捎,可以同時配置多種管道薇缅,比如ssh、http攒磨、https等泳桦。

server_addr: ngrok.moonwalker.me:4443
trust_host_root_certs: false
tunnels:
 ssh:
  remote_port: 1122
  proto:
   tcp: 22
 ftp:
  remote_port: 20
  proto:
   tcp: 20
 ftp2:
  remote_port: 21
  proto:
   tcp: 21
 http:
  subdomain: www
  proto:
   http: 80
   https: 443

配置完成后,可以直接啟動指定的管道或者啟動全部管道娩缰。

./ngrok -config ngrok.cfg start ssh
./ngrok -config ngrok.cfg start-all

配置成為服務并設置自啟動

服務端和客戶端都配置完了灸撰,但是我們不想每次都輸入這么長的命令,那么就可以借助systemctl來將我們的服務配置成為系統(tǒng)服務并設置自動啟動拼坎。此處以Centos7為例浮毯,CentOS7的服務systemctl腳本存放在:/usr/lib/systemd/system,在此文件夾下建立ngrok.service文件泰鸡,內容如下:

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/usr/local/ngrok/bin/ngrokd -tlsKey=/usr/local/ngrok/server.key -tlsCrt=/usr/local/ngrok/server.crt -domain=ngrok.shawnan.xyz -httpAddr=:8088 -httpsAddr=:8443

[Install]
WantedBy=multi-user.target

[Unit]部分主要是對這個服務的說明债蓝,內容包括Description和After,Description用于描述服務鸟顺,After用于描述服務類別惦蚊。[Service]部分是服務具體運行參數(shù)的設置器虾,此處ExecStart即為服務啟動的命令讯嫂,[Install]部分是服務安裝的相關設置,可設置為多用戶的兆沙。
配置完畢后欧芽,使用如下命令分別啟動服務,停止服務葛圃,查看狀態(tài)千扔。

systemctl start ngrok.service // 啟動
systemctl stop ngrok.service // 停止
systemctl status ngrok.service // 查看狀態(tài)

使用enable指令可以配置該服務為開機自啟動憎妙,這條命令實際上是創(chuàng)建了一個該文件的軟連接到/etc/systemd/system/multi-user.target.wants/ngrok.service。放在/etc/systemd/system下的service都是會開機自啟動的曲楚,但是比較規(guī)范的做法是放到/usr/lib/systemd/system厘唾,然后再使用systemctl enable設置開機啟動。

systemctl enable ngrok.service

至此龙誊,借助ngrok抚垃,家里的筆記本也可以作為服務器對外提供服務了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末趟大,一起剝皮案震驚了整個濱河市鹤树,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逊朽,老刑警劉巖罕伯,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叽讳,居然都是意外死亡追他,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門岛蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湿酸,“玉大人,你說我怎么就攤上這事灭美⊥评#” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵届腐,是天一觀的道長铁坎。 經(jīng)常有香客問我,道長犁苏,這世上最難降的妖魔是什么硬萍? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮围详,結果婚禮上朴乖,老公的妹妹穿的比我還像新娘。我一直安慰自己助赞,他們只是感情好买羞,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雹食,像睡著了一般畜普。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上群叶,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天吃挑,我揣著相機與錄音钝荡,去河邊找鬼。 笑死舶衬,一個胖子當著我的面吹牛埠通,可吹牛的內容都是我干的。 我是一名探鬼主播逛犹,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼植阴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了圾浅?” 一聲冷哼從身側響起掠手,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狸捕,沒想到半個月后喷鸽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隧膏,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡译秦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠕啄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸡岗。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡混槐,死狀恐怖,靈堂內的尸體忽然破棺而出轩性,到底是詐尸還是另有隱情声登,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布揣苏,位于F島的核電站悯嗓,受9級特大地震影響,放射性物質發(fā)生泄漏卸察。R本人自食惡果不足惜脯厨,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坑质。 院中可真熱鬧合武,春花似錦、人聲如沸涡扼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壳澳。三九已至岂贩,卻和暖如春茫经,著一層夾襖步出監(jiān)牢的瞬間巷波,已是汗流浹背萎津。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抹镊,地道東北人锉屈。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像垮耳,于是被迫代替她去往敵國和親颈渊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容