內網穿透—使用 frp 實現內外網互通


前言

什么是內網穿透?

內網穿透,又叫 NET 穿透,是計算機用語。用通俗的說法就是你家里的個人電腦,可以直接被外網的人訪問。例如你在公司,不通過遠程工具,直接也可以訪問到家里的電腦(本文章特指 web 應用程序)。

正常來說我們的個人電腦是無法被別人訪問到的(有固定 ip 除外!),而且現在固定 ip 資源稀缺,運營商也不會隨便給你分配了,個人申請也挺難。

為什么需要內網穿透?

就我個人而已,需要用到內網穿透的原因:

一是方便訪問公司的內網環境,不喜歡使用遠程工具,挺麻煩的。
二是方便把個人電腦上的應用開放到外網進行訪問。

資源准備

  • 能上網的個人電腦一台;
  • 有公網 ip 的,個人雲服務器一台(阿里雲 or 騰訊雲);
  • 下載 frp 程序

考慮到 github 有些時候訪問不到,我這里分別下載了 Linux 系統 和 windows 系統的 frp 程序供大家使用:

版本:frp_0.38.0_linux_amd64.tar.gz frp_0.38.0_windows_amd64.zip

https://fenxiangdayuan.lanzouo.com/b00v3dsri 密碼: i0fp

環境搭建

frp 工作原理

frp 的應用程序是分服務端和客戶端的,服務器端的運行在有公網 ip 的服務器上,客戶端就運行在需要穿透的內網機器上就行。

兩端的程序運行起來之后,就會建立好通信的隧道,當我們訪問公網 ip+端口 時,就會映射到我們內網的機器上了。

服務端搭建

  • 把下載好的 frp 程序,上傳到我們雲服務器上解壓出來即可:
tar -xvzf frp_0.38.0_linux_amd64 #解壓
mv frp_0.38.0_linux_amd64 frp  #重命名一下
  • 進入到 frp 目錄下

image-20211204220122249

我們看到 frp 目錄下的一些文件,很明顯分為兩部分:

frpc 開頭的代表着客戶端使用;

frps 開頭的代表服務端使用;

.ini 結尾的文件是 frp 的配置文件,也是需要我們進行修改的文件。

  • 我們打開 frps.ini 配置文件查看

image-20211204220725021

里面就只有一個配置項,表示監聽服務器的 7000 端口,作為客戶端通信的入口;

在這里有一個注意的點,如果我們雲服務器沒開放這個端口的話,我們客戶端是無法和服務器進行通信的,這個時候我們需要在控制台的安全組規則中開放 7000 端口;

  • 一切准備就緒,我們啟動一下服務端的 frp 程序
frps -c frps.ini
frps -c frps.ini &  #后台運行

image-20211204221455871

看到服務端就正常啟動起來了,正在監聽 7000 端口;

這個時候我們繼續往下配置客戶端即可;

客戶端搭建

有了服務端的配置說明,配置客戶端也就是照貓畫虎,我們只需要關注 frpc 開頭的文件即可;

windows 和 Linux 的文件都一樣,只是運行的平台不同而已。

下面演示在我個人電腦虛擬機中的 Linux 系統,作為客戶端,frp 怎么配置;

  • 同樣的步驟,解壓下 Linux 版本的 frp ,然后打開 frpc.ini 文件:

image-20211204222420329

server_addr : 需要填寫上你個人雲服務器的公網 ip 地址,這個一定要填寫正確,不然無法和服務器進行通信;

server_port :就是服務器監聽的端口,默認可以不用修改;

這兩部分就是用來和我們服務器進行通信的配置。

[ssh] 這部分就是創建隧道,也就映射對應的應用,這里映射的是 ssh;

我們只需要關注 remote_port 這個配置就行,這里需要填寫你服務器上開放的端口,未開放的話,通過雲服務器控制台,安全組策略進行配置。

這里的意思就是把服務器的 6000 端口映射到內網機器的 22 端口上。

當我們訪問公網 ip + 6000 端口時,就會訪問到我們內網電腦 22 端口的應用,這里就是 ssh;

  • 配置好之后,接下來我們運行 frp 的客戶端程序
frpc -c frpc.ini

image-20211204223439870

圖中我們可以看到,客戶端啟動成功,也和我們的服務器建立了通信;

TCP 穿透

TCP 穿透的意思,就是通信協議類型為 TCP, 常見的 ssh、mysql等等

通過上面服務端和客戶端的配置,frp 就搭建成功了,對應 TCP 穿透的配置如下:

  • 服務端
[common]
bind_port = 7000
  • 客戶端
[common]
server_addr = 雲服務器ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

接下來我們就來測試下,是否能穿透成功,在我們服務器上進行連接我們內網的 Linux 系統:

ssh 127.0.0.1 -l root -p 6000

image-20211204224545282

從圖中我們可以看到,ssh 的穿透已經成功了,我們查看 ip 也是內網中的ip;

通過 TCP 的穿透,我們就可以利用它來穿我們公司內網的服務器了,從而在家里我們也能正常操作公司的內網環境。

HTTP 穿透

HTTP 穿透,也就是我們應用層面的通信協議,http協議;穿透它是為了方便我們訪問內網的 web 應用,例如我在內網機器,起了一個 tomcat 部署了一個網站,我想讓其他人外網的人來訪問我,那就需要進行 HTTP 的穿透;

對應的 frp 配置這時和 TCP 是有一點區別的,如下:

  • 服務端
[common]
bind_port = 7000
vhost_http_port = 80 #將服務器的 80 端口用作 http 協議的通信
vhost_https_port = 443 #進服務器的 443 端口用作 https 協議通信
privilege_token = token123456789 #frp的認證,對應的客戶也需要配置一樣,才可以進行通信
  • 客戶端
[common]
server_addr = 雲服務器ip
server_port = 7000
privilege_token = token123456789 #frp的認證

[web_http]
type=http #通信類型為http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = 二級域名/公網ip

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

http 的穿透,我們看到服務端和客戶端的配置文件都進行了改動,我們重點來看下客戶單中的配置;

type = http : 這個是因為我們想要創建的隧道是進行 http 通信的,也就是用來訪問本地 web 應用;

custom_domains = 二級域名/公網ip :這個配置一般使用一個二級域名來配置,用於通過域名來訪問你的穿透服務器,如果沒有域名,那么我們寫上一個服務器的公網 ip 也是可以的,用 ip 的話,在外網訪問的時候,就只能通過 ip 進行訪問了,效果都一樣;

下面我們看下效果:

  • 先在我內網電腦啟動一個 tomcat,監聽端口為:8080

image-20211204232323142

image-20211204232429648

可以看到,在我的內網物理機中訪問,是正常啟動了的;

  • 接着我們把 frp 客戶端和服務端進行連接上

image-20211204232654119

  • 成功連接之后,我們直接通過外網 ip 進行訪問

image-20211204232932778

可以看到,我直接用公網 ip 訪問,同樣能打開我們內網中的 tomcat 應用;

也證明了我們的 HTTP 穿透也是成功的。

注意事項

  • 客戶端的配置項,不同的隧道需要區分開,寫上不同的名字,如[ssh]、[mysql]、[web_http];

  • 客戶端中 remote_port 的端口號不能一樣,一樣會沖突;

  • 服務器映射的端口需要放開范圍,沒有放開會造成無法通信;

  • 服務端和客戶端都需要注意端口的沖突;

參考文章

frp 配置詳解:

https://www.cnblogs.com/sanduzxcvbnm/p/8508988.html

內網穿透不同工具(Ngrok、釘釘、花生殼、frp):

https://www.it235.com/實用工具/內網穿透/pierce.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM