frp -- 内网穿透

3,214 阅读5分钟

介绍

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。 由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

代理

在 frp 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。

代理类型

frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

安装

准备工作

  • 一台可以访问互联网的服务器,作为服务端
  • 一台本地部署服务的局域网服务器,什么系统的都行,作为客户端,我这里用的windows
  • 下载frp,服务端和客户端都得下载,建议同一个版本

下载ftp

## 先下载wget
apt install wget
## 下载
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz

## 解压
tar -vxf frp_0.51.3_linux_amd64.tar.gz

## 重命名
mv frp_0.58.1_linux_amd64 frp

编辑服务端frps.toml文件

  
[common]
# 连接端口
bind_port = 7000
# 校验Token,为了你的服务端的安全,请设置得复杂些
token = qwer1234
  
# Dashboard Web监控配置
## Web访问端口
dashboard_port = 7500
## Web访问的账号和密码
dashboard_user = admin
dashboard_pwd = admin123
## 是否提供 Prometheus 监控接口
enable_prometheus = true

## 最大连接池数量
max_pool_count = 4
  
# Http 服务端配置
## HTTP 类型代理监听的端口
vhost_http_port = 7001
## 为 HTTPS 类型代理监听的端口
vhost_https_port = 7123
## 解析到你服务端的域名,通过ping frp.yourdomain.com查看是否成功解析
## 这里我们是要实现自定义四级域名访问内网资源,因此这里使用三级域名作为后缀,服务端那块会再设置一个字符串,共同组成 xxx.frp.yourdomain.com
# subdomain_host = frp.yourdomain.com

# 服务端日志配置
## 日志文件存放位置
log_file = /var/log/frps.log
## 日志等级
log_level = info

进入frp 目录启动frp

./frps -c ./frps.toml
#后台启动 nohup ./frps -c ./frps.toml &> /dev/null &

![[Pasted image 20240626224710.png]] ![[Pasted image 20240627111644.png]] 这样就是启动成功了

访问web界面

http://116.198.233.54:7500/ ![[Pasted image 20240626230418.png]] 注意把云服务器的端口打开,把服务器的防火墙配置一下

配置服务 通过命令服务启动

在/etc/systemd/system 新建 frps.service 文件

vim /etc/systemd/system/frps.service

文件内容

Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/frp/frps -c /home/frp/frps.toml

[Install]
WantedBy = multi-user.target
  • Description:描述了服务的作用或功能,这里被设置为 "frp server",表示 frp 服务器。
  • After:定义了服务的启动顺序,表明在启动该服务之前需要等待 network.targetsyslog.target 服务已经启动。
  • Wants:表明该服务想要依赖 network.target 服务。 [Service] 在这个部分,你可以设置服务运行的相关参数:
  • Type:定义服务的类型,这里设置为 simple,表示该服务不会派生出其他子进程。
  • ExecStart:定义了启动 frp 服务器的命令,你需要根据你的实际情况修改命令路径和配置文件路径。在这个例子中,使用的启动命令是 /home/frp/frps -c /home/frp/frps.toml,表示使用 /app/frp 目录下的 frps 可执行文件,并加载 /app/frp/frps.toml 配置文件。 [Install] 在这个部分,你可以定义服务的安装和启动方式:
  • WantedBy:表明服务希望被启用的目标单元,这里设置为 multi-user.target,表示服务希望在多用户模式下启动。

配置好了文件之后可以用以下命令运行frp服务

  • 启动 frps 服务:
systemctl start frps
  • 停止 frps 服务:
systemctl stop frps
  • 检查 frps 服务的状态:
systemctl status frps
  • 重新加载 Systemd 守护进程(当你修改了服务单元文件后需要执行此命令):
systemctl daemon-reload

下载客户端

github

修改 frpc.toml文件


[common]
# 服务端信息
## 服务端的IPv4地址
server_addr =116.198.233.54
## 服务端建立连接的端口
serverPort = 7000
## 服务端连接时的校验Token,必须与服务端保持一致,否则无法连接
token = qwer1234

[Web]
# http服务
## 数据类型
type = http
## 本地IP localhost、127.0.0.1或你用ipconfig得到的内网IP都可
local_ip = localhost
## 本地需要暴露在外网的端口,一般为你本地的项目端口
local_port = 1314
## 是该条规则在服务端开放的端口号,自己填写并记录即可,服务端对https设置的端口为7123,所以此处也为7123
## remote_port = 7123
## subdomain = test
custom_domains= **.**.**.**

客户端启动

frpc.exe -c ./frpc.toml

配置服务器端口

Pasted image 20240626224535.png