<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

內網穿透frp原理簡述

dyquk4xk2p3d ? 來源:稀土掘金 ? 2023-11-13 14:38 ? 次閱讀

一、什么是 frp

1.1 內網穿透

如下圖所示, 一般情況下, 公網內的設備都能夠被任意一臺設備訪問到!! 而不同局域網內的設備是相互隔離的, 局域網 A 的設備是無法訪問到局域網 B 內的設備

7119f816-8131-11ee-939d-92fbcf53809c.png

而內網穿透技術, 顧名思義就是能讓公網、或者當前局域網外的任意設備訪問到局域網內某個設備! 如下圖, 設備 C 實現了內網穿透技術, 所以局域網內任意設備都能夠訪問到當前設備

7131c4dc-8131-11ee-939d-92fbcf53809c.png

那么有了內網穿透我們可以做啥呢?

遠程訪問和管理: 內網穿透允許您從任何地方通過互聯網連接到位于其他局域網內中的設備或服務器, 舉個最簡單的例子就是, 當你在家里想遠程訪問公司電腦時, 因為你的兩個設備是處于不同局域網內, 默認情況下是無法相互訪問的, 這時就可以通過內網穿透來實現

游戲娛樂: 比如你在家用電腦開游戲服, 想邀請朋友加入聯機, 因為你家里的網絡與朋友的網絡處于不同的局域網, 當朋友想要聯機加入你的游戲服時, 就需要你的電腦使用內網穿透技術將設備訪問權暴露出去

共享本地服務: 實現文件共享, 如文件共享、打印機訪問或監控攝像頭; 通過內網穿透技術, 我們可以隨時隨地訪問家里設備的資源、服務

測試和開發環境: 開發人員可以使用內網穿透將本地開發環境暴露給外部世界; 比如我們要本地測試 github webhooks 就可以通過內網穿透來讓外部的服務訪問到我們本地服務

1.2 frp 簡介 & 原理簡述

簡單地說, frp 就是一個反向代理軟件, 它的作用是將內網中的服務器暴露到互聯網上, 它體積輕量但功能很強大!!! 通過它我們可以很方便實現內網穿透功能!!!

它其實有兩個服務:

客戶端 frpc, 安裝在我們內網中某臺物理機上

服務端 frps, 安裝在一個公網服務器上

如下圖:

首先公網上先部署了 frps 服務, 并設置了連接端口

然后在內網中運行 frpc 服務, 啟動時會連接到公網上的 frpc 服務, 并保持保持住這個長連接(如果斷開了會進行重試)

當用戶公網地址時, 會先在本地看是否有可用的連接, 如果沒有, 那么 frps 服務就會將請求轉發到 frpc 服務上

再由 frpc 將請求轉發到內網中任意一個服務上

714999cc-8131-11ee-939d-92fbcf53809c.png

FRP的優點: 它可以隱藏內網中的服務器, 避免因直接暴露內網服務器導致的安全問題。此外, FRP還支持動態端口映射, 可以方便地實現內網的服務器負載均衡

二、公網服務器 frps 部署

上文提到, frp 其實是有兩個服務的, 一個存在于公網的 frp 服務端, 也是就 frps; 一個就是部署在局域網物理機上的 frp 客戶端, 也就是 frpc

那么本節將介紹下 frps 的一個部署, 這里使用到的 docker 鏡像是 snowdreamtech/frps, 需要注意的是本文使用的是最新的版本, 所以配置文件和目前網上大部分教程是有所出入的!!!

如下圖, 從 docker 鏡像的詳細信息可以看出, 該鏡像發布時間的一個時間, 以及使用的配置文件路徑, 配置文件具體信息可以看 frp 官網

7154ba5a-8131-11ee-939d-92fbcf53809c.png

下面開始正式部署 frps 服務...

2.1 添加配置文件

首先找個位置, 添加一個配置文件 frps.toml, 我這里配置文件完整路徑為 /home/moyuanjun/frp/frps.toml, 配置文件內容如下, 具體每個配置項參考注釋, 更多配置可查閱 frp 官網


bindPort = 7000         
log.to = "console"      
vhostHTTPPort = 7100    
vhostHTTPSPort = 7200   

auth.method = "token"   
auth.token = "password" 

webServer.port = 7300        
webServer.addr = "0.0.0.0"   
webServer.user = "admin"     
webServer.password = "admin" 

71693c3c-8131-11ee-939d-92fbcf53809c.png

2.2 Docker 容器部署

配置文件整完, 下面我們開始部署 docker!!!

首先先拉取下最新的 docker 鏡像 snowdreamtech/frps

sudo docker pull snowdreamtech/frps


這里提前拉取了下鏡像, 主要目的就是要確認下拉取下來的 snowdreamtech/frps 鏡像的版本是否是最新的, 這里我就是簡單看下鏡像的創建時間(沒辦法, 不同的 docker 源上最新版本可能存在差異, 我這次就被坑慘了!!!)

717f611a-8131-11ee-939d-92fbcf53809c.png

docker 運行: 如下命令, 運行 snowdreamtech/frps, 這里唯一要調整的是 -v /home/moyuanjun/frp/frps.toml:/etc/frp/frps.toml, 要將前面我本地配置文件路徑改成你自己的


sudo docker run -d 
--network host 
-v /home/moyuanjun/frp/frps.toml:/etc/frp/frps.toml 
--name frps 
snowdreamtech/frps

719a14ce-8131-11ee-939d-92fbcf53809c.png

2.3 日志查看

上文我們已經完成了 frps docker 容器的部署, 但實際上我們只看到容器起來了!! 但是 frps 具體運行情況我們是無法知道得知的!!

其實我們在 frps.toml 中配置了 log.to = "console", 日志實際上已經輸出了, 這里我們直接通過 docker logs frps 就可以查看到日志信息了:

719e8bda-8131-11ee-939d-92fbcf53809c.png

當然如果我們想要查看實時的日志, 可以使用 docker logs -f frps 來開啟一個實時的終端進程, 就能夠實時監控到日志的輸出:

71b34dfe-8131-11ee-939d-92fbcf53809c.png

2.4 frps 儀表盤

我自己的服務器是阿里云的, 默認情況下防火墻只開啟了幾個常用端口, 所以在開始前, 我這邊還需要設置下阿里云的防火墻, 為 frp 開放了一批端口出來

還記得我們在 frps.toml 中配置了儀表盤信息嘛, 下面我們可以通過 ip/域名:[webServer.port] 來訪問儀表盤頁面!!!

首次需要登錄, 用戶名密碼就是 frps.toml 設置的內容:

71c4f626-8131-11ee-939d-92fbcf53809c.png

如下圖, 就是儀表盤的界面了:

71dd0e5a-8131-11ee-939d-92fbcf53809c.png

三、內網 frpc 部署

下面我們還需要一個 frpc 客戶端, 當我們運行 frpc 服務時將和公網上的 frps 建立一個長連接, 當我們訪問公網不存在的服務時會轉發到 frpc, 然后 frpc 再做一個二次轉發

那么本節將介紹下 frpc 的一個部署, 這里使用到的 docker 鏡像是 snowdreamtech/frpc, 需要注意的是本文使用的是最新的版本, 所以配置文件和目前網上大部分教程是有所出入的!!!

如下圖, 從 docker 鏡像的詳細信息可以看到, 該鏡像的一個發布時間, 以及使用的配置文件路徑, 配置文件具體信息可以看 frp 官網

71f680c4-8131-11ee-939d-92fbcf53809c.png

下面開始正式部署 frpc 服務...

3.1 添加配置文件

還是一樣, 我們需要先找個位置, 添加一個配置文件 frpc.toml, 我這里配置文件完整路徑為 /Users/qianyin/frp/frpc.toml, 配置文件最簡內容如下, 具體每個配置項參考注釋, 更多配置可查閱 frp 官網


serverPort = 7000                
serverAddr = "www.kunlunxu.cc"   
log.to = "console"               
auth.token = "password"

71fc40fe-8131-11ee-939d-92fbcf53809c.png

3.2 Docker 容器部署

配置文件整完, 下面我們開始部署 docker!!!

首先先拉取下最新的 docker 鏡像 snowdreamtech/frpc

docker pull snowdreamtech/frpc


這里提前拉取了下鏡像, 主要目的就是要確認下拉取下來的 snowdreamtech/frpc 鏡像的版本是否是最新的, 這里我就是簡單看下鏡像的創建時間(沒辦法, 不同的 docker 源上最新版本可能存在差異, 我這次就被坑慘了!!!)

72342424-8131-11ee-939d-92fbcf53809c.png

docker 運行: 如下命令, 運行 snowdreamtech/frpc, 這里唯一要調整的是 -v /Users/qianyin/frp/frpc.toml:/etc/frp/frpc.toml, 要將前面我本地配置文件路徑改成你自己的


docker run -d 
--network host 
-v /Users/qianyin/frp/frpc.toml:/etc/frp/frpc.toml 
--name frpc 
snowdreamtech/frpc

7239ae08-8131-11ee-939d-92fbcf53809c.png

同樣的, 這里我們可以通過 docker logs frpc 來查看啟動日志

7246536a-8131-11ee-939d-92fbcf53809c.png

當然我們也可以通過查看 frps 儀表板中客戶端連接數, 來確定 frpc 的連接情況

725b90a4-8131-11ee-939d-92fbcf53809c.png

3.3 將內網上本地 html 服務暴露到公網(tcp 版本)

首先本地我們先起一個服務, 我這里直接使用 vscode 插件 Live Server 起了一個靜態服務

726f4bbc-8131-11ee-939d-92fbcf53809c.png

下面我們修改 frpc 配置文件, 添加一個代理配置, 我們希望的是, 當訪問公網 ip/域名:7001 能夠通過 frps 轉發到內網上的 frpc 服務上, 然后再通過 fprc 代理到內網的 192.168.0.108:5500 上; 配置完整內容如下, 參數介紹看注釋, 主要就是加了 [[proxies]] 配置:


# frpc.toml
serverPort = 7000                # [必選] 要連接的 frps 端口
serverAddr = "www.kunlunxu.cc"   # [必選] 要連接的 frps 地址
log.to = "console"               # [可選] 日志配置, 通過打印的方式輸出日志
auth.token = "password"          # [可選] token 設置, frps 設置的 token, 其實就是密碼


+ [[proxies]]                      
+ name = "web"                     # 代理名稱(隨便填)
+ type = "tcp"                     # 代理類型
+ localIP = "192.168.0.108"        # 代理地址, 要轉發到哪個地址
+ localPort = 5500                 # 代理端口, 要轉發到哪個端口
+ remotePort = 7001                # 遠程端口(和遠程 frps 哪個端口綁定在一起, 訪問對應端口將使用該代理)

重啟 frpc: 其實就是重啟 docker 容器


docker stop frpc
docker start frpc

訪問 http://www.kunlunxu.cc:7001 將正常展示內網上本地項目:

7285a448-8131-11ee-939d-92fbcf53809c.png

下面是一個簡易流程圖:

729f995c-8131-11ee-939d-92fbcf53809c.png

3.4 將內網上本地 html 服務暴露到公網(html 版本)

下面我們換一種配置方式, 下面是完整配置內容如下, 參數介紹看注釋; 因為我們在 frps 上設置了 vhostHTTPPort = 7100 那么當我們訪問公網服務器 7100 端口時, 轉發到 frpc 后會走 type = "http" 的配置:


# frpc.toml
serverPort = 7000                # [必選] 要連接的 frps 端口
serverAddr = "www.kunlunxu.cc"   # [必選] 要連接的 frps 地址
log.to = "console"               # [可選] 日志配置, 通過打印的方式輸出日志
auth.token = "password"          # [可選] token 設置, frps 設置的 token, 其實就是密碼


[[proxies]]                      
name = "web - tcp"               # 代理名稱(隨便填)
type = "tcp"                     # 代理類型
localIP = "192.168.0.108"        # 代理地址, 要轉發到哪個地址
localPort = 5500                 # 代理端口, 要轉發到哪個端口
remotePort = 7001                # 遠程端口(和遠程 frps 哪個端口綁定在一起, 訪問對應端口將使用該代理)


+ [[proxies]]
+ name = "web - html"                   # 代理名稱(隨便填)
+ type = "http"                         # 代理類型
+ localIP = "192.168.0.108"             # 代理地址, 要轉發到哪個地址
+ localPort = 5500                      # 代理端口, 要轉發到哪個端口
+ customDomains = ["www.kunlunxu.cc"]   # 限制公網地址, 只有對應地址上
 frps 轉發了 html 才會走到這里

重啟 frpc: 其實就是重啟 docker 容器


docker stop frpc
docker start frpc

訪問 http://www.kunlunxu.cc:7100 將正常展示內網上本地項目:

72af8754-8131-11ee-939d-92fbcf53809c.png

72b30b2c-8131-11ee-939d-92fbcf53809c.png

下面是一個簡易流程圖:

72c3f1e4-8131-11ee-939d-92fbcf53809c.png

四、遇到問題

1、版本問題: 目前網上大部分文章的配置文件還是 frps.ini 或 frpc.ini, 寫法上也是老的寫法, 所以這里如果你安裝的是最新版本那么一定請以 frp 官網 為準

2、如何確定 Docker 容器使用的配置文件是哪個? 答案是可直接查看容器的信息來進行確認

72d672a6-8131-11ee-939d-92fbcf53809c.png

如何查看日志? 正如上文可在配置文件中設置 log.to = "console" 并配合 docker logs 來查看服務輸出的日志

上文中 webServer.addr 設置了 "0.0.0.0", 是因為默認情況下是該值為 127.0.0.1, 在測試過程中發現如果保持默認值無法訪問到儀表盤頁面了!!!

在最開始我是跑了一個 React 項目, 然后試圖在 frpc 中將項目暴露出去, 最后發現一直無法代理成功!!! 經排查發現原來該項目無法通過內網 IP 進行訪問的, 當然相對的解決辦法就是需要調整 webpack 中的配置!! 后來省方便就直接使用 vscode 插件 Live Server 起了一個靜態服務來進行測試!! 所以這里主要就是想提醒下, 在測試前請確保你的本地服務能夠正常通過內網 IP 進行訪問, 同時配置中盡量不要直接寫 127.0.0.1, 盡量使用具體的內網 IP

在阿里云上, 拉取 snowdreamtech/frps 鏡像時總是發現最新版本和 hub.docker 上對不上, 經排查發現問題出在 Docker 配置的源上, 由于我這邊使用了 阿里云加速器, 但是由于 Docker Hub 的限制, 導致使用鏡像加速器后無法獲取最新官方鏡像, 暫時解決辦法就是去掉加速器配置, 直接連接 Docker Hub 進行獲取:


rm /etc/docker/daemon.json       
sudo systemctl daemon-reload     
sudosystemctlrestartdocker

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8249

    瀏覽量

    82874
  • 防火墻
    +關注

    關注

    0

    文章

    408

    瀏覽量

    35435
  • 局域網
    +關注

    關注

    5

    文章

    700

    瀏覽量

    45733
  • Docker
    +關注

    關注

    0

    文章

    439

    瀏覽量

    11640

原文標題:一文拿捏內網穿透利器之frp

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問花生殼怎么進行內網穿透的?

    花生殼是怎么進行內網穿透的,能不能用來***,還是只有組建內網的功能。
    發表于 04-18 06:02

    內網穿透詳解-基于NATAPP&NatAssist測試

    本帖最后由 1406093611 于 2019-11-13 22:41 編輯 內網穿透詳解-基于NATAPP&NatAssist TCP測試【前言】最近做一個4G模塊
    發表于 09-13 12:14

    搭建自己的IOT平臺---內網穿透

    相信大部分小伙伴在搭建環境的時候都是用虛擬機來搭建的,如果想實現外網訪問內網的話,還是比較麻煩的。在這里我就針對這個問題,寫一篇教程,教大家用最簡單的方式實現內網穿透,能做到外網訪問內網
    發表于 12-09 23:14

    【HD-G2UL-EVM開發板體驗】 內網穿透

    設備,驗證是否生效sync && sudo reboot開始在網上有關sakura frp在linux開發板上的教程還比較少,這里寫一篇在G2UL開發板上實現內網穿透
    發表于 12-22 16:49

    樹莓派:使用花生殼或FRP實現內網穿透,遠程訪問的方案

    繼續折騰樹莓派,如果沒有公網ip,但又想隨時隨地都能連接到樹莓派,或者訪問上面的服務,今天提供兩套樹莓派內網穿透,遠程訪問方案
    的頭像 發表于 06-27 17:00 ?4856次閱讀
    樹莓派:使用花生殼或<b class='flag-5'>FRP</b>實現<b class='flag-5'>內網</b><b class='flag-5'>穿透</b>,遠程訪問的方案

    搭建FRP服務器的教程

    對于沒有公網IP的內網用戶來說,遠程管理內網下的LoRaWAN網關是一個尷尬的難題,內網穿透可實現通過公網訪問內網下的設備(如本機)當下
    的頭像 發表于 08-26 10:12 ?1.6w次閱讀

    如何使用花生殼搭建內網穿透

    花生殼的內網穿透原理就是通過花生殼服務器把他們的公網IP地址進行翻譯,轉換成為一種私有的地址,然后在花生殼服務器上,類似做端口映射,通過不同的端口來訪問不同的內網電腦,這一切都是通過互聯網來實現的。這里我們介紹一下如何通過花生殼
    的頭像 發表于 12-09 11:29 ?1155次閱讀

    如何用frp實現內網穿透呢?

    想要連接就需要NAT(Network Address Translation,網絡地址轉換)。想要實現這一個功能,可以有許多方法,比如說frp、花生殼、ssh等實現。
    的頭像 發表于 01-18 10:29 ?2022次閱讀
    如何用<b class='flag-5'>frp</b>實現<b class='flag-5'>內網</b><b class='flag-5'>穿透</b>呢?

    【教程】通過LoRaWAN網關實現FRP功能

    對于沒有公網IP的內網用戶來說,遠程管理內網下的LoRaWAN網關是一個尷尬的難題,內網穿透可實現通過公網訪問內網下的設備(如本機)當下
    的頭像 發表于 08-28 15:37 ?548次閱讀
    【教程】通過LoRaWAN網關實現<b class='flag-5'>FRP</b>功能

    使用LoRaWAN網關實現FRP功能教程

    對于沒有公網IP的內網用戶來說,遠程管理內網下的LoRaWAN網關是一個尷尬的難題,內網穿透可實現通過公網訪問內網下的設備(如本機)當下
    的頭像 發表于 06-25 10:18 ?340次閱讀
    使用LoRaWAN網關實現<b class='flag-5'>FRP</b>功能教程

    內網穿透工具的種類、原理和使用方法

    本文以滲透的視角,總結幾種個人常用的內網穿透,內網代理工具,介紹其簡單原理和使用方法。
    的頭像 發表于 08-25 10:35 ?412次閱讀
    <b class='flag-5'>內網</b><b class='flag-5'>穿透</b>工具的種類、原理和使用方法

    內網穿透可以帶給物聯網什么呢?

    內網穿透可以帶給物聯網什么呢?
    的頭像 發表于 10-14 15:14 ?441次閱讀

    神器!實現內網穿透的幾款工具

    frp 是一個專注于內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議??梢詫?b class='flag-5'>內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
    的頭像 發表于 11-25 10:22 ?763次閱讀
    神器!實現<b class='flag-5'>內網</b><b class='flag-5'>穿透</b>的幾款工具

    內網穿透工具FRP的快速入門

    在計算機網絡中,內網穿透是一種通過公網建立安全通道,使得位于內網的計算機和服務可以被外部網絡訪問。對程序員而言,內網穿透可以幫助你干什么呢?
    的頭像 發表于 01-02 11:47 ?371次閱讀

    使用cpolar內網穿透本地MariaDB數據庫

    本篇教程將使用cpolar內網穿透本地MariaDB數據庫,并實現在外公網環境下使用navicat圖形化工具遠程連接本地內網的MariaDB數據庫。
    的頭像 發表于 01-22 10:28 ?271次閱讀
    使用cpolar<b class='flag-5'>內網</b><b class='flag-5'>穿透</b>本地MariaDB數據庫
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>