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

    文章

    8116

    浏览量

    82518
  • 防火墙
    +关注

    关注

    0

    文章

    406

    浏览量

    35419
  • 局域网
    +关注

    关注

    5

    文章

    692

    浏览量

    45351
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11603

原文标题:一文拿捏内网穿透利器之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 4821次阅读
    树莓派:使用花生壳或<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 1108次阅读

    如何用frp实现内网穿透呢?

    想要连接就需要NAT(Network Address Translation,网络地址转换)。想要实现这一个功能,可以有许多方法,比如说frp、花生壳、ssh等实现。
    的头像 发表于 01-18 10:29 1970次阅读
    如何用<b class='flag-5'>frp</b>实现<b class='flag-5'>内网</b><b class='flag-5'>穿透</b>呢?

    【教程】通过LoRaWAN网关实现FRP功能

    对于没有公网IP的内网用户来说,远程管理内网下的LoRaWAN网关是一个尴尬的难题,内网穿透可实现通过公网访问内网下的设备(如本机)当下
    的头像 发表于 08-28 15:37 512次阅读
    【教程】通过LoRaWAN网关实现<b class='flag-5'>FRP</b>功能

    使用LoRaWAN网关实现FRP功能教程

    对于没有公网IP的内网用户来说,远程管理内网下的LoRaWAN网关是一个尴尬的难题,内网穿透可实现通过公网访问内网下的设备(如本机)当下
    的头像 发表于 06-25 10:18 318次阅读
    使用LoRaWAN网关实现<b class='flag-5'>FRP</b>功能教程

    【教程】使用LoRaWAN网关实现FRP功能

    对于没有公网IP的内网用户来说,远程管理内网下的LoRaWAN网关是一个尴尬的难题,内网穿透可实现通过公网访问内网下的设备(如本机)当下
    的头像 发表于 06-23 10:02 424次阅读
    【教程】使用LoRaWAN网关实现<b class='flag-5'>FRP</b>功能

    内网穿透工具的种类、原理和使用方法

    本文以渗透的视角,总结几种个人常用的内网穿透内网代理工具,介绍其简单原理和使用方法。
    的头像 发表于 08-25 10:35 383次阅读
    <b class='flag-5'>内网</b><b class='flag-5'>穿透</b>工具的种类、原理和使用方法

    内网穿透可以带给物联网什么呢?

    内网穿透可以带给物联网什么呢?
    的头像 发表于 10-14 15:14 396次阅读

    神器!实现内网穿透的几款工具

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
    的头像 发表于 11-25 10:22 716次阅读
    神器!实现<b class='flag-5'>内网</b><b class='flag-5'>穿透</b>的几款工具

    内网穿透工具FRP的快速入门

    在计算机网络中,内网穿透是一种通过公网建立安全通道,使得位于内网的计算机和服务可以被外部网络访问。对程序员而言,内网穿透可以帮助你干什么呢?
    的头像 发表于 01-02 11:47 326次阅读