使用frp搭建內網穿透

內網穿透的概念

內網穿透,即NAT穿透,網絡鏈接時術語,計算機是局域網內時,外網與內網的計算機節點須要鏈接通訊,有時就會出現不支持內網穿透。——來自百度百科。html

簡單來講,就是讓互聯網(外網)的設備能訪問局域網(內網)的設備提供的服務,這裏的設備一般是電腦。linux

內網穿透的應用場景

對開發人員來講,一個典型的應用場景就是針對第三方受權(一般是oauth2.0)和支付回調的開發調試。經過內網穿透工具將第三方SDK的回調地址映射到本機開發環境,從而實現實時調式。git

其次是節約部署成本(一般是公網服務器費用)。經過將應用部署在本機,再利用內網穿透工具對外提供服務,這樣就能,既節約服務器租用費用,又能提高服務器的硬件配置。github

本文適用於第一種狀況,即低頻率開發調式用。web

內網穿透的搭建工具

一、ngrok

這是一個國外的穿透工具,1.0版本是開源的,目前2.0以上版本已經閉源,而且提供免費和收費的服務。windows

二、frp

這是一個國內的開源工具,目前最新版本爲0.26.0,有比較詳盡的中文文檔,而且一直在維護更新。瀏覽器

因爲frp一直開源,而且維護積極、更新頻繁,再加上中文文檔加持,本文最終選擇了frp做爲搭建工具。安全

注:frp自主搭建須要一個有公網ip的服務器,本文使用阿里雲ECS。服務器

frp下載和版本選擇

官方github release地址,目前最新版本是0.26.0網絡

版本選擇說明:

  • frp_0.26.0_darwin_amd64.tar.gz —— 適用於Mac OS系統
  • frp_0.26.0_freebsd_386.tar.gz —— 適用於FreeBSD 32位系統
  • frp_0.26.0_freebsd_amd64.tar.gz —— 適用於FreeBSD 64位系統
  • frp_0.26.0_linux_386.tar.gz —— 適用於Linux 32位系統
  • frp_0.26.0_linux_amd64.tar.gz —— 適用於Linux 64位系統
  • frp_0.26.0_linux_arm.tar.gz —— 適用於Linux 32位嵌入式系統
  • frp_0.26.0_linux_arm64.tar.gz —— 適用於Linux 64位嵌入式系統
  • frp_0.26.0_linux_mips.tar.gz
  • frp_0.26.0_linux_mips64.tar.gz
  • frp_0.26.0_linux_mips64le.tar.gz
  • frp_0.26.0_linux_mipsle.tar.gz
  • frp_0.26.0_windows_386.zip —— 適用於Windows 32位系統
  • frp_0.26.0_windows_amd64.zip —— 適用於Windows 64位系統

本文服務器系統爲CentOS7 64位,選擇了frp_0.26.0_linux_adm64.tar.gz;本機系統爲Mac OS X,因而選擇了frp_0.26.0_darwin_amd64.tar.gz。

下載方式:

一、直接點擊連接,使用瀏覽器下載到本機。利用ssh工具鏈接到阿里雲ECS,再使用lrzsz工具的rz命令將frp_0.26.0_linux_amd64.tar.gz上傳到服務器,而壓縮包frp_0.26.0_darwin_amd64.tar.gz直接在本機解壓。

注:ssh工具、lrzsz實用工具的安裝和用法可自行搜索。

二、終端命令方式

2.一、服務器

使用wget下載

wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz

解壓

tar -xzvf frp_0.26.0_linux_amd64.tar.gz

2.二、本機

使用curl下載

curl -O https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_darwin_amd64.tar.gz

解壓

tar -xzvf frp_0.26.0_darwin_amd64.tar.gz

frp壓縮包文件說明

每一個壓縮包解壓後都包含如下文件和一個systemd文件夾:

  • frpc —— 客戶端可執行二進制文件
  • frpc_full.ini —— 包含所有配置項的客戶端配置文件
  • frpc.ini —— 客戶端使用的配置文件,包含最簡配置
  • frps —— 服務端可執行二進制文件
  • frps_full.ini —— 包含所有配置項的服務端配置文件
  • frps.ini —— 服務端使用的配置文件,包含最簡配置
  • systemd —— 文件夾,用於將frpc和frps添加爲服務的配置,linux下使用systemd做爲守護程序、mac os使用launchd做爲守護程序

注:服務端只需用到frp_0.26.0_linux_amd64目錄下的frps相關文件,本機(客戶端)只需用到frp_0.26.0_darwin_amd64目錄下的frpc相關文件。

服務端配置和啓動

一、在服務器上打開frps.ini:

vi frps.ini

注:確保當前已進入工做目錄/root/frp_0.26.0_linux_amd64/。

二、配置frps要監聽的端口:按下i進入編輯模式,在末尾增長一行:vhost_http_port = 8080,使frps.ini最終配置以下:

[common]
bind_port = 7000
vhost_http_port = 8080

注:vhost_http_port監聽的端口不能被佔用,不然會致使frps不能啓動,端口可根據實際須要修改;bind_port端口爲frp服務端和客戶端鏈接通訊的端口,默認爲7000。

三、保存配置並退出:按下Esc,輸入:wq。

四、啓動frps程序:

./frps -c ./frps.ini

注:如遇permission denied錯誤,代表frps可能沒有運行權限,則先賦權:

chmod 700 frps

而後再次執行啓動命令。

客戶端配置和啓動

一、在本機進入frp_0.26.0_darwin_amd64目錄,打開frpc.ini文件;

二、以配置訪問內網的web服務(常見情形)爲例,最終修改frpc.ini以下:

[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_ip = 127.0.0.1
local_port = 3000

注:x.x.x.x爲運行frps的服務器公網ip,local_port爲本機啓動web服務對應的端口,請根據實際狀況修改。

三、啓動frpc程序:

sudo ./frpc -c ./frpc.ini

注:此時frpc會經過7000端口嘗試與frps創建通訊鏈接,若是一切順利,則終端會提示鏈接成功;但實際狀況卻顯示鏈接失敗,由於還少了兩個步驟:

1、須要登陸阿里雲控制檯將7000端口加入阿里雲ECS安全組的入站規則裏面,同理還需將8080端口加入。具體操做參考:添加安全組規則

2、將7000和8080加入服務器防火牆規則,具體操做參考:CentOS7使用firewalld打開關閉防火牆與端口

當一切就緒,frpc啓動並鏈接成功後,打開瀏覽器輸入http://x.x.x.x:8080就能訪問到本機http://127.0.0.1:3000的服務(固然本機web服務須要處於啓動狀態)。

至此,一個最簡配置的基於frp的內網穿透便搭建完成,更多配置和用法,請參考官方文檔:frp官方中文文檔

擴展:將服務端frps添加爲service

經過上面在終端直接啓動frps的方式,會佔用終端,而且中止和重啓等管理操做也不方便。

爲了方便管理frps的啓動、中止、重啓和開機自啓,咱們須要將frps添加爲系統service,經過systemd守護程序來管理。

在frp_0.26.0_linux_amd64目錄裏的systemd目錄下,已經爲咱們準備好了添加service的模板:

  • frpc.service
  • frpc@.service
  • frps.service —— 服務端使用此模板
  • frps@.service

一、進入目錄/root/frp_0.26.0_linux_amd64/systemd,編輯frps.service:

cd /root/frp_0.26.0_linux_amd64/systemd
vi frps.service

二、將user=nobody改成user=root,並保存;

注:root表示運行frps的用戶。

三、其中服務運行配置項爲:ExecStart=/usr/bin/frps -c /etc/frp/frps.ini,咱們須要將二進制文件frps複製或移動到到/usr/bin目錄,配置文件frps.ini複製或移動到/etc/frp目錄,而/etc/frp目錄不存在,須要手動建立一個。

3.一、複製frps到/usr/bin目錄:

cp ~root/frp_0.26.0_linux_amd64/frps /usr/bin

3.二、建立frp目錄,並複製frps.ini到/etc/frp目錄:

cd /etc
mkdir frp
cp ~root/frp_0.26.0_linux_amd64/frps.ini /etc/frp

四、將frps.service移動到/etc/systemd/system目錄:

mv ~root/frp_0.26.0_linux_amd64/systemd/frps.service /etc/systemd/system

五、完成以上步驟,咱們就能夠愉快使用systemctl管理frps了:

啓動frps:

systemclt start frps

中止frps:

systemclt stop frps

重啓frps:

systemctl restart frps

查看frps狀態:

systemctl status frps

開機啓動frps:

systemctl enable frps

一樣地本機也能夠經過這種方式將客戶端程序frpc添加爲service進行管理,不一樣的是Mac OS使用的是launchd而非systemd來管理,具體操做方法請自行搜索,但若是僅僅是做爲開發調試的低頻使用目的,彷彿沒有必要將客戶端添加到frpc,畢竟終端一條啓動命令就能夠搞定。更多實戰經驗分享請參考:個人我的博客

相關文章
相關標籤/搜索