自己动手部署内网穿透:frp
  分类: 工具   评论: 0 条

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

in 工具 with 0 comment

如果你有云服务器,就可以考虑自己部署内网穿透服务,这篇文章就来说下 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.gzfrp_0.34.3_darwin_amd64.tar.gz

服务端安装

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

启动 frp 服务端:

./frps -c ./frps.ini

客户端安装

frp_0.34.3_darwin_amd64.tar.gz 解压,用到的文件其实只有 frpcfrpc.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.963564449.xyz

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

还要做几件事情:

然后访问 http://j.963564449.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 服务就可以在后台运行了,即使服务器关机重启也会自动启动。

其他命令如下:

sudo systemctl restart frps
sudo systemctl stop frps

自定义二级域名

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

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

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

然后,修改 frps.ini 如下:

[common]
bind_port = 7000
vhost_http_port = 80
token = juemruen
subdomain_host = 963564449.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.963564449.xyzhttp://w.963564449.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 了。

Dashboard

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

Proxies

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

欢迎关注我的公众号,及时获取最新文章推送。