--- 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——>完成 ```