天天看點

基于frp的web内網穿透服務

基于frp的web内網穿透服務

文章目錄

  • ​​**基于frp的web内網穿透服務**​​
  • ​​導言​​
  • ​​正文​​
  • ​​原理分析​​
  • ​​穿透過程​​
  • ​​frp下載下傳​​
  • ​​service端配置​​
  • ​​client端配置​​
  • ​​結束語​​

導言

在開始之前,想象一下,你現在有這樣的幾個問題: 假如,

  • 你有一台性能不錯的伺服器,磁盤空間很充足, 想做一個web服務,但是申請不到公網IP。
  • 遠端通過SSH連接配接、管理處于路由器之後的伺服器,
  • 遠端上傳檔案、從伺服器下載下傳檔案,實作檔案的共享。

衆所周知,要想讓網際網路的各個角落都能通路你的服務,你得先有一個公網IP,但是公網IP近年來也算是比較緊缺的資源了。有時候申請公網IP也并不是容易的事,尤其當你的網絡管理中心隸屬于學校、機構等的時候。這便是我最近遇到的一個問題。

俗話說,逢山開路,遇水架橋,是問題總會有辦法解決的。而解決上述問題的一個不錯方法就是使用frp(Fast everse proxy)進行内網穿透

正文

文章約定

進行frp内網穿透,你首先需要具有以下硬體支援

  • 處于内網/防火牆之後,需要提供服務的伺服器
  • 一台具有公網IP的伺服器

公網IP伺服器,需要你在網上進行購買,可以選擇華為雲、阿裡雲、騰訊雲等的輕量伺服器,也可以選擇一些價格便宜的VPS。

在這裡,我們約定,提供web服務的伺服器為client, 具有公網IP的伺服器為service。client和service端的作業系統可以是Linux、Windows等。這裡我們選擇client為Ubuntu, service為Windows進行講解。

原理分析

在正式開始之前,我們簡單了解一下内網穿透的原理。請看以下這張來自百度百科的原理圖。

基于frp的web内網穿透服務

簡單來說,幫助我們進行内網穿透的service端就像一個中轉站, 負責轉發我們請求以及web伺服器傳回的資料。因而,當我們通路我們的web服務時,其實最先通路的是提供穿透服務的service。

你可能注意到了一個問題,那就是流量的限制。因為所有的請求都會流經service端,因而,service端伺服器的帶寬影響着通路client端伺服器網頁、資料的速度。client與service伺服器的帶寬共同決定了web服務傳輸品質。

穿透過程

frp下載下傳

frp官方下載下傳位址: ​​Github項目直達​​

你一共需要下載下傳兩個檔案,一個用于service端,另一個用于client端,若service與client作業系統相同,下載下傳一個即可。

需要注意的是你需要根據的你的伺服器作業系統以及架構選擇正确的版本。

若你是Linux系統,你可以通過一下指令檢視架構

複制代碼 隐藏代碼arch      

若顯示x86_64, 選擇linux_arm64版本即可。

下載下傳完成以後将檔案解壓,client端删除含有frps關鍵字的檔案,service端删除含有frpc關鍵字的檔案。

service端配置

打開frps.ini檔案,清空原有的配置資訊,輸入一下資訊

複制代碼 隐藏代碼[common]
bind_port = 7000  
vhost_http_port = 80

dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password      

需要簡單的解釋一下

  • bind_port為與service端frp進行通信的端口
  • vhost_http_port用于開放web服務80端口
  • dashboard_port監控面闆的端口号
  • dashboard_user登入監控面闆的賬号
  • dashboard_pwd登入監控面闆的密碼

監控面闆是frp提供的一個額外的功能,像以上配置以後,你可以通過公網IP+監控端口号進行通路,檢視基礎的資料,例如通路次數,資料流量等。如果你不需要,删除最後三個配置即可。

配置完成以後,打開指令行,切換到frp所在目錄,并執行以下指令運作frp服務

複制代碼 隐藏代碼./frps.exe -c frps.ini      

client端配置

同service端一樣,首先清空原配置資訊,輸入一下資訊

複制代碼 隐藏代碼[common]
server_addr = 119.1.1.1
server_port = 7000

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

[web]
type = http
local_port = 80
custom_domains = 119.1.1.1, www.example.com      
  • server_addr為公網伺服器ip位址
  • server_port保持與service端的bind_port一緻即可
  • remote_port為自定義的通路内網ssh的端口号,如上,可通過119.1.1.1:6000發起與client的ssh連接配接
  • custom_domains 為所綁定公網伺服器的IP/域名, 隻有配置了的IP/域名才可以通路client端的web服務。多個域名/IP用英文逗号隔開。

配置完成以後,確定你目前的目錄在frp内,執行以下指令移動frp目錄,啟動frp服務

複制代碼 隐藏代碼sudo mkdir /srv/frp
sudo mv . /srv/frp

sudo touch frp.log

sudo nohup ./frpc -c frpc.ini > frp.log &      

這裡,以背景運作的方式啟動了frp client端服務,確定等你關掉指令行終端以後,你的frp服務程序不會随之被終結。

現在,在service與client端frp服務都正常運作以後,你還需要做一項工作: 配置伺服器安全組,開放對應的端口。

以上述為例,cilent端你需要開放22, 80端口,service端需要開放6000, 7000端口

現在你即可通過以下域名通路你的web服務

  • 119.1.1.1
  • www.example.com

你也可以通過119.1.1.1:6000端口與你的伺服器建立ssh連接配接。

最後提示一下,以上配置代碼中的相關端口都是采用的frp文檔推薦使用的。 建議修改為自己的,尤其是ssh服務的端口号,這樣可以減少ssh端口暴露,降低ssh爆破的風險。

結束語

  • client所有的流量都是經過frp進行轉發接收過來的,因而所有的通路IP源都将會是127.0.0.1,無論是Apache的web服務,還是ssh服務。Apache這一問題,可以通過相關的服務設定進行解決。ssh可以通過frp的stcp模式解決。
  • 如前面所說的,service端流量限制。frp支援多種模式/協定,例如tcp,tcp,udp,xtcp等。xtcp可以進行點對點轉發,也就是service與client建立連接配接之後,網頁請求的資料可以不經過service伺服器,client直接與目标用戶端通信。但遺憾的是,xtcp似乎不能用到web服務上面去。

繼續閱讀