什么是內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透播急,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數(shù)據(jù)包不被 NAT 設(shè)備屏蔽而正確路由到內(nèi)網(wǎng)主機售睹。
通俗的講桩警,內(nèi)網(wǎng)穿透其實就是兩臺計算機都處于不同的局域網(wǎng)之中,外網(wǎng)與內(nèi)網(wǎng)的計算機節(jié)點需要連接通信昌妹,那么就需要借助內(nèi)網(wǎng)穿透技術(shù)來解決這個問題捶枢,也叫NAT穿透。我們可能使用過的現(xiàn)有的軟件飞崖,比如teamview,qq遠程連接烂叔,都是基于內(nèi)網(wǎng)穿透實現(xiàn)的。
使用場景
1.開發(fā)微信公眾號固歪,你可能跑了一個本地服務(wù)蒜鸡,還沒有上線,但是需要調(diào)試牢裳,調(diào)試需要一個公網(wǎng)可以訪問的域名逢防。但是一般來說,外網(wǎng)訪問不了你本地的服務(wù)蒲讯。那么這個時候就可以通過一個公網(wǎng)服務(wù)器胞四,通過端口轉(zhuǎn)發(fā),實現(xiàn)這個功能
2.周末在家伶椿,忽然接到通知辜伟,要跑一個服務(wù)器的腳本,或者改一段代碼脊另,腳本或者代碼在公司的內(nèi)網(wǎng)服務(wù)器导狡,在家怎么訪問呢?這個時候我們就可以用到ssh的隧道代理偎痛。
案例一: ngrok 其他參考
Ngrok 是一個反向代理軟件旱捧,啟動后會在公共服務(wù)器和本地客戶端之間建立一個通道,并由公共服務(wù)器分配一個唯一的域名給這個通道踩麦。在 Homestead 中運行 Ngrok 之后枚赡,通過公共服務(wù)器分配的域名就可以在公網(wǎng)訪問到 Homestead 中的站點,從而讓支付寶和微信支付的服務(wù)器直接將回調(diào)數(shù)據(jù)發(fā)送到對應(yīng)的回調(diào)接口谓谦。
注冊地址點擊注冊
-
注冊完畢 下載對應(yīng)的文件
我是在mac上使用的贫橙,直接下載一個壓縮包,解壓后里面就是執(zhí)行文件
1.解壓
unzip /path/to/ngrok.zip
2.配置權(quán)限校驗(authtoken 注冊后會提供)
./ngrok authtoken xxxxxx
3.啟動和查看幫助
# 查看幫助
./ngrok help
# 監(jiān)聽80端口
./ngrok http 80反粥,-host-header表示你本地的域名卢肃,不用域名 直接訪問端口也可以 疲迂,-region us是指代理地址是美國 80代表80端口,除了協(xié)議和端口外莫湘,都是可以缺省的
# http 是連接協(xié)議尤蒿,
ngrok http -host-header=shop.test -region us 80
- 代理本地的80端口
./ngrok http 80
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
#賬戶名
Account xxxx@gmail.com (Plan: Free)
Version 2.3.40
# 這個是代理地址的國家
Region United States (us)
# 這個是web管理頁面,可以查看訪問信息
Web Interface http://127.0.0.1:4040
#這個就是代理地址幅垮,代理的是本地80端口
Forwarding http://14a4-222-129-1-243.ngrok.io -> http://localhost:80
Forwarding https://14a4-222-129-1-243.ngrok.io -> http://localhost:80
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
- 我們打開web地址看一下,就是4040端口
這時我們請求一個地址 發(fā)現(xiàn)報錯了腰池,說我的80端口不能訪問,因為80端口沒啟用
-
終端console 的信息如下
那我們用go 簡單寫一個可以使用的http 服務(wù)忙芒,20行代碼巩螃。代碼如下
package main
import (
"io"
"log"
"net/http"
)
/**
* @Description: 寫一個簡單版本的web服務(wù)
*/
func main() {
http.HandleFunc("/",Hello)//指定路由處理
err:=http.ListenAndServe(":8889",nil)//建立端口監(jiān)聽服務(wù)
if err !=nil{
log.Fatal("ListenAndServe error:",err)
}
}
//接收請求 返回hello world
func Hello(w http.ResponseWriter,req * http.Request) {
io.WriteString(w,"技術(shù)小蟲說:hello word\n")
}
-
我們的程序監(jiān)聽的是8889端口,訪問一下看看
-
接下來我們把 ngrok 代理到8889端口
-
可以正常相應(yīng)8889
案例二:ssh內(nèi)網(wǎng)穿透
為了盡可能還原匕争,我在我的電腦上創(chuàng)建一臺ubuntu虛擬機避乏,我的電腦(LocalA macos )和ubuntu(LocalB)虛擬機網(wǎng)絡(luò)無法通信
一臺有獨立ip 的服務(wù)器(RemoteC),我的電腦可以訪問到甘桑,虛擬機也可以訪問到
先來看一個簡單版的本地端口轉(zhuǎn)發(fā)(LocalA 執(zhí)行)
ssh -L 2222:localhost:22 root@122.22.22.122 //當本地2222端口被訪問的時候拍皮,請求會被轉(zhuǎn)發(fā)RemoteC的22端口,需要輸入RemoteC的密碼
guofu@guofu-Inspiron-3558 ~ $ ssh -p 2222 root@localhost
root@localhost's password: # 需要輸入RemoteC的密碼跑杭,因為是2222轉(zhuǎn)發(fā)到了124的22
- 再來看一個遠程接口轉(zhuǎn)發(fā)(LocalB執(zhí)行)
ssh -R 8080:localhost:80 root@122.22.22.122 # RemoteC訪問8080端口 會被轉(zhuǎn)發(fā)到LocalB的80端口铆帽,這個其實就是 ngrok的實現(xiàn)方式
-
在RomoteC 訪問8080端口
下面演示另一種情況,我通過RemoteC 訪問 LocalB的22端口
1.在LocalB 執(zhí)行
guofu@guofu:~$ ssh -fNTCR localhost:2222:localhost:22 root@122.22.22.122 #當RemoteC訪問2222端口德谅,就會被轉(zhuǎn)發(fā)到LocalB的22端口爹橱,需要輸入RemoteC的root 密碼
2.然后我們登錄RemoteC,訪問2222端口看看能否被轉(zhuǎn)發(fā)到LocalB的22端口,顯示進入了ubuntu機器窄做,其實是利用了RemoteC 做跳板機登錄
[root@iZ2ze32d6gy2re63vx8froZ ~]# ssh -p 2222 guofu@localhost
guofu@localhost's password: #此處輸入LocalB的guofu的密碼
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-132-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
- 現(xiàn)在我們在LocalA 訪問LocalB 怎么操作呢
1.在RemoteC上面做一個端口轉(zhuǎn)發(fā)
ssh -fNTCL *:2221:localhost:2222 root@localhost #如果有請求RemoteC的2221的請求時愧驱,轉(zhuǎn)發(fā)到2222端口 端口2222就會被轉(zhuǎn)發(fā)到 LocalB的22端口,實現(xiàn)ssh登錄
2.在LocalA通過ssh 訪問2221端口
ssh -p 2221 guofu@122.22.22.122
3.登錄成功
其他方案
其他的成熟的服務(wù)椭盏,比如frp组砚,蜻蜓映射,natapp等掏颊,有興趣的可以進一步了解
小結(jié)
本文只是簡單的展示了內(nèi)網(wǎng)穿透的實現(xiàn)方案糟红,但是實際應(yīng)用中,我們還要關(guān)注內(nèi)網(wǎng)穿透帶來的安全問題乌叶,和服務(wù)的持續(xù)連接問題盆偿,可以參考這篇文章