frp介绍
frp 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
实验
相关准备
准备:
- 一个拥有公网域名的服务器
- 一个内网机器(windows或者linux机器都可以)
- 一个在内网机器中可访问的服务
我这里准备了一个java服务,占用8000端口的,访问/frp,直接返回"ok"
@RestController
public class FrpController {
@RequestMapping("/frp")
public String frp() {
return "ok";
}
}
先把对应的java服务在内网服务器上启动,访问localhost:8000/frp
去官网上下载frp自己所用平台的软件包:https://github.com/fatedier/frp/releases
(公网服务器和内网服务器都需要安装这个)
#amd64架构的linux平台可以用这个
wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
tar -zxvf frp_0.43.0_linux_amd64.tar.gz
cd frp_0.43.0_linux_amd64
ls -al
配置域名访问
在具有公网域名的机器上修改 frps.ini
文件,设置了 frp 服务器用户接收客户端连接的端口和监听 HTTP 请求端口为 8000
[common]
bind_port = 7000
vhost_http_port = 8000
在具有公网域名的机器上添加启动脚本:start.sh
#/bin/bash
nohup ./frps -c frps.ini &
执行start.sh
。
在内网机器上,配置frpc.ini
文件
[common]
server_addr = xxx.xxx.xx.xx #公网ip
server_port = 7000
[web]
type = http
local_port = 8000
custom_domains = xxxxxx.xx #公网域名
添加启动脚本:start.sh,并执行
#/bin/bash
nohup ./frpc -c frpc.ini &