Skip to main content

frp

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

为什么使用 frp ?

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

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

本文实例基于0.52.3版本

https://github.com/fatedier/frp/tree/44985f574dd3924e9cb48a969fddbd72b3afe2b3

完整frpc配置

https://github.com/fatedier/frp/blob/44985f574dd3924e9cb48a969fddbd72b3afe2b3/conf/frpc_full_example.toml

完整frps配置

https://github.com/fatedier/frp/blob/44985f574dd3924e9cb48a969fddbd72b3afe2b3/conf/frps_full_example.toml

例子

使用websocket 加密协议,代理udp服务

frpc

frpc docker-compose.yml配置

version: "3"
services:
frpc:
image: ghcr.io/fatedier/frpc:v0.52.3
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./frpc.toml:/etc/frpc.toml
command:
- -c
- /etc/frpc.toml

/etc/frpc.toml

serverAddr = "xx.xx.xx.xx"
serverPort = 443

transport.protocol = "wss"

auth.method = "token"
# auth token
auth.token = "xxxxxx"

[[proxies]]
name = "usawg"
type = "udp"
localIP = "127.0.0.1"
localPort = 12345
remotePort = 12345

frps

frps docker-compose.yml配置

version: '3.5'
services:
frps:
image: ghcr.io/fatedier/frps:v0.52.3
ports:
- 12345:12345/udp
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./frps.toml:/etc/frps.toml
command:
- -c
- /etc/frps.toml

/etc/frps.toml

bindAddr = "0.0.0.0"
bindPort = 7000

tls.force = true
auth.method = "token"

# auth token
auth.token = "xxxxxx"

wss server

将frps的服务通过wss代理出来,方便协议伪造

使用caddy server实现wss server代理

Caddyfile配置

xx.xx.xx {
@websockets {
header Connection Upgrade
header Upgrade websocket
}
reverse_proxy @websockets frps:7000
}

caddyserver docker-compose.yaml

version: "3.5"
services:
caddy-server:
image: caddy:2.5.2
restart: always
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./data:/data
- ./logs:/var/log/caddy
ports:
- "80:80"
- "443:443"
- "443:443/udp"
- "127.0.0.1:2019:2019"
# 默认CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
command: ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]