前言:本文介紹了內網穿透技術原理及frp工具的部署方法。由于NAT映射表是臨時且單向的,外網無法直接訪問內網服務。通過部署公網服務器作為中轉,frp實現了內網服務的穿透訪問。具體步驟包括:下載frp軟件包,詳細說明了配置文件修改要點和端口開放注意事項,并提供了SSH和Nginx兩個實際應用案例,希望能幫助您快速掌握內網穿透的實現方法。
文章目錄
- 內網穿透原理
- frp軟件下載
- 內網穿透部署
- 遠程連接xshell
- 遠程訪問nginx
內網穿透原理
??我們都知道公網無法直接訪問內網主機,因為缺乏預先建立的 NAT 映射關系,導致外網請求無法路由到指定內網設備。
1.NAT的工作原理
- 內網 → 外網(可通)
當內網主機訪問公網服務器時:路由器會記錄一條 NAT 映射表,回來時路由器再通過映射表將響應轉發給內網主機。 - 外網 → 內網(默認不通)
如果公網設備直接嘗試訪問內網,路由器沒有對應的 NAT 映射表(因為內網未主動發起過連接)。路由器不知道應將數據包轉發給哪個內網主機,直接丟棄請求(防火墻策略)。
2.關鍵限制
- NAT 映射是臨時且單向的。
- 映射表通常在連接關閉后過期(如 TCP 超時后刪除)。
- 外網無法主動創建映射表條目。
??那么如果一個服務部署在內網中,我們想要訪問呢?比如公司做的私有服務,只有內部員工才能訪問,部署在公司內網中。而作為一個公司的員工在家里要完成工作任務需要訪問公司內網服務該怎么辦?
例如主機A要訪問主機C部署的服務:
??為了解決這個問題我們需要用到內網穿透技術,原理很簡單在中間加一個公網服務器。
??讓主機C訪問公網服務器,這樣就有了NAT映射表,只需要在公網服務器上部署一個服務,將公網IP:端口映射到內網主機IP:端口 。主機A訪問 公網IP:外部端口 時,路由器自動轉發到內網主機。
??所以接下來我們要解決的是在公網上部署一個什么樣的服務完成該工作呢?這里給大家介紹的是frp。
frp軟件下載
frp下載鏈接
本文講解的是在linux系統下部署,下載以下版本:
??接下來準備xshell連接遠程服務器和虛擬機兩個終端,并把本地下載的frp_0.58.1_linux_amd64.tar.gz
壓縮包上傳到兩個終端,可以直接拖拽、使用指令rz或指令scp
scp指令的使用:
scp 壓縮包地址 虛擬機登錄用戶名@虛擬機IP: 要拷貝到的目錄
對壓縮包解壓:
tar zxf frp_0.58.1_linux_amd64.tar.gz
打開文件:
frps*
是服務器,frps.toml
是服務器的配置文件。frpc*
是客戶端,frpc.toml
是客戶端的配置文件。LICENSE
是一個權限許可相關的文件,這里不做關心。
內網穿透部署
??以xshell遠程連接作為客戶去訪問內網虛擬機為例。那么我們需要在xshell中啟動frps服務器,在虛擬機中啟動frpc客戶端。
服務器啟動:
??在此之前需要了解并修改一下配置文件,xshell用vim打開frps.toml
配置文件,如下:
vim frps.toml
內容如下:
bindPort = 7000
這個表示frps服務的端口號,假設這里我們更改為7777
- 注意1:客戶端配置文件里要填充相同的端口才能訪問到該服務。
- 注意2:要保證云服務器的
7777
端口對外開放。
啟動服務:
./frps -c frps.toml
- 注意這里加了
-c frps.toml
選項,表示按配置文件的配置啟動
客戶端啟動:
??同樣的在此之前先了解并修改一下配置文件,使用虛擬機打開frpc.toml
配置文件,如下:
vim frpc.toml
內容如下:
serverAddr = "127.0.0.1"
serverPort = 7000[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
??serverAddr
服務器的IP這個修改成我們的公網服務器,比如我的120.46.0.237
,servereAddr
服務器端口,這里修改成上文我們填寫的服務器端口7777
??name
字段隨意填,type
是傳輸層協議類型,localIP
是本地服務器IP,如果是在自己主機上部署的服務就不用修改,localport
是本地訪問的端口號,這里就使用默認的服務端口22
,即ssh
服務,remotePort
是需要映射到公網的端口號,這里我們改為8022
啟動客戶端:
./frpc -c frpc.toml
- 注意公網服務器需要開放serverPort和remotePort對應的端口。
遠程連接xshell
??接下來我們打開一個xshell,訪問公網120.46.0.237:8022,就能訪問到內網虛擬機的ssh服務了。
遠程訪問nginx
??接下來再測試一個服務,在虛擬機上安裝一個nginx服務并啟動。
下載安裝nginx:
sudo apt install -y nginx
啟動nginx:
sudo nginx
查看它所對應的端口:
netstat -nltp
結果如下:
此時我們只需要在虛擬機客戶端的配置文件再添加一條映射關系:
如下:
serverAddr = "120.46.0.237"
serverPort = 7777[[proxies]]
name = "ssh-service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 8022[[proxies]]
name = "http-nginx"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080
測試:物理機打開瀏覽器訪問120.46.0.237:8080
,效果如下:
非常感謝您能耐心讀完這篇文章。倘若您從中有所收獲,還望多多支持呀!