1. 名词
1.1. 网络穿透
网络穿透是一种技术,用于解决内网设备或服务无法直接被外部网络访问的问题。通常,内网设备位于路由器后面,并没有公网 IP 地址,因此外部用户不能直接连接到这些设备。网络穿透通过一些特定的技术手段,使得外部用户能够访问这些内网设备。
1.2. FRP
FRP (Fast Reverse Proxy) 是一种常用的网络穿透工具,它通过代理服务器实现内网穿透,允许内网的服务被外网访问。FRP 支持多种协议(如 HTTP、HTTPS、TCP 等),并且支持反向代理和动态 DNS 功能,使用起来较为简便。
2. FRP
2.1. FRP 的基本工作原理:
- 客户端(frpc):在内网设备上运行,负责与 FRP 服务器建立连接。
- 服务器端(frps):部署在公网服务器上,负责接收外部的请求,并将请求转发到对应的内网客户端。
- 隧道建立:内网设备通过客户端与公网的 FRP 服务器建立隧道连接,外部请求通过该隧道被转发到内网服务。
2.2. FRP 的应用场景:
- 远程访问内网服务:比如你有一台内网 Web 服务器,你希望外部访问时通过 FRP 访问到内网 Web 服务。
- IoT 设备远程管理:对于很多部署在内网中的 IoT 设备,可以通过 FRP 实现远程控制。
- 办公场景:在公司内部网络中部署服务,可以通过 FRP 实现对外的访问。
2.3. FRP (Fast Reverse Proxy) 详细介绍
FRP (Fast Reverse Proxy) 是一个高性能的反向代理应用,专门用于内网穿透。它使得处于内网中的服务能够通过一个公网服务器被外部访问,常用于连接内网的数据库、Web 服务、远程桌面等服务。
2.3.1. 主要特性:
- 支持多种协议 :FRP 支持 TCP 、UDP 、HTTP 、HTTPS 、WebSocket 等多种协议。
- 反向代理:能够将内网的服务通过一个外部服务器暴露给互联网。
- 负载均衡:通过支持多个隧道转发,可以在多个后端服务之间实现负载均衡。
- 多种加密方式:FRP 支持加密和压缩,可以保护数据传输的安全性。
- 动态域名:支持动态 DNS 和自定义域名映射。
- 简单配置:FRP 的配置文件结构简单,容易上手。
- 高性能:FRP 使用 Go 语言编写,具有较高的性能,能够处理大量并发连接。
2.3.2. 组成:
- FRP 服务器端(frps):部署在公网服务器上,负责接收外部请求并转发到对应的内网客户端。
- FRP 客户端(frpc):运行在内网设备上,负责将内网服务暴露到外网,客户端与服务器端之间建立隧道连接。
2.3.3. 工作原理:
FRP 的工作原理基于代理技术。它通过一个公网服务器作为中介,将内网客户端和外部请求连接起来。客户端和服务器之间通过一个持久的 TCP 连接保持通信,并将请求和响应数据进行转发。
2.3.4. FRP 的常见应用场景:
- 远程访问:使得部署在内网的服务(如 Web 应用、数据库、SSH 服务等)能够通过公网 IP 或域名进行访问。
- IoT 设备连接:支持远程控制和监控内网中的设备,如路由器、摄像头等。
- 内网穿透:当用户位于 NAT 网络或防火墙后时,通过 FRP 实现内网与外网的通信。
- 私有云服务:可以将一些私有服务(如文件服务器)暴露给外部使用。
2.3.5. 主要功能:
- TCP 和 UDP 转发:支持将 TCP 和 UDP 数据流转发到内网服务。
- HTTP/HTTPS 反向代理:支持 Web 服务的代理,能够将外部请求转发到内网的 HTTP/HTTPS 服务。
- WebSocket 支持:允许 WebSocket 连接通过 FRP 转发,适用于实时应用。
- 多端口和多协议支持:支持配置多个端口和协议进行反向代理。
- 自定义域名和路径:支持设置自定义域名,方便管理。
- 插件支持:支持一些额外的功能插件,如加密、压缩等。
2.3.6. 开发语言和架构:
- 开发语言 :FRP 是使用 Go 语言(Golang)开发的,这使得其具备高效的性能,尤其在并发处理方面具有优势。
- 跨平台支持:FRP 支持 Linux、Windows、macOS 等多种操作系统。
2.3.7. GitHub 地址:
FRP 的源代码可以在 GitHub 上找到:
在 GitHub 上,你可以找到 FRP 的源码、文档、示例配置、常见问题解答以及社区的贡献。
2.3.8. 其他相关资源:
- 官方文档 :FRP 提供了非常详细的 官方文档,包括如何进行安装、配置和使用的说明。
- Docker 支持:FRP 也支持 Docker 部署,可以在没有过多配置的情况下直接在 Docker 容器中使用。
- 社区和讨论:FRP 拥有活跃的社区支持,可以通过 GitHub Issues 或者其他技术论坛与开发者和使用者交流问题。
3. 安装使用过程
3.1. 下载
下载地址在github上[Releases · fatedier/frp]
一般需要下载两个,像笔者就下载了一个linux的,一个windows的:
- Linux的安装在公网Ip的服务器上
- Windows安装在家中主机上
3.2. Linux安装步骤
- 下载符合版本的Linux版本上传到服务器内,并解压
shell
tar -xzvf rp_0.61.0_linux_amd64.tar.gz
- 配置
frps.toml
配置文件
shell
bindAddr = "0.0.0.0"
bindPort = 7100
kcpBindPort = 7100
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "username"
webServer.password = "passwd"
log.to = "/frpslog/frps.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "ceshi123456"
allowPorts = [
{ start = 6000, end = 7000},
]
- 创建
frps
为服务并启动服务器
shell
vim vim /etc/systemd/system/frps.service
将下列内容写入到文本中,需要修改路径
shell
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /data/software/frp_0.61.0_linux_amd64/frps -c /data/software/frp_0.61.0_linux_amd64/frps.toml
[Install]
WantedBy = multi-user.target
- 设置启动,并设置自动启动
shell
sudo systemctl start frps
systemctl status frps
systemctl restart frps
systemctl start frps && systemctl enable frps
systemctl restart frps
- 查看frps服务状态
shell
# systemctl status frps
● frps.service - frp server
Loaded: loaded (/etc/systemd/system/frps.service; enabled; preset: enabled)
Active: active (running) since Mon 2024-11-18 16:38:58 CST; 1 week 6 days ago
Main PID: 146916 (frps)
Tasks: 7 (limit: 9453)
Memory: 15.9M (peak: 30.7M)
CPU: 33.300s
CGroup: /system.slice/frps.service
└─146916 /data/software/frp_0.61.0_linux_amd64/frps -c /data/software/frp_0.61.0_linux_amd64/frps.toml
Nov 18 16:38:58 iv-ydinw2ob28cva4f6np8r systemd[1]: Started frps.service - frp server.
3.3. 查看Web管理界面运行状态
访问你的地址,记得开启防火墙许可以及云服务器的安全组策略
frps dashboard 记得修改ip地址信息
3.4. 继续安装客户端
前面服务端使用的frps
,那么客户端使用的是frpc
- 修改
frpc.toml
- serverAddr: 修改为前面的公网服务器的IP地址
- auth.token: 记得与前面frps.toml中的值保持一致
- proxies:就比较好理解了,如第一个则是:将本机的3000端口暴露到公网服务器的6002上。
shell
serverAddr = "127.0.0.1"
serverPort = 7100
loginFailExit = true
log.to = "D:/Software/frp_0.59.0_windows_amd64/frpc.log"
log.level = "info"
log.maxDays = 3
auth.method = "token"
auth.token = "ceshi123456"
[[proxies]]
name = "local_knowledge"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3000
remotePort = 6002
[[proxies]]
name = "local_gpt"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 6003
- 启动服务
shell
D:\Software\frp_0.59.0_windows_amd64>frpc.exe -c ./frpc.toml