优雅的 FRP 内网穿透 HTTP 网站服务
认识
FRP 即 Fast Reverse Proxy 是一个用于进行内网穿透的高性能的反向代理工具,它可以帮助你将内网中的服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,使得外部可以访问内网中的服务。
FRP 支持 TCP、UDP、HTTP、HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力,其主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
用途
通过在具有公网 IP 的节点上部署 FRP 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
- 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
- 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
- 代理组间的负载均衡。
- 端口复用,多个服务通过同一个服务端端口暴露。
- 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 FRP 客户端完成某些工作。
- 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
- 服务端和客户端 UI 页面。
安装
FRP 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可,没有额外依赖。下载二进制文件后,设置好配置文件,然后运行命令执行即可。最多在此基础上额外配置监控或者后台保活机制。
由于采用 Golang 编写,所以系统需求和最新的 Go 语言对系统和平台的要求一致,具体可以参考 Golang System requirements。
目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。
解压缩下载的压缩包,将其中的 frpc 拷贝到内网服务所在的客户端机器上,将 frps 拷贝到具有公网 IP 的服务端机器上,放置在任意目录。
配置
准备好 3 个域名,1 个客户端和 1 个具有公网 IP 的服务端。假设公网 IP 为 123.45.67.89
个域名的 DNS 解析为:
frp.domain.com 123.45.67.89
*.frp.domain.com 123.45.67.89
frps.domain.com 123.45.67.89
frpc.domain.com 127.0.0.1 或 123.45.67.89
服务端
在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里贴出站长之前测试的配置,设置了 frp 服务器用户接收客户端连接的端口:
# frps.ini 配置文件
# 设置 [common] 部分,定义一般配置
[common]
# frps 监听的地址、端口,默认分别为 0.0.0.0 和 7000
bind_addr = 0.0.0.0
bind_port = 10000
# 配置 token 用于 frpc 连接 frps。不要泄露给任何人
token = authToken
# 启用 TCP 多路复用,默认为true
tcp_mux = true
# 最大连接数,默认为 10
max_pool_count = 50
# 设置每个客户端允许使用的最大端口数量,默认为 0(不限制)
max_ports_per_client = 10
# frpc 心跳超时时间,默认为90秒
heartbeat_timeout = 60
# 设置允许被映射的端口范围,默认为空(不限制)
allow_ports = 1001-1999,6666,8001-9999
# 设置 Web 服务的配置
# 监听 http 和 https 服务的端口
vhost_http_port = 10080
# vhost_https_port = 10443
# https 服务证书文件路径
# vhost_https_cert = ./your_domain.pem
# vhost_https_key = ./your_domain.key
# 设置子域名的主机部分,默认为空
subdomain_host = frp.domain.com
# 指定自定义的 HTTP 404 错误页面,默认为空
custom_404_page = ./custom_404.html
# 配置 KCP 服务
# KCP 服务绑定的端口,默认为 29900
kcp_bind_port = 10000
# KCP 数据传输方式,默认为 fast2、none、xor、rc4、aes-128、aes-192、aes-256
# kcp_encrypt = fast2
# KCP 数据分片的数量
# kcp_data_shard = 10
# KCP 心跳间隔,默认为10秒
# kcp_check_interval = 10
# KCP 加密密钥
# kcp_encrypt_key = your_encrypt_key
# KCP 数据包大小,默认为 1400
# kcp_mtu = 1400
# kcp 传输时延,默认为50
# kcp_tti = 50
# kcp 上行带宽,默认为 5 Mbps
# kcp_uplink_capacity = 5
# kcp 下行带宽,默认为 100 Mbps
# kcp_downlink_capacity = 100
# kcp 是否启用自定义流控算法,默认为 false
# kcp_cong_ctl = true
# kcp 最大传输单元,默认为 1400
# kcp_mtu = 1400
# kcp 最大发送窗口,默认为 1024
# kcp_sndwnd = 1024
# kcp 最大接收窗口,默认为 1024
# kcp_rcvwnd = 1024
# kcp 是否启用 nodelay 模式,默认为 false
# kcp_nodelay = true
# kcp 是否启用快速重传模式,默认为 true
# kcp_fast_mode = true
# kcp 是否启用广播模式,默认为 false
# kcp_broadcast = false
# kcp 广播地址,默认为 255.255.255.255
# kcp_broadcast_addr = 255.255.255.255
# kcp 广播端口,默认为 30000
# kcp_broadcast_port = 30000
# 设置 Frps Dashboard 的访问配置
# Frps Dashboard 网页界面的端口,默认为 7500
dashboard_port = 20000
# Frps Dashboard 登录用户名、密码,默认为空
dashboard_user = dashboardAdmin
dashboard_pwd = dashboardPassword
# 运行日志记录
# 设置日志保存文件
log_file = ./frps.log
# 设置日志记录级别 debug, info, warn, error
log_level = info
# 设置日志文件最大保留天数,默认为 7 天
log_max_days = 7
使用 FRP 穿透 https 服务配置证书比较复杂,为了更好的使用域名访问,直接使用服务端 Nginx 的反向代理即可,然后再配置 SSL 加密证书,就能实现全局 https 连接了。也正因如此,只需要开放 vhost_http_port
、kcp_bind_port
对应端口即可。
反向代理 Dashboard 隐藏 dashboard_port 端口号:
frps.domain.com -> http://127.0.0.1:20000
反向代理 http 服务 隐藏 vhost_http_port 端口号,同时使每个 http 服务可以使用不同的子域名访问:
*.frp.domain.com -> http://127.0.0.1:10080
至于剩下的 frp.domain.com
,可以用来放一些提示页面啥的。
客户端
# frpc.ini 配置文件
# 设置 [common] 部分,定义一般配置
[common]
# 配置 token 用于 frpc 连接 frps。不要泄露给任何人,必须与服务端一致。
token = authToken
# 一般为 Frps 服务端的公网 IP,填 Nginx 反向代理域名
server_addr = frp.domain.com
# Frps 监听的端口,即 bind_port
server_port = 10000
# Frpc Dashboard 管理地址及端口
admin_addr = 127.0.0.1
admin_port = 12345
# 定义第一个 http 服务站点
[nodejs-demo] # 这个名字不要和其他的重复
type = http
local_ip = 127.0.0.1
# 本地服务的端口号
local_port = 3000
# 公网访问时的域名前缀
subdomain = nodejs
[Web-Two]
type = http
local_ip = 127.0.0.1
local_port = 4001
subdomain = two
当然,你也可以把 Frpc Dashboard 仪表盘内网穿透暴露到公网,但是没啥必要。
[frpc]
type = http
local_ip = 127.0.0.1
local_port = 12345
domain = frpc.domain.com
注意在服务端用 Nginx 反向代理该服务 隐藏 vhost_http_port 端口号,同时使其可以使用指定域名访问:
frpc.domain.com -> http://127.0.0.1:10080
同时,注意使该域名 DNS 记录指向服务端而不是本地 127.0.0.1
。
启动
转到服务端。用命令行工具,进入到 frps 二进制文件所在目录,当然,最好把配置文件 frps.ini
也移动到该目录,然后启动 frps 服务:
# cd /xxx/frps # 访问到 frps 工作目录。
./frps -c ./frps.ini # 原神(bushi 启动 Frps
./frps.exe -c ./frps.ini # Windows 设备启动 Frps
转到客户端。用命令行工具,进入到 frpc 二进制文件所在目录,当然,最好把配置文件 frpc.ini
也移动到该目录,然后启动 frpc 服务:
# cd /xxx/frpc # 访问到 frpc 工作目录。
./frpc -c ./frpc.ini # 原神(bushi 启动 Frpc
./frpc.exe -c ./frpc.ini # Windows 设备启动 Frpc
检查
通过上面的配置。您可以发查通过访问仪表盘查看内网穿透隧道链接情况:
- 服务端:
https://frps.domain.com
- 客户端:
http://127.0.0.1:12345
或https://frpc.domain.com
对于链接的对于内网传统的 HTTP 网站服务,可以访问如下域名:
- nodejs-demo:
https://nedojs.frp.domain.com
- Web-Two:
https://two.frp.domain.com
其他
其实 FRP 内网穿透服务除了建设网站外还可以有其他玩法。详细见:
- Sakura Frp 帮助中心:详细介绍了 HTTP(S) 协议网站、远程桌面 (RDP) 、SFTP/FTP 文件传输、远程开机 (WOL 网络唤醒) 、我的世界(Minecraft) 联机私服、NAS(群晖 Synology、威联通 QNAP、unRAID、绿联 UGREEN)穿透及配置方法。不过教程基于其产品,如使用其他服务器需要自行修改配置。
- FRP 官方文档
当然,你也可以直接白嫖网络上的公益服务: