簡單來說內(nèi)網(wǎng)穿透的目的是:讓外網(wǎng)能訪問你本地的應(yīng)用,例如在外網(wǎng)打開你本地http://127.0.0.1指向的Web站點(diǎn)。
最近公司的花生殼到期了,要續(xù)費(fèi),發(fā)現(xiàn)價(jià)格一直在漲,都是5年以上的老用戶,旗艦版都沒有實(shí)現(xiàn)內(nèi)網(wǎng)完全穿透,打算自己動(dòng)手替換這個(gè)服務(wù),中間走了不少的彎路,這里記錄一些文字為大家提供參考。
隨著開發(fā)與運(yùn)行移動(dòng)互聯(lián)網(wǎng)的應(yīng)用越來越多對(duì)打通內(nèi)外網(wǎng)的需要也更加迫切,如微信開發(fā)、IOS與Android開發(fā)等。
雖然租用VPS、ECS等服務(wù)器可以解決很多問題但高性能的外網(wǎng)服務(wù)器價(jià)格非常貴還有數(shù)據(jù)安全問題,我選擇的是公網(wǎng)服務(wù)器僅做代理與輕量應(yīng)用,復(fù)雜的應(yīng)用部署到內(nèi)網(wǎng)服務(wù)器再穿透訪問。
一、內(nèi)網(wǎng)穿透概要
為了理解內(nèi)網(wǎng)穿透我們先來了解幾個(gè)概念:
1.1、IP地址
網(wǎng)絡(luò)中唯一定位一臺(tái)設(shè)備的邏輯地址,類似我們的電話號(hào)碼
在互聯(lián)網(wǎng)中我們?cè)L問一個(gè)網(wǎng)站或使用一個(gè)網(wǎng)絡(luò)服務(wù)最終都需要通過IP定位到每一臺(tái)主機(jī),如訪問baidu網(wǎng)站:
其中119.75.213.61就是一個(gè)公網(wǎng)的IP地址,他最終指向了一臺(tái)服務(wù)器。
IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式,它為互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)絡(luò)和每一臺(tái)主機(jī)分配一個(gè)邏輯地址,以此來屏蔽物理地址的差異。
內(nèi)網(wǎng)IP可以同時(shí)出現(xiàn)在多個(gè)不同的局域網(wǎng)絡(luò)中,如A公司的U1用戶獲得了192.168.0.5,B公司的U3用戶也可以獲得192.168.0.5;但公網(wǎng)IP是唯一的,因?yàn)槲覀冎挥幸粋€(gè)Internet。
//局域網(wǎng)可使用的網(wǎng)段(私網(wǎng)地址段)有三大段:10.0.0.0~10.255.255.255(A類)172.16.0.0~172.31.255.255(B類)192.168.0.0~192.168.255.255(C類)
1.2、域名
域名是IP的別名,便于記憶,域名最終通過DNS解析成IP地址。
IP V4是一個(gè)32位的數(shù)字,IP V6有128位,要記住一串毫無意義的數(shù)字非常困難,域名解決了這個(gè)問題。
如www.zhangguo.com.cn就是一個(gè)域名,cn表示地區(qū),com表示商業(yè)機(jī)構(gòu),zhangguo是公司名稱,www是主機(jī)名
DNS查詢過程如下,最終將域名變成IP地址
1.3、NAT
NAT(Network Address Translation)即網(wǎng)絡(luò)地址轉(zhuǎn)換,NAT能將其本地地址轉(zhuǎn)換成全球IP地址。
內(nèi)網(wǎng)的一些主機(jī)本來已經(jīng)分配到了本地IP地址(如局域網(wǎng)DHCP分配的IP),但現(xiàn)在又想和因特網(wǎng)上的主機(jī)通信(并不需要加密)時(shí),可使用NAT方法。
通過使用少量的公有IP 地址代表較多的私有IP 地址的方式,將有助于減緩可用的IP地址空間的枯竭。
NAT不僅能解決了lP地址不足與共享上網(wǎng)的問題,而且還能夠有效地避免來自網(wǎng)絡(luò)外部的攻擊,隱藏并保護(hù)網(wǎng)絡(luò)內(nèi)部的計(jì)算機(jī)。
多路由器可完成NAT功能。
NAT的實(shí)現(xiàn)方式:
靜態(tài)轉(zhuǎn)換是指將內(nèi)部網(wǎng)絡(luò)的私有IP地址轉(zhuǎn)換為公有IP地址,IP地址對(duì)是一對(duì)一。
動(dòng)態(tài)轉(zhuǎn)換是指將內(nèi)部網(wǎng)絡(luò)的私有IP地址轉(zhuǎn)換為公用IP地址時(shí),IP地址是不確定的,是隨機(jī)的。
端口多路復(fù)用(Port address Translation,PAT),內(nèi)部網(wǎng)絡(luò)的所有主機(jī)均可共享一個(gè)合法外部IP地址實(shí)現(xiàn)對(duì)Internet的訪問,從而可以最大限度地節(jié)約IP地址資源。同時(shí)又可隱藏網(wǎng)絡(luò)內(nèi)部的所有主機(jī),有效避免來自internet的攻擊。因此,目前網(wǎng)絡(luò)中應(yīng)用最多的就是端口多路復(fù)用方式。
應(yīng)用程序級(jí)網(wǎng)關(guān)技術(shù)(Application Level Gateway)ALG:傳統(tǒng)的NAT技術(shù)只對(duì)IP層和傳輸層頭部進(jìn)行轉(zhuǎn)換處理,ALG它能對(duì)這些應(yīng)用程序在通信時(shí)所包含的地址信息也進(jìn)行相應(yīng)的NAT轉(zhuǎn)換。
1.4、Proxy
Proxy即代理,被廣泛應(yīng)用于計(jì)算機(jī)領(lǐng)域,主要分為正向代理與反向代理:
1.4.1、正向代理
比如X花店代A,B,C,D,E五位男生向Candy女生送匿名的生日鮮花,這里的X花店就是5位顧客的代理,花店代理的是客戶,隱藏的是客戶。這就是我們常說的代理。
正向代理隱藏了真實(shí)的請(qǐng)求客戶端。服務(wù)端不知道真實(shí)的客戶端是誰,客戶端請(qǐng)求的服務(wù)都被代理服務(wù)器代替來請(qǐng)求,某些科學(xué)上網(wǎng)工具扮演的就是典型的正向代理角色。用瀏覽器訪問http://www.google.com時(shí)被墻了,于是你可以在國外搭建一臺(tái)代理服務(wù)器,讓代理幫我去請(qǐng)求google.com,代理把請(qǐng)求返回的相應(yīng)結(jié)構(gòu)再返回給我。
當(dāng)多個(gè)客戶端訪問服務(wù)器時(shí)服務(wù)器不知道真正訪問自己的客戶端是那一臺(tái)。正向代理中,proxy和client同屬一個(gè)LAN,對(duì)server透明;
1.4.2、反向代理
撥打10086客服電話,接線員可能有很多個(gè),調(diào)度器會(huì)智能的分配一個(gè)接線員與你通話。這里的調(diào)度器就是一個(gè)代理,只不過他代理的是接線員,客戶端不能確定真正與自己通話的人,隱藏與保護(hù)的是目標(biāo)對(duì)象。
反向代理隱藏了真實(shí)的服務(wù)端,當(dāng)我們請(qǐng)求 ww.baidu.com 的時(shí)候,就像撥打10086一樣,背后可能有成千上萬臺(tái)服務(wù)器為我們服務(wù),但具體是哪一臺(tái),你不知道,也不需要知道,你只需要知道反向代理服務(wù)器是誰就好了,ww.baidu.com 就是我們的反向代理服務(wù)器,反向代理服務(wù)器會(huì)幫我們把請(qǐng)求轉(zhuǎn)發(fā)到真實(shí)的服務(wù)器那里去。Nginx就是性能非常好的反向代理服務(wù)器,用來做負(fù)載均衡。
反向代理中,proxy和server同屬一個(gè)LAN,對(duì)client透明。
了解更多關(guān)于代理內(nèi)容請(qǐng)點(diǎn)擊這里。
1.5、DDNS
DDNS即動(dòng)態(tài)域名解析,是將用戶的動(dòng)態(tài)IP地址映射到一個(gè)固定的域名解析服務(wù)上,用戶每次連接網(wǎng)絡(luò)的時(shí)候,客戶端程序就會(huì)通過信息傳遞把該主機(jī)的動(dòng)態(tài)IP地址傳送給位于服務(wù)商主機(jī)上的服務(wù)器程序,服務(wù)程序負(fù)責(zé)提供DNS服務(wù)并實(shí)現(xiàn)動(dòng)態(tài)域名解析。就是說DDNS捕獲用戶每次變化的IP地址,然后將其與域名相對(duì)應(yīng),這樣域名就可以始終解析到非固定IP的服務(wù)器上,互聯(lián)網(wǎng)用戶通過本地的域名服務(wù)器獲得網(wǎng)站域名的IP地址,從而可以訪問網(wǎng)站的服務(wù)。
1.6、為什么需要內(nèi)網(wǎng)穿透
當(dāng)內(nèi)網(wǎng)中的主機(jī)沒有靜態(tài)IP地址要被外網(wǎng)穩(wěn)定訪問時(shí)可以使用內(nèi)網(wǎng)穿透
在互聯(lián)網(wǎng)中唯一定位一臺(tái)主機(jī)的方法是通過公網(wǎng)的IP地址,但固定IP是一種非常稀缺的資源,不可能給每個(gè)公司都分配一個(gè),且許多中小公司不愿意為高昂的費(fèi)用買單,多數(shù)公司直接或間接的撥號(hào)上網(wǎng),電信部門會(huì)給接入網(wǎng)絡(luò)的用戶分配IP地址,以前上網(wǎng)用戶少的時(shí)候基本分配的都是臨時(shí)的靜態(tài)IP地址,租約過了之后可能會(huì)更換成另一個(gè)IP地址,這樣外網(wǎng)訪問就不穩(wěn)定,因?yàn)閮?nèi)網(wǎng)的靜態(tài)IP地址一直變化,為了解決這個(gè)問題可以使用動(dòng)態(tài)域名解析的辦法變換域名指向的靜態(tài)IP地址。但是現(xiàn)在越來越多的上網(wǎng)用戶使得臨時(shí)分配的靜態(tài)IP地址也不夠用了,電信部門開始分配一些虛擬的靜態(tài)IP地址,這些IP是公網(wǎng)不能直接訪問的,如以125開頭的一些IP地址,以前單純的動(dòng)態(tài)域名解析就不好用了。
1.7、內(nèi)網(wǎng)穿透的定義與障礙
簡單來說實(shí)現(xiàn)不同局域網(wǎng)內(nèi)的主機(jī)之間通過互聯(lián)網(wǎng)進(jìn)行通信的技術(shù)叫內(nèi)網(wǎng)穿透。
障礙一:位于局域網(wǎng)內(nèi)的主機(jī)有兩套 IP 地址,一套是局域網(wǎng)內(nèi)的 IP 地址,通常是動(dòng)態(tài)分配的,僅供局域網(wǎng)內(nèi)的主機(jī)間通信使用;一套是經(jīng)過網(wǎng)關(guān)轉(zhuǎn)換后的外網(wǎng) IP 地址,用于與外網(wǎng)程序進(jìn)行通信。
障礙二:位于不同局域網(wǎng)內(nèi)的兩臺(tái)主機(jī),即使是知道了對(duì)方的 IP 地址和端口號(hào),“一廂情愿”地將數(shù)據(jù)包發(fā)送過去,對(duì)方也是接收不到的。
因?yàn)槌鲇诎踩鹨姡鞘侵鳈C(jī)主動(dòng)向?qū)Ψ桨l(fā)出了連接請(qǐng)求(這時(shí)會(huì)在該主機(jī)的數(shù)據(jù)結(jié)構(gòu)中留下一條記錄),否則,當(dāng)主機(jī)接收到數(shù)據(jù)包時(shí),如果在其數(shù)據(jù)結(jié)構(gòu)中查詢不到對(duì)應(yīng)的記錄,那些不請(qǐng)自來的數(shù)據(jù)包將會(huì)被丟棄。
解決辦法:要想解決以上兩大障礙,我們需要借助一臺(tái)具有公網(wǎng) IP 的服務(wù)器進(jìn)行橋接。
二、常見的內(nèi)網(wǎng)穿透產(chǎn)品
2.1、花生殼
花生殼既是內(nèi)網(wǎng)穿透軟件、內(nèi)網(wǎng)映射軟件,也是端口映射軟件。規(guī)模最大,較正規(guī),完善。
收費(fèi)高,使用簡單
官網(wǎng):http://www.oray.com/
2.2、Nat123
nat123是內(nèi)網(wǎng)端口映射與動(dòng)態(tài)域名解析軟件,在內(nèi)網(wǎng)啟動(dòng)映射后,可在外網(wǎng)訪問連接內(nèi)網(wǎng)網(wǎng)站等應(yīng)用。整個(gè)網(wǎng)站我都沒有找到客服電話,網(wǎng)友發(fā)了一些反面的評(píng)價(jià)
收費(fèi),使用簡單
官網(wǎng):http://www.nat123.com
2.3、NATAPP
NATAPP基于ngrok的國內(nèi)內(nèi)網(wǎng)穿透服務(wù),免費(fèi)版會(huì)強(qiáng)制更換域名,臨時(shí)用一下可以
收費(fèi),使用簡單
官網(wǎng):https://natapp.cn/
2.4、frp與其它
frp 是一個(gè)高性能的反向代理應(yīng)用,可以幫助您輕松地進(jìn)行內(nèi)網(wǎng)穿透,對(duì)外網(wǎng)提供服務(wù),支持 tcp, http, https 等協(xié)議類型,并且 web 服務(wù)支持根據(jù)域名進(jìn)行路由轉(zhuǎn)發(fā)。
開源免費(fèi)
使用相對(duì)復(fù)雜,需要代理服務(wù)器支持
官網(wǎng):https://github.com/fatedier/frp
文檔:查看幫助文檔,簡書示例
利用處于內(nèi)網(wǎng)或防火墻后的機(jī)器,對(duì)外網(wǎng)環(huán)境提供 http 或 https 服務(wù)。
對(duì)于 http, https 服務(wù)支持基于域名的虛擬主機(jī),支持自定義域名綁定,使多個(gè)域名可以共用一個(gè)80端口。
利用處于內(nèi)網(wǎng)或防火墻后的機(jī)器,對(duì)外網(wǎng)環(huán)境提供 tcp 和 udp 服務(wù),例如在家里通過 ssh 訪問處于公司內(nèi)網(wǎng)環(huán)境內(nèi)的主機(jī)。
因?yàn)閒rp 仍然處于前期開發(fā)階段,未經(jīng)充分測(cè)試與驗(yàn)證,不推薦用于生產(chǎn)環(huán)境,所有我選擇了ngrok,資料比較多。
還有如圣劍內(nèi)網(wǎng)通、ngrok(開源免費(fèi))、更多辦法
三、ngrok
ngrok是一個(gè)反向代理,通過在公共的端點(diǎn)和本地運(yùn)行的Web服務(wù)器之間建立一個(gè)安全的通道。ngrok可捕獲和分析所有通道上的流量,便于后期分析與響應(yīng)。
開源免費(fèi)
官網(wǎng):https://ngrok.com/
源碼:https://github.com/inconshreveable/ngrok
ngrok1.x開源,ngrok2.x不開源
ngrok使用Go語言開發(fā),源代碼分為客戶端與服務(wù)器端。
國內(nèi)免費(fèi)服務(wù)器:http://ngrok.ciqiuwl.cn/,更多免費(fèi)服務(wù)器請(qǐng)大家挖掘,資源共享,我隨時(shí)更新:)
如果有服務(wù)器,僅客戶端的使用是不復(fù)雜的,以上面的免費(fèi)服務(wù)器為示例完成內(nèi)網(wǎng)穿透
現(xiàn)在假定我的本地已成功部署了一個(gè)網(wǎng)站,訪問地址為127.0.0.1,想內(nèi)網(wǎng)穿透后被公網(wǎng)上的用戶訪問,一般步驟如下:
步驟1、下載windows版本的客戶端,解壓。一般在為你提供代理服務(wù)器的網(wǎng)站上找你要下載的客戶端:
步驟2、在命令(cmd)行下進(jìn)入到ngrok客戶端目錄下
步驟3、執(zhí)行 ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定義的域名前綴),建議批處理
如果連接成功,會(huì)提示如下信息:
這一步如果你認(rèn)為太麻煩,可以直接運(yùn)行目錄下的start.bat批處理文件就不用進(jìn)DOS環(huán)境了。運(yùn)行start.bat直接跳過2,3步
步驟4、如果開啟成功 你就可以使用 xxx.ngrok.xiaomiqiu.cn 來訪問你本機(jī)的 127.0.0.1:80 的服務(wù)了,當(dāng)然你必須確定的是你本機(jī)的Web是可以正常訪問的。
注意:
如果你自己有頂級(jí)域名,想通過自己的域名來訪問本機(jī)的項(xiàng)目,那么先將自己的頂級(jí)域名解析到120.25.161.137(域名需要已備案哦,80端口必須備案),然后執(zhí)行 ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定義的頂級(jí)域名)
四、ubuntu下生成ngrok服務(wù)器主程序
4.1、步驟與先決條件
如果你只是臨時(shí)穿透或調(diào)試用,到第三步基本就可以了,但如果想作為穩(wěn)定的商業(yè)服務(wù),用別人的服務(wù)器還是受制于人,這里我們準(zhǔn)備搭建自己的ngrok服務(wù)器。大致的步驟如下:
ngrok服務(wù)器可以是多種平臺(tái),如windows、linux(centos、Debian、Ubuntu等)、mac OS等。
編譯源代碼生成應(yīng)用強(qiáng)烈建議大家使用linux環(huán)境,windows肯定可以成功,但非常麻煩,我在windows操作系統(tǒng)上兜了一個(gè)大圈圈。
先決條件:
a)、您有一臺(tái)公網(wǎng)上的服務(wù)器,如阿里云的ECS
b)、您有一個(gè)域名,最好ICP備案成功,不然80端口沒有辦法使用,不過像微信開發(fā)是不使用80端口的,可以用nginx代理轉(zhuǎn)換。
4.2、安裝ubuntu操作系統(tǒng)
在linux環(huán)境下編譯ngrok的源代碼比windows下 方便很多,這里我們選擇使用ubuntu,獲得ubuntu的方法有如下幾種:
1)、全新安裝ubuntu系統(tǒng)
2)、申請(qǐng)VPS服務(wù)器, 阿里云、騰訊云、華為云、百度云、新浪云等,僅編譯一下這種方法不錯(cuò)
3)、在虛擬機(jī)中安裝ubuntu系統(tǒng)
綜合考慮我選擇了在虛擬機(jī)中安裝ubuntu操作系統(tǒng)
4.2.1、安裝VMware虛擬機(jī)
VMware Workstation是一款功能強(qiáng)大的虛擬機(jī)軟件,在不影響本機(jī)操作系統(tǒng)的情況下,用戶可以在虛擬機(jī)中同時(shí)運(yùn)行不同版本的操作系統(tǒng),用于開發(fā)、測(cè)試以及部署工作。
VMware Workstation 12 pro下載:VMware-workstation-full-12.1.0-3272444.exe
序列號(hào):5A02H-AU243-TZJ49-GTC7K-3C61N(商業(yè)應(yīng)用請(qǐng)購買正式版權(quán),這里僅為學(xué)習(xí)使用)
1)、雙擊VMware Workstation 12安裝文件,或者右鍵管理員身份打開,提示是否允許更改,點(diǎn)擊是;
2)、打開VMware安裝向?qū)Вc(diǎn)擊下一步;
3)、VMware Workstation 12激活步驟:
方法一、首次開啟直接輸入上文密鑰,即可激活;
方法二、首次開啟選擇試用,進(jìn)入試用后按一下步驟激活:
a、打開虛擬機(jī)主界面,點(diǎn)擊“幫助”—“輸入許可證密鑰”;
b、在密鑰輸入框輸入永久許可證密鑰5A02H-AU243-TZJ49-GTC7K-3C61N,確定;更多
4.2.2、安裝ubuntu到虛擬機(jī)
1)、下載ubuntu操作系統(tǒng)鏡像
下載地址:https://www.ubuntu.com/download/desktop
這里我下載的是ubuntu-16.04.3-desktop-amd64.iso
2)、在VMware中安裝ubuntu
打開VMware點(diǎn)擊“創(chuàng)建新的虛擬機(jī)”
向?qū)нx擇自定義
然后下一步再下一步,直到這里,稍后再安裝系統(tǒng)
后面設(shè)置處理器和內(nèi)存的,電腦配置好的可以試試,否則采用默認(rèn)的,博主這里是采用默認(rèn)的,然后下一,直到這里,選擇將虛擬機(jī)存儲(chǔ)為單個(gè)磁盤:
個(gè)人建議至少20G硬盤空間,內(nèi)存建議給1.5G,當(dāng)然也要看電腦本身的配置,1G的內(nèi)存跑起來比較卡。
其它的步驟比較簡單,更多細(xì)節(jié)可以參考這里,《VMware Ubuntu安裝詳細(xì)過程》。
4.2.3、配置ubuntu系統(tǒng)
當(dāng)ubuntu系統(tǒng)安裝成功后,在虛擬機(jī)中可以啟動(dòng)ubuntu系統(tǒng),啟動(dòng)后的系統(tǒng)如下:
ubuntu系統(tǒng)的使用還是有許多內(nèi)容的,這里需要設(shè)置的內(nèi)容如下:
a)、設(shè)置上網(wǎng)
就是在ubuntu中可以訪問外網(wǎng),可以使用多種形式
b)、設(shè)置語言
可以選擇使用中文版的ubuntu語言環(huán)境
c)、設(shè)置屏幕分辨率
如果不設(shè)置默認(rèn)的屏幕比較小
d)、設(shè)置以root超級(jí)管理員的身份登錄
許多操作要求管理身份
e)、安裝VMware Tools工具
只有在VMware虛擬機(jī)中安裝好了VMware Tools,才能實(shí)現(xiàn)主機(jī)與虛擬機(jī)之間的文件共享,同時(shí)可支持自由拖拽的功能,鼠標(biāo)也可在虛擬機(jī)與主機(jī)之間自由移動(dòng)(不用再按ctrl+alt),且虛擬機(jī)屏幕也可實(shí)現(xiàn)全屏化。
VMware Tools是VMware虛擬機(jī)中自帶的一種增強(qiáng)工具,相當(dāng)于VirtualBox中的增強(qiáng)功能(Sun VirtualBox Guest Additions),是VMware提供的增強(qiáng)虛擬顯卡和硬盤性能、以及同步虛擬機(jī)與主機(jī)時(shí)鐘的驅(qū)動(dòng)程序。
注意如果這里是灰色的需要您將linux.iso鏡像加載到虛擬光驅(qū)中,一般在VM的安裝目錄下有,如果沒有您需要自行下載。
說明:ubuntu的使用不是本文的重點(diǎn),相關(guān)操作請(qǐng)大家自行查找。
4.3、生成ngrok服務(wù)器與客戶端應(yīng)用程序
4.3.1. 導(dǎo)出源代碼
ngrok的源代碼托管在github上,可以先在ubuntu下安裝git再將ngrok的源代碼克隆到本地。
其實(shí)也可以直接下載到本地后解壓,這里使用命令行完成。
啟動(dòng)ubuntu,開打命令行(終端),如下所示:
以root身份執(zhí)行如下命令:
mkdir ngrok #創(chuàng)建名稱為ngrok的目錄 apt-get update #更新包管理器 apt-get install git #安裝git git clone https://github.com/inconshreveable/ngrok.git ngrok2 #將ngrok源代碼克隆回本地
成功執(zhí)行后如下所示:
導(dǎo)出成功后的源代碼:
PS. 直接在服務(wù)器上下載的話實(shí)在太慢,可以先在本地下載好,然后用ftp放到服務(wù)器上去直接用,如果安裝了VMware tools直接拖進(jìn)去就可以了。
4.3.2. 安裝Go語言開發(fā)環(huán)境
直接在命令模式下執(zhí)行如下指令:
apt-get install golang #安裝go語言
執(zhí)行結(jié)果如下:
4.3.3. 更改ngrok域名
在自己的域名管理中添加解析A記錄,如下所示:
將*.ngrok與ngrok都指向您的主機(jī)IP。
默認(rèn)的域名是ngrok自己的,要替換成您自己的域名
export GOPATH=/usr/local/ngrok/ #設(shè)置環(huán)境變量,Go語言的安裝位置export NGROK_DOMAIN="ngrok.yourdomain.com" #設(shè)置環(huán)境變量,ngrok域名
PS. ngrok名稱可以任意,推薦名稱為ngrok或者tunnel
4.3.4. 為域名生成證書
openssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pemopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csropenssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
生成后的結(jié)果如下:
證書如下:
4.3.5. 拷貝證書到指定位置
cp rootCA.pem assets/client/tls/ngrokroot.crt #復(fù)制rootCA.pem到assets/client/tls/并更名為ngrokroot.crtcp server.crt assets/server/tls/snakeoil.crt #復(fù)制server.crt到assets/server/tls/并更名為snakeoil.crtcp server.key assets/server/tls/snakeoil.key #復(fù)制server.key到assets/server/tls/并更名為snakeoil.key
運(yùn)行結(jié)果:
4.3.6. 編譯
由于go語言的特性,在編譯時(shí)直接生成機(jī)器碼,所以在運(yùn)行過程中并不需要go的環(huán)境(非托管應(yīng)用)。在ngrok目錄下,運(yùn)行一下命令分別生成對(duì)應(yīng)的客戶端與服務(wù)端。
#win服務(wù)端GOOS=windows GOARCH=386 make release-server #win客戶端GOOS=windows GOARCH=386 make release-client#linux服務(wù)端GOOS=linux GOARCH=386 make release-server#linux客戶端GOOS=linux GOARCH=386 make release-client
生成完成后,在工作目錄的bin文件夾下,產(chǎn)生對(duì)應(yīng)的文件。以編譯windows平臺(tái)為例,會(huì)產(chǎn)生“ngrok.exe”與“ngrokd.exe”這兩個(gè)文件,前者客戶端,后者需要運(yùn)行在公網(wǎng)服務(wù)器上。
因?yàn)轫?xiàng)目中引用了一些外部資源,生成會(huì)耗費(fèi)一些時(shí)間,對(duì)網(wǎng)絡(luò)也有一定的要求,太慢會(huì)中短,命令執(zhí)行下如:
生成結(jié)果:
這里我還生成了兩個(gè)運(yùn)行在windows服務(wù)器與客戶端的應(yīng)用:
ngrok.exe是客戶端,ngrokd.exe是服務(wù)端,下面是比較連續(xù)的操作結(jié)果。
五、部署服務(wù)器端主程序
5.1、部署到Windows Server服務(wù)器
將生成的ngrokd.exe文件復(fù)制到windows服務(wù)器中,當(dāng)然如果要部署到linux中也是沒有問題的。
這里我將ngrokd.exe放在c:grokeServer目錄下:
為了方便,我編寫了一個(gè)批處理文件:ngrokserver2.bat
ngrokd.exe -tlsKey="snakeoil.key" -tlsCrt="snakeoil.crt" -domain="ngrok.你的域名.com" -httpAddr=":801" -httpsAddr=":802"
點(diǎn)擊批處理運(yùn)行結(jié)果如下:
綁定的域名換成自己的域名,http使用801端口,https使用802端口,供客戶端連接的管道端口設(shè)置為4443端口,必須前面的域名相同。
為了安全許多服務(wù)器會(huì)將端口屏蔽,我使用的是ECS服務(wù)器,默認(rèn)801,802都是關(guān)閉的,需要手動(dòng)開啟,在阿里云的后臺(tái)添加開放的端口就可了:
5.2、一鍵部署ngrok服務(wù)器(CentOS、Debian、Ubuntu)
如果編譯生成ngrok的源代碼生成應(yīng)用太麻煩,你可以選擇網(wǎng)友寫的工具,支持一鍵部署到安裝平臺(tái):CentOS、Debian、Ubuntu。
https://github.com/clangcn/ngrok-one-key-install
六、部署ngrok客戶端
這里的客戶端就是您的web應(yīng)用程序所運(yùn)行的主機(jī),將ubuntu生成的ngrok.exe客戶端應(yīng)用復(fù)制到您的系統(tǒng)中:
添加配置文件ngrok.cfg:
server_addr: "ngrok.你的域名.com:4443"trust_host_root_certs: false
添加批處理start.bat,如果只運(yùn)行一次直接在命令行下輸入命令也是一樣的效果,內(nèi)容如下:
ngrok.exe -subdomain kyt -config=ngrok.cfg 8987
其中8987為端口號(hào),運(yùn)行成功的結(jié)果如下所示:
看到這個(gè)界面時(shí)說明已成功了。
七、啟動(dòng)客戶端并測(cè)試
打開瀏覽器,輸入您映射后的域名就可以穿透內(nèi)網(wǎng)訪問您的web服務(wù)器了。
八、總結(jié)
一開始選擇錯(cuò)了平臺(tái),在windows花了不少時(shí)間,在ubuntu下順利完成。
無論是客戶端還是服務(wù)器端最好都做成服務(wù),更方便與穩(wěn)定。
由于服務(wù)器上同時(shí)運(yùn)行著IIS,故服務(wù)端Ngrok啟動(dòng)時(shí)無法使用80端口,所以在上面,我使用了801作為Ngrok服務(wù)器的http端口,使用IIS的代理功能可以解決這個(gè)問題,點(diǎn)擊這里。當(dāng)然也可以使用nginx將80轉(zhuǎn)換成其它端口。
許多內(nèi)容都參考了網(wǎng)友的文章。
如果服務(wù)器搭建好了,只運(yùn)行客戶端穿透內(nèi)網(wǎng)一分鐘夠了:)。