204 lines
6.2 KiB
Markdown
204 lines
6.2 KiB
Markdown
---
|
||
title: FRP
|
||
categories:
|
||
- Linux服务
|
||
tags:
|
||
- 运维
|
||
- 内网穿透
|
||
- Linux
|
||
date: 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 配置:
|
||
|
||
```ini
|
||
[common]
|
||
bind_port = 7000
|
||
```
|
||
|
||
frpc 配置:
|
||
|
||
```ini
|
||
[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 之间支持两种身份验证方式,`token` 和 `oidc`,默认为 `token`。
|
||
|
||
通过 `frpc.ini` 和 `frps.ini` 的 `[common]` 段落中配置 `authentication_method` 来指定要使用的身份验证方式。
|
||
|
||
只有通过身份验证的客户端(frpc)才能成功连接 frps。
|
||
|
||
|
||
|
||
### Token
|
||
|
||
基于 Token 的身份验证方式比较简单,需要在 frpc 和 frps 的 `[common]` 段落中配置上相同的 `token` 参数即可。
|
||
|
||
|
||
|
||
### 参数说明
|
||
|
||
| 类型 | 描述 |
|
||
| --------------------------- | ------------------------------------------------------------ |
|
||
| authentication_method | 身份验证方式,token 或 oidc,默认为 token。 |
|
||
| authenticate_heartbeats | 在每一个心跳包中附加上身份认证信息,客户端服务端需要一致。 |
|
||
| authenticate_new_work_conns | 在每次创建工作连接时附加上身份认证信息,客户端服务端需要一致。 |
|
||
|
||
## 个人常用配置
|
||
|
||
服务端
|
||
|
||
```shell
|
||
[common]
|
||
bind_port = 7000 #连接端口
|
||
authentication_method = token #认证方式
|
||
token = ******** #认证密码
|
||
allow-ports = 8000-9000 #运行连接的密码
|
||
|
||
```
|
||
|
||
客户端
|
||
|
||
```shell
|
||
[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控制启动
|
||
|
||
```shell
|
||
vim /lib/systemd/system/frpc.service
|
||
```
|
||
|
||
在frpc.service里写入以下内容
|
||
|
||
```shell
|
||
[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
|
||
|
||
```shell
|
||
systemctl start frpc
|
||
```
|
||
|
||
设置开机自启动
|
||
|
||
```shell
|
||
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——>完成
|
||
```
|
||
|