跳转到内容

Frp内网穿透搭建

介绍

  • frp是一个简单高效的内网穿透工具,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。可用于搭建网站、网盘、MC联机等。
  • 本文主要介绍使用frp搭建网盘服务,并通过公网访问。

下载

官方文档:https://gofrp.org/zh-cn/ Github:https://github.com/fatedier/frp

因为具有公网IP的服务器为Linux系统,本地网盘服务是windows系统,所以我们俩个都要下 文件下载

服务端部署

下载完后,在具有公网IP的服务器上部署,我使用的是宝塔面板。

  1. 安装 systemd
sh
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd

# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
  1. 上传、解压文件到任意目录,为了方便重命名了文件夹,我这里路径为/opt/frp目录,这里可以删除frpc、frpc.toml(frp-client)文件夹,仅保留frps、frps.toml(frp-service)服务器的内容。 alt text 在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080
sh
bindPort = 7000
vhostHTTPPort = 8080
  1. 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。 frps-service 写入内容
sh
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
# 我这里为 /opt/frp/frps -c /opt/frp/frps.toml
ExecStart = /path/to/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target
  1. 使用 systemd 命令管理 frps 服务
sh
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
  1. 设置 frps 开机自启动
sh
sudo systemctl enable frps

如图,表示frp服务端启动成功 started!

客户端部署

在本地windows端部署frp客户端

  1. 解压文件,并删除frps、frps.toml。新建一个run.bat文本用于启动frp,如下。 alt text

  2. 配置frpc.tmol

sh
# 服务器公网IP
serverAddr = "xxx.xx.xxx.xxx"
serverPort = 7000

[[proxies]]
name = "cloud" # 隧道名
type = "http"  # 类型
localIP = "127.0.0.1" # 本地IP
localPort = 5212 # 本地服务端口
customDomains = ["cloud.xtao.site"] # 自定义域名访问

[[proxies]]
name = "tets"
type = "http"
localIP = "127.0.0.1"
localPort = 5213
customDomains = ["test.xtao.site"]
  1. 双击run.bat启动服务
  2. 域名解析,将 cloud.xtao.sitetest.xtao.site 的域名 A 记录解析到服务器的 IP 地址 x.x.x.x。如果服务器已经有对应的域名,您还可以将 CNAME 记录解析到原始域名。
  3. 通过浏览器访问 使用浏览器访问 http://cloud.xtao.site:8080 即可访问内网机器上的 5212 端口服务,访问 http://test.xtao.site:8080 可以访问内网机器上的 5213 端口服务。

TIP

当然,test.xtao.site和cloud.xtao.site可以是两个完全不同的域名

  1. 如果你认为需要加上端口比较麻烦,可以使用nginx反向代理实现无端口访问。
    • 在宝塔中安装nginx,启动nginx,添加反向代理如下
    • 这样直接将80端口转发到8080 反向代理

总结

frp可以通过借助拥有外网IP的机器,实现外网访问内网中的服务。过程如下,浏览器输入域名后,DNS解析到服务器地址,nginx反向代理会根据你访问的域名匹配server块(如果使用的是ip访问,而且你也没有为ip设置server块,则会匹配默认server块,如果没有默认则会转发到第一个server块),反向代理都转发到了127.0.0.1:8080即frp用于接收内网穿透的 HTTP 流量的端口。通过内网穿透结合客户端中customDomains 的配置即可访问到本地不同的web服务。

sh
# 宝塔nginx默认块
server
{
    listen 80;
    server_name _; # 用下划线表示“不匹配任何域名”
    index index.html;
    root /www/server/nginx/html;
}

优化

部署完成后我发现访问速度很慢,下载视频只有100多KB/S的速度,根本跑不满带宽,经过摸索排查,网上搜了几种优化方法,使用后有所改善。

  • 经测试关闭nginx反向代理有所改善(原因未知)。关闭后直接将frps配置中HTTP监听端口改为80
  • 使用kcp协议,增加传输线程池数量,frps中添加配置
    sh
    kcpBindPort = 7000
    transport.maxPoolCount = 50
  • frpc中添加
    sh
    transport.protocol = "kcp"

改用HTTPS

为本地 HTTP 服务启用 HTTPS

  1. 配置frps.toml
sh
bindPort = 7000
vhostHTTPPort = 80
vhostHTTPSPort = 443
kcpBindPort = 7000
transport.maxPoolCount = 50
  1. 配置frpc.toml
sh
serverAddr = "x.x.x.x"
serverPort = 7000
transport.protocol = "kcp"


[[proxies]]
name = "cloud_htts2http"
type = "https"
customDomains = ["cloud.xtao.site"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:5212"

# HTTPS 证书相关的配置
crtPath = "./cloud.xtao.site.crt"
keyPath = "./cloud.xtao.site.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"