推薦一款很好用的內網穿透工具-FRP
今天給大家介紹另一款好用內網穿透工具 , 全名:Fast Reverse Proxy。 是一個使用 語言開發的高性能的反向代理應用,可以幫助您輕鬆地進行內網穿透,對外網提供服務。 支持 、、、等協議類型,並且支持 服務根據域名進行路由轉發。
FRP 項目地址:https://github.com/fatedier/frp
FRP 的作用
FRP 架構
FRP 安裝
採用 語言開發,支持 、、、等多平台部署。 安裝非常容易,只需下載對應系統平台的軟體包,並解壓就可用了。
這裡以 為例,為了方便管理我們把解壓後的目錄重命名為 frp :
更多平台的軟體包下載地址:https://github.com/fatedier/frp/releases
FRP 配置FRP 服務端配置
配置 服務端的前提條件是需要一台具有公網 的設備,得益於 是 語言開發的,具有良好的跨平台特性。你可以在 、、、等幾乎任何可聯網設備上部署。
這裡以 為例, 默認給出兩個服務端配置文件,一個是簡版的 frps.ini,另一個是完整版本 frps_full.ini。
我們先來看看簡版的 frps.ini,通過這個配置可以快速的搭建起一個 FRP 服務端。
啟動 FRP 服務端
通過上面簡單的兩步就可以成功啟動一個監聽在 7000 埠的 服務端。
FRP 客戶端配置
和 FRP 服務端類似, 默認也給出兩個客戶端配置文件,一個是簡版的 frpc.ini,另一個是完整版本 frpc_full.ini。
這裡同樣以簡版的 frpc.ini 文件為例,假設 FRP 服務端所在伺服器的公網 為 4.3.2.1。
啟動 FRP 客戶端
這樣就可以成功在 服務端上成功建立一個客戶端連接,當然現在還並不能對外提供任何內網機器上的服務,因為我們並還沒有在 服務端註冊任何內網服務的埠。
FRP 使用實例
下面我們就來看幾個常用的例子,通過這些例子來了解下 FRP 是如何實現內網服務穿透的。
通過 TCP 訪問內網機器
這裡以訪問 服務為例, 修改 FRP 客戶端配置文件 frpc.ini 文件並增加如下內容:
啟動 FRP 客戶端
這樣就在 服務端上成功註冊了一個埠為 6000 的服務,接下來我們就可以通過這個埠訪問內網機器上 服務,假設用戶名為 mike:
通過自定義域名訪問部署於內網的 Web 服務
有時需要在公有網路通過域名訪問我們在本地環境搭建的 服務,但是由於本地環境機器並沒有公網 ,無法將域名直接解析到本地的機器。
現在通過 就可以很容易實現這一功能,這裡以 服務為例:首先修改 服務端配置文件,通過 參數來設置 訪問埠,這裡將 訪問埠設為 8080。
啟動 FRP 服務端
其次我們在修改 客戶端配置文件並增加如下內容:
這裡通過 和 參數來設置本地機器上 服務對應的埠和自定義的域名,這裡我們分別設置埠為 80,對應域名為 。
啟動 FRP 客戶端
最後將 的域名 A 記錄解析到 伺服器的公網 上,現在便可以通過 這個 訪問到處於內網機器上對應的 服務。
通過密碼保護你的 Web 服務
由於所有客戶端共用一個 服務端的 服務埠,任何知道你的域名和 的人都能訪問到你部署在內網的 服務,但是在某些場景下需要確保只有限定的用戶才能訪問。
支持通過 HTTP Basic Auth 來保護你的 服務,使用戶需要通過用戶名和密碼才能訪問到你的服務。需要實現此功能主要需要在 客戶端的配置文件中添加用戶名和密碼的設置。
這時訪問 這個 URL 時就需要輸入配置的用戶名和密碼才能訪問。
給 Web 服務增加自定義二級域名
在多人同時使用一個 服務端實現 服務時,通過自定義二級域名的方式來使用會更加方便。
通過在 服務端的配置文件中配置 參數就可以啟用該特性。之後在 客戶端的 http、https 類型的代理中可以不配置 ,而是配置一個 參數。
然後只需要將 解析到 服務端所在伺服器。之後用戶可以通過 自行指定自己的 服務所需要使用的二級域名,並通過 來訪問自己的 服務。
首先我們在 服務端配置 參數:
其次在 客戶端配置文件配置 參數:
然後將泛域名 *.hi-linux.com 解析到 服務端所在伺服器的公網 地址。FRP 服務端 和 FRP 客戶端都啟動成功後,通過 就可以訪問到內網的 服務。
修改 Host Header
通常情況下 不會修改轉發的任何數據。但有一些後端服務會根據 請求 中的 host 欄位來展現不同的網站,例如 的虛擬主機服務,啟用 host-header 的修改功能可以動態修改 請求中的 host 欄位。
實現此功能只需要在 FRP 客戶端配置文件中定義 參數。
原來 請求中的 host 欄位 轉發到後端服務時會被替換為 。
URL 路由
支持根據請求的 路徑路由轉發到不同的後端服務。要實現這個功能可通過 客戶端配置文件中的 欄位來指定。
按照上述的示例配置後, 這個域名下所有以 /news 以及 /about 作為前綴的 請求都會被轉發到後端 web02 所在的後端服務,其餘的請求會被轉發到 web01 所在的後端服務。
通過 UDP 訪問內網機器
查詢請求通常使用 協議, 支持對內網 服務的穿透,配置方式和 基本一致。這裡以轉發到 Google 的 查詢伺服器 8.8.8.8 的 埠為例。
首先修改 FRP 客戶端配置文件,並增加如下內容:
其次重新啟動 客戶端:
最後通過 命令測試 包轉發是否成功,預期會返回 域名的解析結果:
轉發 Unix 域套接字
通過 埠訪問內網的 域套接字,這裡以和本地機器上的 Docker Daemon 通信為例。
首先修改 客戶端配置文件,並增加如下內容:
這裡主要是使用 和 兩個參數啟用了 插件和配置對應的套接字路徑。
其次重新啟動 客戶端:
最後通過 命令查看 版本信息進行測試:
FRP 高級進階給 FRP 服務端增加一個 Dashboard
通過 可以方便的查看 的狀態以及代理統計信息展示,要使用這個功能首先需要在 服務端配置文件中指定 服務使用的埠:
其次重新啟動 FRP 服務端:
最後通過 訪問 Dashboard 界面,用戶名密碼默認都為 admin。
給 FRP 服務端加上身份驗證
默認情況下只要知道 服務端開放的埠,任意 客戶端都可以隨意在服務端上註冊埠映射,這樣對於在公網上的 服務來說顯然不太安全。 提供了身份驗證機制來提高 服務端的安全性。要啟用這一特性也很簡單,只需在 服務端和 客戶端的 common 配置中啟用 參數就行。
啟用這一特性後,只有 服務端和 客戶端的 common 配置中的 參數一致身份驗證才會通過, 客戶端才能成功在 服務端註冊埠映射。否則就會註冊失敗,出現類似下面的錯誤:
需要注意的是 客戶端所在機器和 服務端所在機器的時間相差不能超過 15 分鐘,因為時間戳會被用於加密驗證中,防止報文被劫持後被其他人利用。這個超時時間可以在配置文件中通過 這個參數來修改,單位為秒,默認值為 900,即 15 分鐘。如果修改為 0,則 服務端將不對身份驗證報文的時間戳進行超時校驗。
FRP 客戶端熱載入配置文件
當修改了 客戶端中的配置文件,從 0.15 版本開始可以通過 命令來動態載入配置文件,通常會在 10 秒內完成代理的更新。
啟用此功能需要在 客戶端配置文件中啟用 admin 埠,用於提供 服務。配置如下:
重啟 客戶端,以後就可通過熱載入方式進行 客戶端配置變更了。
等待一段時間後客戶端會根據新的配置文件創建、更新、刪除代理。
啟用 後,還可以通過 命令在 FRP 客戶端很方便的查看當前代理狀態信息。
給 FRP 服務端增加埠白名單
為了防止 埠被濫用, 提供了指定允許哪些埠被分配的功能。可通過 服務端的配置文件中 參數來指定:
可以配置允許使用的某個指定埠或者是一個範圍內的所有埠,以 , 分隔,指定的範圍以 - 分隔。
當使用不允許的埠註冊時,就會註冊失敗。出現類似以下錯誤:
啟用 TCP 多路復用
從 v0.10.0 版本開始,客戶端和伺服器端之間的連接支持多路復用,不再需要為每一個用戶請求創建一個連接,使連接建立的延遲降低,並且避免了大量文件描述符的佔用,使 可以承載更高的並發數。
該功能默認啟用,如需關閉可以在 服務端配置文件和 客戶端配置文件中配置,該配置項在服務端和客戶端必須一致:
FRP 底層通信啟用 KCP 協議
FRP 從 v0.12.0 版本開始,底層通信協議支持選擇 協議,在弱網路環境下傳輸效率會提升明顯,但是會有一些額外的流量消耗。
要開啟 協議支持,首先要在 服務端配置文件中啟用 協議支持:
其次是在 客戶端配置文件指定需要使用的協議類型,目前只支持 和 。其它代理配置不需要變更:
給 FRP 服務端配置連接池
默認情況下,當用戶請求建立連接後, 服務端才會請求 客戶端主動與後端服務建立一個連接。
當為指定的 服務端啟用連接池功能後, 會預先和後端服務建立起指定數量的連接,每次接收到用戶請求後,會從連接池中取出一個連接和用戶連接關聯起來,避免了等待與後端服務建立連接以及 客戶端 和 服務端之間傳遞控制信息的時間。
首先需要在 服務端配置文件中設置每個代理可以創建的連接池上限,避免大量資源佔用,客戶端設置超過此配置後會被調整到當前值:
其次在 客戶端配置文件中為客戶端啟用連接池,指定預創建連接的數量:
加密與壓縮
如果公司內網防火牆對外網訪問進行了流量識別與屏蔽,例如禁止了 協議等,可通過設置 use_encryption = true,將 客戶端 與 服務端之間的通信內容加密傳輸,將會有效防止流量被攔截。
如果傳輸的報文長度較長,通過設置 use_compression = true 對傳輸內容進行壓縮,可以有效減小 客戶端 與 服務端之間的網路流量,來加快流量轉發速度,但是會額外消耗一些 CPU 資源。
這兩個功能默認是不開啟的,需要在 客戶端配置文件中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮演算法使用的是 snappy。
通過 FRP 客戶端代理其它內網機器訪問外網
客戶端內置了 和 插件,通過這兩個插件可以使其它內網機器通過 客戶端的的網路訪問互聯網。
要啟用此功能,首先需要在 客戶端配置文件中啟用相關插件,這裡以 插件為例:
其次將需要通過這個代理訪問外網的內部機器的代理地址設置為 4.3.2.1:6000,這樣就可以通過 FRP 客戶端機器的網路訪問互聯網了。
通過代理連接 FRP 服務端
在只能通過代理訪問外網的環境內, 客戶端支持通過 參數來配置代理和 服務端進行通信。要使用此功能可以通過設置系統環境變數 或者通過在 客戶端的配置文件中設置 參數來使用此功能。
安全地暴露內網服務
對於一些比較敏感的服務如果直接暴露於公網上將會存在安全隱患, 也提供了一種安全的轉發方式 。使用 (secret tcp) 類型的代理可以避免讓任何人都能訪問到穿透到公網的內網服務,要使用 模式訪問者需要單獨運行另外一個 客戶端。
下面就以創建一個只有自己能訪問到的 服務代理為例, 服務端和其它的部署步驟相同,主要區別是在 客戶端上。
首先配置 客戶端,和常規 轉發不同的是這裡不需要指定遠程埠。
其次在要訪問這個服務的機器上啟動另外一個 客戶端,配置如下:
最後在本機啟動一個 客戶端,這樣就可以通過本機 6005 埠對內網機器 服務進行訪問,假設用戶名為 mike:
點對點內網穿透
在傳輸大量數據時如果都經過伺服器中轉的話,這樣會對伺服器端帶寬壓力比較大。 提供了一種新的代理類型 來解決這個問題, 模式下可以在傳輸大量數據時讓流量不經過伺服器中轉。
使用方式同 類似,需要在傳輸數據的兩端都部署上 客戶端上用於建立直接的連接。
首先在 服務端配置上增加一個 埠用於支持該類型的客戶端:
其次配置 客戶端,和常規 轉發不同的是這裡不需要指定遠程埠。
然後在要訪問這個服務的機器上啟動另外一個 客戶端,配置如下:
最後在本機啟動一個 FRP 客戶端,這樣就可以通過本機 6006 埠對內網機器 SSH 服務進行訪問,假設用戶名為 mike:
FRP 管理
的部署安裝比較簡單,項目官方也沒有提供相應的管理腳本。不過好在開源項目總是有網友熱心提供部署和管理腳本。如果你覺得手動部署太麻煩,還可以使用下面的一鍵安裝腳本。
項目地址:https://github.com/clangcn/onekey-install-shell/
下載一鍵部署腳本
安裝 FRP 服務端
這個一鍵部署腳本比較好用,為了提高國內用戶下載安裝包速度還提供了阿里雲節點的安裝源。整個腳本使用起來也比較簡單,對一些常用的 服務端配置參數都做了互動式選擇讓用戶可以方便的根據自己實際情況進行選擇。腳本比較貼心的一點是對默認的公網地址進行了檢測,省去了手動輸入的麻煩。
配置 FRP 服務端
更新 FRP 服務端
卸載 FRP 服務端
FRP 服務端日常管理
服務端安裝完成後,一鍵部署腳本還提供了一個日常管理 服務端的管理腳本來進行日常的啟動、重啟、停止等操作,非常的方便。
參考文檔
http://www.google.com
https://github.com/fatedier/frp
http://koolshare.cn/thread-65379-1-1.html
今日思想
人不因財富、職位、權力的不同,而存在人格上的不同。
——佚名


TAG:運維之美 |