自己动手部署内网穿透:frp

如果你有云服务器,就可以考虑自己部署内网穿透服务,这篇文章就来说下 frp -- 一个简单、高效的内网穿透工具。

本文测试使用的服务器是腾讯云服务器,系统为 64 位的 CentOS 7.6;客户端是 macOS;测试的 frp 版本为 v0.34.3。

frp 简介

frp 是一个开源项目, 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。

项目地址:https://github.com/fatedier/frp

文档地址:https://gofrp.org/docs

frp 部署要求有一定的 Linux 基础知识,而且需要有一台公网服务器作为服务端。如果是纯小白或没有服务器,可以直接看上一篇文章「免费内网穿透服务推荐」,动手能力或者好奇心强的继续往下看。

frp 基本用法

frp 下载

下载地址:https://github.com/fatedier/frp/releases

服务端和客户端在一个压缩包里,但是由于服务端和客户端系统不一样,可能要下载两个包才行。我这里下载了 frp_0.34.3_linux_amd64.tar.gz 和 frp_0.34.3_darwin_amd64.tar.gz。

服务端安装

将 frp_0.34.3_linux_amd64.tar.gz 解压,并将 frps 和 frps.ini 上传到服务器,我这里上传到了 /usr/local/frp 下。

启动 frp 服务端:

./frps -c ./frps.ini

客户端安装

将 frp_0.34.3_darwin_amd64.tar.gz 解压,用到的文件其实只有 frpc 和 frpc.ini 。

启动 frp 客户端:

./frpc -c ./frpc.ini

启动完服务端和客户端,就可以用了吗?当然不可以,默认的配置都没有修改,接下来就来看看怎么修改。

自定义域名访问内网 Web 服务

这里,我们以「自定义域名访问内网 Web 服务」为例,对服务端和客户端的配置文件(.ini 文件)进行修改。

修改 frps.ini 如下:

[common] bind_port = 7000 vhost_http_port = 80

这里的 vhost_http_port 是 HTTP 服务绑定的端口,可以修改为其他端口,使用 80 端口的好处是访问的时候域名后不用加端口。

修改 frpc.ini 如下:

[common] server_addr = 42.194.190.195 server_port = 7000 [web] type = http local_port = 80 custom_domains = j..xyz

这里的 server_addr 就是你服务器的 IP,local_port 是本地程序的端口,custom_domains 是自定义的域名。

还要做几件事情:

将域名 j..xyz 解析到 42.194.190.195云服务器安全组要放通 7000 端口启动本地 80 端口的程序分别启动服务器和客户端

然后访问 http://j..xyz 即可。

这就是 frp 内网穿透的基本用法,如果觉得够用了下面的不看也可以,但如果觉得不够安全、一个映射不够用等等,那就接着往下看。

frp 进阶玩法

身份认证

为了防止有人随意使用你的 frp 服务,可以添加身份认证,最简单的就是 token 认证。

设置方法:在 frps.ini 和 frpc.ini 的 [common] 段落中配置上相同的 token 参数即可。

例如:

[common] token = juemruen

当然还有更高级的认证,可以参考文档:「frp 身份认证 」。

设置自启动

前面说到的服务端是通过命令启动的,一旦关闭远程连接,服务就会关闭,那怎么让服务保持后台运行呢?

frp_0.34.3_linux_amd64.tar.gz 解压之后可以看到一个 systemd 目录,将其中的 frps.service 文件复制到服务器的 /etc/systemd/system/ 目录下,并修改 ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini,完整配置文件如下:

[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini [Install] WantedBy=multi-user.target

特别提示,如果使用此方法启动 frps 服务,vhost_http_port 又想用 80 端口,需要将配置文件中的 User=nobody 注释掉或删掉,当然也可以使用 Nginx 端口转发,这里就不细说了。

设置 frps 服务开机启动:

sudo systemctl enable frps

启动 frps 服务:

sudo systemctl start frps

这样 frps 服务就可以在后台运行了,即使服务器关机重启也会自动启动。

其他命令如下:

手动重启 frps 服务:sudo systemctl restart frps停止 frps 服务:sudo systemctl stop frps

自定义二级域名

如果同时需要多个代理,那就需要多个域名,是不是要把每个域名都解析到服务器呢?

当然不是, frp 提供了「自定义二级域名」的功能。

首先,解析 *..xyz 到 42.194.190.195。

然后,修改 frps.ini 如下:

[common] bind_port = 7000 vhost_http_port = 80 token = juemruen subdomain_host = .xyz

再修改 frpc.ini 如下:

[common] server_addr = 42.194.190.195 server_port = 7000 token = juemruen [web] type = http local_port = 80 subdomain = j [web1] type = http local_port = 8080 subdomain = w

这里的 web 和 web1 的名称可以自定义,但是不能重复。

最后,重启服务端和客户端,分别访问 http://j..xyz 和 http://w..xyz,也就是本地 80 端口和 8080 端口对应的服务。

这样,即使有很多的代理,也无需一一解析域名,只需要写配置文件就可以了。

服务端 Dashboard

服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信息。

想要知道有多少客户端连接了服务端?有多少个代理?通过服务端 Dashboard 就可以查看。

在 frps.ini 的 [common] 段落添加下面的代码:

dashboard_port = 7500 # dashboard 用户名密码,默认都为 admin,如果不需要,需要主动设置为空 dashboard_user = admin dashboard_pwd = admin

云服务器安全组放通 7500 端口,然后访问「服务器IP:7500」,即 http://42.194.190.195:7500,就可以查看 Dashboard 了。

通过 Proxies-->HTTP 可以查看详细信息:

当然,文中提到的只是 frp 的部分用法,更多关于 frp 的用法和说明可以参考官方文档:https://gofrp.org/docs。

更多文章,欢迎访问我的知乎专栏:掘墓人的小铲子

我的个人博客:掘墓人的小铲子