wiki/网络/FRP/FRP.md
2025-01-02 10:46:09 +08:00

6.2 KiB
Raw Blame History

title, categories, tags, date
title categories tags date
FRP
Linux服务
运维
内网穿透
Linux
2021-03-21 22:48:33

FRP

frp 是什么?

FRP官方文档https://gofrp.org/docs/

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用 frp

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件静态文件查看HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

原理

frp 主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

代理

在 frp 中一个代理对应一个需要暴露的内网服务。一个客户端支持同时配置多个代理。

代理类型

frp 支持多种代理类型来适配不同的使用场景。

类型 描述
tcp 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
udp 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。
http 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header增加鉴权。
https 针对 HTTPS 应用定制了一些额外的功能。
stcp 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc不需要在服务端暴露端口。
sudp 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc不需要在服务端暴露端口。
xtcp 点对点内网穿透代理,功能同 stcp但是流量不需要经过服务器中转。
tcpmux 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。

配置文件

frp 目前仅支持 ini 格式的配置文件frps 和 frpc 各自支持不同的参数。

frps 主要配置服务端的一些通用参数frpc 则需要额外配置每一个代理的详细配置。

格式

目前仅支持 ini 格式的配置,如下的示例配置将本地 SSH 服务穿透到公网。

frps 配置:

[common]
bind_port = 7000

frpc 配置:

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[common] 是固定名称的段落,用于配置通用参数。

[ssh] 仅在 frpc 中使用,用于配置单个代理的参数。代理名称必须唯一,不能重复。

同一个客户端可以配置多个代理。

身份认证

目前 frpc 和 frps 之间支持两种身份验证方式,tokenoidc,默认为 token

通过 frpc.inifrps.ini[common] 段落中配置 authentication_method 来指定要使用的身份验证方式。

只有通过身份验证的客户端(frpc)才能成功连接 frps。

Token

基于 Token 的身份验证方式比较简单,需要在 frpc 和 frps 的 [common] 段落中配置上相同的 token 参数即可。

参数说明

类型 描述
authentication_method 身份验证方式token 或 oidc默认为 token。
authenticate_heartbeats 在每一个心跳包中附加上身份认证信息,客户端服务端需要一致。
authenticate_new_work_conns 在每次创建工作连接时附加上身份认证信息,客户端服务端需要一致。

个人常用配置

服务端

[common]
bind_port = 7000                #连接端口
authentication_method = token   #认证方式
token = ********			   #认证密码
allow-ports = 8000-9000         #运行连接的密码

客户端

[common]                      #连接参数
server_addr = 39.107.94.47	  #服务端IP
server_port = 7000			 #服务端端口
authentication_method = token #认证方式
token = zhanxiaoyao			 #认证类型

[ssh]						#名称
type = tcp                    #类型
local_ip = 127.0.0.1		 #本地IP
local_port = 22				#本地端口
remote_port = 8022			#远端端口

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080

systemctl控制启动

vim /lib/systemd/system/frpc.service 

在frpc.service里写入以下内容

[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令此处写你的frps的实际安装目录
ExecStart=/your/path/frpc -c /your/path/frpc.ini

[Install]
WantedBy=multi-user.target

然后启动frpc

systemctl start frpc

设置开机自启动

systemctl enable frpc

windows中设置FRPC/S开机自启动

1、下载frp软件包并解压至c盘并在frp文件夹内创建frp.bat追加以下内容
C:
cd \frp
start frpc.exe -c frpc.ini

2、打开windows服务器管理器——>工具——>任务计划程序
3、创建基本任务——>触发器为计算机启动时——>操作为启动程序——>程序或脚本选择frp.bat——>完成