前言
-
對於沒有公網 IP 的內網用戶來說,遠程管理或在外網訪問內網機器上的服務是一個問題。
-
今天給大家介紹一款好用內網穿透工具 FRP,FRP 全名:Fast Reverse Proxy。FRP 是一個使用 Go 語言開發的高性能的反向代理應用,可以幫助您輕松地進行內網穿透,對外網提供服務。FRP 支持 TCP、UDP、HTTP、HTTPS等協議類型,並且支持 Web 服務根據域名進行路由轉發。
FRP 項目地址:https://github.com/fatedier/frp
FRP 的作用
-
利用處於內網或防火牆后的機器,對外網環境提供 HTTP 或 HTTPS 服務。
-
對於 HTTP, HTTPS 服務支持基於域名的虛擬主機,支持自定義域名綁定,使多個域名可以共用一個 80 端口。
-
利用處於內網或防火牆后的機器,對外網環境提供 TCP 和 UDP 服務,例如在家里通過 SSH 訪問處於公司內網環境內的主機。
FRP 安裝
FRP 采用 Go 語言開發,支持 Windows、Linux、MacOS、ARM等多平台部署。FRP 安裝非常容易,只需下載對應系統平台的軟件包,並解壓就可用。
這里以 Linux 為例,為了方便管理我們把解壓后的目錄重命名為 frp :
wget https://github.com/fatedier/frp/releases/download/v0.15.1/frp_0.15.1_linux_amd64.tar.gz tar xzvf frp_0.15.1_linux_amd64.tar.gz mv frp_0.15.1_linux_amd64 frp
更多平台的軟件包下載地址:https://github.com/fatedier/frp/releases
FRP 服務端配置
配置 FRP 服務端的前提條件是需要一台具有**公網 IP **的設備,得益於 FRP 是 Go 語言開發的,具有良好的跨平台特性。你可以在 Windows、Linux、MacOS、ARM等幾乎任何可聯網設備上部署。
這里以 Linux 為例,FRP 默認給出兩個服務端配置文件,一個是簡版的 frps.ini,另一個是完整版本 frps_full.ini。
我們先來看看簡版的 frps.ini,通過這個配置可以快速的搭建起一個 FRP 服務端。
$ cat frps.ini [common] bind_port = 7000 默認配置中監聽的是 7000 端口,可根據自己實際情況修改。 啟動 FRP 服務端 $ ./frps -c ./frps.ini 2018/01/25 10:52:45 [I] [service.go:96] frps tcp listen on 0.0.0.0:7000 2018/01/25 10:52:45 [I] [main.go:112] Start frps success 2018/01/25 10:52:45 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues
通過上面簡單的兩步就可以成功啟動一個監聽在 7000 端口的 FRP 服務端。
FRP 客戶端配置
和 FRP 服務端類似,FRP 默認也給出兩個客戶端配置文件,一個是簡版的 frpc.ini,另一個是完整版本 frpc_full.ini。
這里同樣以簡版的 frpc.ini 文件為例,假設 FRP 服務端所在服務器的公網 IP 為 4.3.2.1。
$ vim frpc.ini [common] # server_addr 為 FRP 服務端的公網 IP server_addr = 4.3.2.1 # server_port 為 FRP 服務端監聽的端口 server_port = 7000 啟動 FRP 客戶端 $ ./frpc -c ./frpc.ini 2018/01/25 11:15:49 [I] [proxy_manager.go:284] proxy removed: [] 2018/01/25 11:15:49 [I] [proxy_manager.go:294] proxy added: [] 2018/01/25 11:15:49 [I] [proxy_manager.go:317] visitor removed: [] 2018/01/25 11:15:49 [I] [proxy_manager.go:326] visitor added: [] 2018/01/25 11:15:49 [I] [control.go:240] [83775d7388b8e7d9] login to server success, get run id [83775d7388b8e7d9], server udp port [0]
這樣就可以成功在 FRP 服務端上成功建立一個客戶端連接,當然現在還並不能對外提供任何內網機器上的服務,因為我們並還沒有在 FRP 服務端注冊任何內網服務的端口。
FRP 使用實例
下面我們就來看幾個常用的例子,通過這些例子來了解下 FRP 是如何實現內網服務穿透的。
通過 TCP 訪問內網機器
這里以訪問 SSH 服務為例, 修改 FRP 客戶端配置文件 frpc.ini 文件並增加如下內容:
$ cat frpc.ini [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 啟動 FRP 客戶端 $ ./frpc -c ./frpc.ini 2018/01/25 12:21:23 [I] [proxy_manager.go:284] proxy removed: [] 2018/01/25 12:21:23 [I] [proxy_manager.go:294] proxy added: [ssh] 2018/01/25 12:21:23 [I] [proxy_manager.go:317] visitor removed: [] 2018/01/25 12:21:23 [I] [proxy_manager.go:326] visitor added: [] 2018/01/25 12:21:23 [I] [control.go:240] [3b468a55191341cb] login to server success, get run id [3b468a55191341cb], server udp port [0] 2018/01/25 12:21:23 [I] [control.go:165] [3b468a55191341cb] [ssh] start proxy success
這樣就在 FRP 服務端上成功注冊了一個端口為 6000 的服務,接下來我們就可以通過這個端口訪問內網機器上 SSH 服務,假設用戶名為 mike:
$ ssh -oPort=6000 mike@4.3.2.1
通過自定義域名訪問部署於內網的 Web 服務
有時需要在公有網絡通過域名訪問我們在本地環境搭建的 Web 服務,但是由於本地環境機器並沒有公網 IP,無法將域名直接解析到本地的機器。
現在通過 FRP 就可以很容易實現這一功能,這里以 HTTP 服務為例:首先修改 FRP 服務端配置文件,通過 vhost_http_port 參數來設置 HTTP 訪問端口,這里將 HTTP 訪問端口設為 8080。
$ vim frps.ini [common] bind_port = 7000 vhost_http_port = 8080 啟動 FRP 服務端 $ ./frps -c ./frps.ini 2018/01/25 13:33:26 [I] [service.go:96] frps tcp listen on 0.0.0.0:7000 2018/01/25 13:33:26 [I] [service.go:125] http service listen on 0.0.0.0:8080 2018/01/25 13:33:26 [I] [main.go:112] Start frps success 2018/01/25 13:33:26 [I] [main.go:114] PrivilegeMode is enabled, you should pay more attention to security issues 其次我們在修改 FRP 客戶端配置文件並增加如下內容: $ vim frpc.ini [web] type = http local_port = 80 custom_domains = **.***.com 這里通過 local_port 和 custom_domains 參數來設置本地機器上 Web 服務對應的端口和自定義的域名,這里我們分別設置端口為 80,對應域名為 **.***.com。 啟動 FRP 客戶端 $ ./frpc -c ./frpc.ini 2018/01/25 13:56:11 [I] [proxy_manager.go:284] proxy removed: [] 2018/01/25 13:56:11 [I] [proxy_manager.go:294] proxy added: [web ssh] 2018/01/25 13:56:11 [I] [proxy_manager.go:317] visitor removed: [] 2018/01/25 13:56:11 [I] [proxy_manager.go:326] visitor added: [] 2018/01/25 13:56:11 [I] [control.go:240] [296fe9e31a551e07] login to server success, get run id [296fe9e31a551e07], server udp port [0] 2018/01/25 13: