MENU

优雅的 FRP 内网穿透 HTTP 网站服务

认识

FRP 即 Fast Reverse Proxy 是一个用于进行内网穿透的高性能的反向代理工具,它可以帮助你将内网中的服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网,使得外部可以访问内网中的服务。

FRP 官网 Github

FRP 支持 TCP、UDP、HTTP、HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力,其主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

用途

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

  1. 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  2. 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  3. 代理组间的负载均衡。
  4. 端口复用,多个服务通过同一个服务端端口暴露。
  5. 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 FRP 客户端完成某些工作。
  6. 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  7. 服务端和客户端 UI 页面。

安装

FRP 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可,没有额外依赖。下载二进制文件后,设置好配置文件,然后运行命令执行即可。最多在此基础上额外配置监控或者后台保活机制。

由于采用 Golang 编写,所以系统需求和最新的 Go 语言对系统和平台的要求一致,具体可以参考 Golang System requirements

目前可以在 GithubRelease 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。

解压缩下载的压缩包,将其中的 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_portkcp_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:12345https://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 官方文档

当然,你也可以直接白嫖网络上的公益服务:

返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码