frp 是一款高性能的反向代理应用,专注于内网穿透。
它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp 可以安全地、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,并享受以下专业特性:
多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
代理组间的负载均衡。
端口复用:多个服务可以通过同一个服务端端口暴露。
P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。
服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。
frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。
每种代理类型适用于不同的使用情境,可以根据需求选择合适的代理类型来配置 frp
TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。
UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。
HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。
HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。
STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。
XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。
TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。
首先,需要前往 frp 项目地址下载对应操作系统及架构的包
安装过程分以下两种:
编写 frps.toml
# frp监听的端口,默认是 7000,建议修改为其他端口防止被定向爆破
bind_port = 7000
# 授权码,建议更换为复杂密码
token = xxx
# 注:这个token之后在客户端会用到
# frp管理后台端口,默认是 7500,建议修改为其他端口防止被定向爆破
dashboard_port = 7500
# frp管理后台用户名和密码,请修改为复杂用户名与复杂密码
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# tcpmux 类型且复用器为 httpconnect 的代理监听的端口,用于端口复用
tcpmuxHTTPConnectPort = 5002
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
# 服务端和客户端心跳连接的超时时间,默认为 90 秒
heartbeatTimeout = 60
# 用户建立连接后等待客户端响应的超时时间,默认为 10 秒
user_conn_timeout = 60
# HTTP 类型代理在服务端的 ResponseHeader 超时时间,默认为 60s
vhostHTTPTimeout = 60编写 systemd 的 service 文件
# 承接上文,个人将 frp 放置在 /opt/frp 中,下文均以该路径作为 frp 的 path 目录
vi /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动 frps 的命令,需修改为您的 frps 的安装路径
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml
[Install]
WantedBy = multi-user.target使用 systemd 管理 frps 服务
# 启动 frp
sudo systemctl start frps
# 停止 frp
sudo systemctl stop frps
# 重启 frp
sudo systemctl restart frps
# 查看 frp 状态
sudo systemctl status frps
# 开机自启 frp
sudo systemctl enable frps
# 禁用开机自启 frp
sudo systemctl disable frps编写 frps.toml
具体参考 Linux,编写方式一致
使用 nssm 自定义 windows service
# 先去 nssm 项目地址下载最新 nssm 压缩包(虽然人家已经几百年没更新了
http://www.nssm.cc/download
# 将 nssm 加入 Windows Path
# 如果不会修改 path 的话,就直接把对应架构的 exe 执行文件丢到下面目录里就行
%USERPROFILE%\AppData\Local\Microsoft\WindowsApps
# 比如 64 位的系统就直接把 win64\nssm.exe 丢进上面的目录即可
# 打开 cmd,执行命令安装 frp 服务
nssm install frp
# 在 Path 栏填上 frps 文件所在位置,比如
C:\frp\frps.exe
# 在 Startup diectory 栏填入 frps 文件所在目录,比如
C:\frp\
# 在 Arguments 栏填入执行 frpc 的参数
-c frps.toml使用 nssm 管理 frps 服务
# 启动 frp 服务
nssm start frp
# 停止 frp 服务
nssm stop frp
# 重启 frp 服务
nssm restart frp
# 查看 frp 状态
nssm status frp
# 开机自启 frp 服务
[win + r 快捷键打开运行],在出现的界面输入 [services] 后回车
# 找到 frp 服务,右键它,点击属性,将启动类型选择为 [自动] 即可
# 禁用开机自启
# 同上述开机自启步骤,将最后的启动类型修改为 [禁用] 即可如果采用 tcp 协议连接 frpc 的话,只需要在被控端配置即可。如果使用的是 xtcp 协议连接的话,则两端都需要配置。
编写 frpc.toml
# frps 端的公网 ip
serverAddr = "x.x.x.x"
# frps 端的 serverPort
serverPort = 7000
# frps 端的 token
token = "xxx"
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
# 被映射的本地端口
localPort = 22
# frps 端的入口,流量由该入口转发至 localPort
remotePort = 10022启动 frpc 服务
# 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
# 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径
/opt/frp/frpc -c /opt/frp/frpc.toml外网访问 frpc 所在机器
# 假设用户名为 test,frps 端地址为 x.x.x.x
ssh test@x.x.x.x -p 10022
# frp 将请求发送到 x.x.x.x:10022 的流量转发到内网机器的 22 端编写 frpc.toml
# frps 端的公网 ip
serverAddr = "x.x.x.x"
# frps 端的 serverPort
serverPort = 7000
# frps 端的 token
token = "xxx"
[[proxies]]
name = "ssh"
type = "xtcp"
localIP = "127.0.0.1"
# 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端
secretKey = "xxxx"
# 被映射的本地端口
localPort = 22启动 frpc 服务
# 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
# 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径
/opt/frp/frpc -c /opt/frp/frpc.toml编写 frpc.toml
# frps 端的公网 ip
serverAddr = "x.x.x.x"
# frps 端的 serverPort
serverPort = 7000
# frps 端的 token
token = "xxx"
[[proxies]]
name = "visitor_ssh"
type = "xtcp"
# 要访问的 proxy 名称
serverName = "ssh"
bindAddr = "127.0.0.1"
# 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端
secretKey = "xxxx"
# 被映射的本地端口
bindPort = 10022启动 frpc 服务
# 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
# 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径# 假设用户名为 test
ssh test@127.0.0.1 -p 10022参考文档: