雲服務器 frp 內網穿透配置說明

公司內網服務器有演示環境,同時技術人員出差需要在客戶現場進行演示,於是學習使用 frp 做的內網穿透。frp 是用 Go 語言開發的,可用於內網穿透的高性能反向代理應用,支持 tcp、udp、http 和 https。可將一個部署在本機的 web 服務映射到外網。

本文主要講如何基於 frp + nginx 配置 http 內網穿透服務,承載多人同時使用。通過 frp 的運行原理入手,介紹 frp 服務端和客戶端配置說明及後續延展功能。

整體概述

frp 是一個內網穿透工具,它可以讓本地局域網的機器暴露到公網,簡單地說就是在世界的任何地方,你都可以訪問家裏開着的電腦。frp 支持 tcp、udp、http、https,就是說不僅僅限於本地 web 服務器可以暴露,整臺機器都可以暴露,windows 的遠程控制,mac 和 linux 的 ssh 都可以被暴露。

1 名詞解釋

1.frp:frp 是一個高性能的反向代理應用,可以幫助您輕鬆地進行內網穿透,對外網提供服務,支持 tcp、udp、http、https 等協議類型,並且 web 服務支持根據域名進行路由轉發。frp 內網穿透主要用於沒有公網 IP 的用戶,實現遠程桌面、遠程控制路由器、 搭建的 WEB、FTP、SMB 服務器被外網訪問、遠程查看攝像頭、調試一些遠程的 API(比如微信公衆號,企業號的開發)等。

2.Nginx:Nginx 是十分輕量級的 HTTP 服務器,是一個高性能的 HTTP 和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器。目前有很多國內網站採用 Nginx 作爲 Web 服務器,如國內知名的公司新浪、163、騰訊、Discuz、豆瓣等。

2 原理說明

框圖說明:

  1. 配置無誤的情況下,frp 服務端和 frp 客戶端先後啓動,建立通信隧道,其中:

1)frp 服務端監聽 http 81 端口(此端口可自定義),接收此端口下所有外網用戶請求,同時使用 nginx 代理 81 端口;

2)frp 客戶端代理本地想要暴露給外網的 web 服務端口,例如 9090 端口,同時使用 nginx 代理 9090 端口;

  1. 通過配置在 frp 服務端 nginx 反向代理,將指向本臺公網服務器的 xxx.yyy.com 域名映射到服務器的 81 端口,也就是 frp 監聽的那個端口。外網用戶訪問 xxx.yyy.com 域名,等同於訪問 192.168.1.247:81,會觸發 frp 服務端和客戶端的互動,從而 http 請求由 frp 服務端傳遞到 frp 客戶端;

3.frp 客戶端收到 http 請求後,基於 nginx 配置,監聽到 http 請求,則將請求轉發到我本地的 9090web 服務端口;

  1. 本地的 web 服務收到 http 請求後,對請求做處理,並完成響應;

5.frp 客戶端將響應結果回傳給 frp 的服務端。服務端最終將響應回傳給外網用戶;

  1. 最終的實測效果爲:

訪問 xxx.yyy.com 等同於訪問我本地的 localhost:9090。

3 適用場景

  1. 在辦公室訪問家裏的電腦,反之亦然;

  2. 自己電腦上的項目,方便發給客戶朋友演示。比如我做了個小網站,發給朋友看看未上線版本,發個 url 給他就好了;

  3. 調試一些需要遠程調用的程序,遠程調用比如微信的 API 回調接口。因爲我有外網地址就不需要部署在公網服務器,直接進行本地調試。

安裝準備

可以根據需求下載對應的文件版本,推薦使用 Windows_amd64 和 Linux_amd64 版本,具體還需要根據配置情況。

下載鏈接:https://github.com/fatedier/frp/releases

1 資源介紹

frp 主要由客戶端(frpc)和服務端(frps)組成,服務端通常部署在具有公網 IP 的機器上,客戶端通常部署在需要穿透的內網服務所在機器上。

在客戶端使用的都是 frpc * 名的文件,在服務端使用的都是 frps * 名的文件。

2 部署規劃

nginx 部署路徑:

/usr/local/nginx-1.14

frp 部署路徑:

/opt/tools/frp_0.37.1_linux_amd64

  1. 公網服務器:

  1. 內網服務器:

3 開機自啓

使用 systemctl 來控制啓動,這個方法比較好用,很方便。注意服務端是 frps.service,客戶端是 frpc.service。

  1. 服務端:

vi /lib/systemd/system/frps.service

在 frps.service 裏寫入以下內容:

啓動 frps:

systemctl start frps

重啓 frps:

systemctl restart frps

停止 frps:

systemctl stop frps

查看狀態:

systemctl status frps

  1. 客戶端:

vi /lib/systemd/system/frpc.service

對 frpc 操作命令同服務端相同。

配置步驟

開始配置內網穿透,分爲四個部分,服務端的 nginx 和 frp,客戶端的 nginx 和 frp,下面按照從用戶訪問到 web 服務的流程順序把配置貼出來,方便粘貼調整。

1 服務端 nginx

服務端 nginx 配置如下:

2 服務端配置

服務端 frp 配置如下:

3 客戶端 nginx

客戶端 nginx 配置如下:

4 客戶端配置

客戶端 frp 配置如下:

5 訪問效果

瀏覽器輸入:http://xxx.yyy.com

擴充延展

由於時間原因下面一些重要的功能配置還沒有驗證,這裏給出一些思路,方便後續抽出時間驗證測試。

1 安全策略

  1. 服務本身的密碼安全性,例如如果遠程桌面,那麼選一個長密碼是不可忽略的,還可以設定不使用密碼只使用私鑰登錄。遠程桌面那種可以用長密碼登錄。爲了安全,也可以專門建立一個權限小的帳號用於遠程登錄,把管理員帳號遠程登錄權限禁止掉;

  2. 不要在內網機器本機上運行 frp,例如內網有 A、B 兩臺機器,互相可以訪問,如果重要機器是 A,那麼可以把 FRP 放在不重要的機器 B 上面,在 FRP 的 local_ip 那邊設置爲 A 地址即可。這樣做的好處是可以在服務中認定 B 機器地址來的訪問爲外部訪問,專門設置安全措施。反過來,如果直接放在 A 上,那麼所有 frp 過來的操作都會被本地服務認定爲 A 機器本身發起的,某些數據庫軟件直接就給 127.0.0.1 的本地 IP 管理員特權;

  3. 多做時間審查。SSH 登錄是有記錄的。偶爾查看一下 SSH 的成功和失敗登錄記錄。至少可以看看近期有沒有人對你的服務器感興趣。

2 多客戶端

用一個 frps 連接多個 frpc, 原理上多個 frpc 和 frps 綁定同一個端口,但是多個 frpc 用不同的 remote_port 連接。

第一個 frpc.ini 配置:

第二個 frpc.ini 配置:

兩臺機器都綁定的 7000 端口,但是遠程連接的端口不同

第一臺機器連接

ssh pi@49.223.83.111 -p 6000

第二臺機器連接

ssh pi@49.223.83.111 -p 6001

3 線程配置

默認情況下,當用戶請求建立連接後,frps 纔會請求 frpc 主動與後端服務建立一個連接。當爲指定的代理啓用連接池後,frp 會預先和後端服務建立起指定數量的連接,每次接收到用戶請求後,會從連接池中取出一個連接和用戶連接關聯起來,避免了等待與後端服務建立連接以及 frpc 和 frps 之間傳遞控制信息的時間。這一功能比較適合有大量短連接請求時開啓

首先可以在 frps.ini 中設置每個代理可以創建的連接池上限,避免大量資源佔用,客戶端設置超過此配置後會被調整到當前值:

在 frpc.ini 中爲客戶端啓用連接池,指定預創建連接的數量:

配置心得

網絡的本地本來是應該互聯互通的,但各種各樣的原因會導致互聯互不通。於是就需要造輪子解決它,frp 就是這樣一個輪子,開源、免費、簡單易用。下面說說自己的收穫。

1 知識收穫

在學習了 frp 的知識後,明白想要訪問局域網中的 web 服務不是隻能通過 vpn 等工具纔行,使用 frp 做內網穿透同樣可以。frp 支持 tcp、udp、http、https 等協議類型,這些足夠我們日常工作使用。使用 frp 工具有以下優勢:

  1. 利用處於內網或防火牆後的機器,對外網環境提供 HTTP 或 HTTPS 服務;

  2. 對於 http, https 服務支持基於域名的虛擬主機,支持自定義域名綁定,使多個域名可以共用一個 80 端口;

  3. 利用處於內網或防火牆後的機器,對外網環境提供 tcp 和 udp 服務,例如在家裏通過 ssh 訪問處於公司內網環境內的主機。

2 技能提升

通過對 frp 的學習和擴展資料的瞭解,我學到了很多之前沒有接觸過的知識與技術。比如 frp 是什麼,它是通過什麼方式使 frp 內外服務器的連接訪問,子域名的使用方法,此外還使用 frp 技術對 nginx 的配置加深了印象。使我在技術池中又開闢了一塊新空間。

3 心得總結

最開始領導交代要使用 frp 內網穿透時,感覺沒什麼難度,認爲就是在服務端和客戶端上安裝 frp 軟件,上網找找配置文檔。但實際對於沒有接觸過內網穿透的人來說,還是有些困難的,特別是在配置時需要注意一些細節。這件事讓我認識到每一項工作內容都能使自己得到新的收穫,只有用心才能做好

對於新軟件的學習,不能停留在實現功能的層面上,要多往深處探索。在後續工作過程中,要抽時間研究 frp 的擴展功能,比如安全、多客戶端接入、壓測等方面。一方面可以讓我對於 frp 深入瞭解,另一方面也促使我發散思維,全面思考

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/oU1MVIlBZ50yhk3fZttBXw