內網穿透,即NAT穿透,網絡鏈接時術語,計算機是局域網內時,外網與內網的計算機節點須要鏈接通訊,有時就會出現不支持內網穿透。——來自百度百科。html
簡單來講,就是讓互聯網(外網)的設備能訪問局域網(內網)的設備提供的服務,這裏的設備一般是電腦。linux
對開發人員來講,一個典型的應用場景就是針對第三方受權(一般是oauth2.0)和支付回調的開發調試。經過內網穿透工具將第三方SDK的回調地址映射到本機開發環境,從而實現實時調式。git
其次是節約部署成本(一般是公網服務器費用)。經過將應用部署在本機,再利用內網穿透工具對外提供服務,這樣就能,既節約服務器租用費用,又能提高服務器的硬件配置。github
本文適用於第一種狀況,即低頻率開發調式用。web
這是一個國外的穿透工具,1.0版本是開源的,目前2.0以上版本已經閉源,而且提供免費和收費的服務。windows
這是一個國內的開源工具,目前最新版本爲0.26.0,有比較詳盡的中文文檔,而且一直在維護更新。瀏覽器
因爲frp一直開源,而且維護積極、更新頻繁,再加上中文文檔加持,本文最終選擇了frp做爲搭建工具。安全
注:frp自主搭建須要一個有公網ip的服務器,本文使用阿里雲ECS。服務器
官方github release地址,目前最新版本是0.26.0網絡
本文服務器系統爲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
每一個壓縮包解壓後都包含如下文件和一個systemd文件夾:
注:服務端只需用到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的方式,會佔用終端,而且中止和重啓等管理操做也不方便。
爲了方便管理frps的啓動、中止、重啓和開機自啓,咱們須要將frps添加爲系統service,經過systemd守護程序來管理。
在frp_0.26.0_linux_amd64目錄裏的systemd目錄下,已經爲咱們準備好了添加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,畢竟終端一條啓動命令就能夠搞定。更多實戰經驗分享請參考:個人我的博客