CentOS下搭建Frp内网穿透服务


frp简介
frp 是一个内网穿透工具。 项目主页:https://github.com/fatedier/frp
frp 让本地局域网的机器可以暴露到公网,简单的说就是在世界的任何地方,你可以访问家里开着的那台电脑。
FRP 支持 TCP、UDP、HTTP、HTTPS, 就是说不仅仅限于本地web服务器可以暴露,整台机器都可以暴露,windows的远程控制,mac和linux的ssh都可以被暴露。
FRP 架构

家庭网络结构
我们的网络一般是这样的家里有个路由器,我们通过家里的路由器来上网。我们的电脑IP一般为192.168.0.103 这个叫内网IP,外面的电脑无法访问的。

frp进行的网络穿透原理图

frp穿透的用途

  1. 在办公室访问家里的电脑,反之亦然
  2. 自己电脑上的项目,方便发给客户朋友演示。比如我做了个小网站,发给朋友看看未上线版本,发个url给他就好了。
  3. 调试一些需要远程调用的程序,远程调用比如微信的API 回调接口。 因为我有了外网地址就不需要部署在公网服务器,直接进行本地调试,听起来都棒。

一、准备

首先你需要一个服务器,我的是腾讯云主机。
进行重装系统(为了避免不必要麻烦,非必须),选择CentOS。

然后设置域名(用在内网穿透)指向你的 服务器IP。
我的是使用了一个二级域名和多个三级域名,即 frp.kioye.cn和 *.frp.kioye.cn 都使用A记录指向139.199.210.123。

二、开始安装

先去GitHub看看最新版本:https://github.com/fatedier/frp/releases
当前教程使用版本为:v0.31.2。
下载frp可执行包:

wget https://github.com/fatedier/frp/releases/download/v0.31.2/frp_0.31.2_linux_amd64.tar.gz

解压:

tar zxf frp_0.31.2_linux_amd64.tar.gz

进入文件:

cd frp_0.31.2_linux_amd64/

修改配置

vi frps.ini

内容如下:
[common]
bind_port = 7000 (tunnel port通信管道)
vhost_http_port = 80
vhost_https_port = 443 (http和https端口)
token = 123456 (连接认证token)
subdomain_host = frp.kioye.cn (子域名)
dashboard_port = 7500 (dashboard图形管理页面)
dashboard_user = admin
dashboard_pwd = admin

启动:

./frps -c frps.ini

三、设置frps服务自启动

创建后台启动模版:

vi /etc/systemd/system/frp.service

内容如下:
[Unit]
Description=frps
After=network.target
[Service]
ExecStart=/root/frp_0.31.2_linux_amd64/frps -c /root/frp_0.31.2_linux_amd64/frps.ini
[Install]
WantedBy=multi-user.target

启动测试:

systemctl start frp.service

查看启动状态:

systemctl status frp.service

开机自启:

systemctl enable frp.service

四、客户端搭建

1.使用Mac设置frp内网穿透
下载Mac版客户端:https://github.com/fatedier/frp/releases
这里选择(darwin是Mac版):frp_0.31.2_darwin_amd64.tar.gz
下载完进行解压,然后修改一下配置(frpc.ini)。
进入编辑状态:

vi frpc.ini

修改内容如下:
[common]
server_addr = frp.kioye.cn
server_port = 7000
token = 123456 (如果服务端设置了token,这里也要加上)

[web] (内网穿透名称)
type = http (协议为http(即80端口))
local_ip =127.0.0.1 (内部映射的IP)
local_port = 80 (内部映射为80端口)
(远程端口不用设置,只能沿用frps下vhost_http_port)
subdomain = wd (映射域名为 http://wd.frp.kioye.cn
(custom_domains = blog.kioye.cn) (或者直接指定全域名(你只需要将域名解析到服务器上))

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port =2201 (远程端口)
这里说一下tcp和http的区别:http可以通过读取请求头信息进行转向,所以端口80下请求可以根据域名不同进行转向,而tcp端口只能专用,不能通过域名不同进行转发。
然后就是启动了:

./frpc -c frpc.ini

2.使用k2p路由设置frp内网穿透
登录到k2p路由器
在功能设置里面找到 Frp内网穿透。
设置成如下内容,点击保存即可。
[common]
server_addr = frp.kioye.cn
server_port = 7000

[web]
type = http
local_ip =192.168.2.238
local_port = 80
subdomain = wd

五、FRP客户端设置

  • 通过 TCP 访问内网机器

这里以访问 SSH 服务为例, 修改 FRP 客户端配置文件 frpc.ini 文件并增加如下内容:
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
这样就在 FRP 服务端上成功注册了一个端口为 6000 的服务,接下来我们就可以通过这个端口访问。

  • 通过自定义域名访问部署于内网的 Web 服务

有时需要在公有网络通过域名访问我们在本地环境搭建的 Web 服务,但是由于本地环境机器并没有公网 IP,无法将域名直接解析到本地的机器。
现在通过 FRP 就可以很容易实现这一功能,这里以 HTTP 服务为例:首先修改 FRP 服务端配置文件,通过 vhost_http_port 参数来设置 HTTP 访问端口,这里将 HTTP 访问端口设为 8080。
[common]
bind_port = 7000
vhost_http_port = 8080
其次我们在修改 FRP 客户端配置文件并增加如下内容:
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = XXX.XXXX.com
这里通过 local_port 和 custom_domains 参数来设置本地机器上 Web 服务对应的端口和自定义的域名,这里我们分别设置端口为 80,对应域名为 XXX.XXXX.com
最后将 XXX.XXXX.com 的域名 A 记录解析到 FRP 服务器的公网 IP 上,现在便可以通过 http://XXX.XXXX.com:8080 这个 URL 访问到处于内网机器上对应的 Web 服务。

HTTPS 服务配置方法类似,只需将 vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。
  • 通过密码保护你的 Web 服务

由于所有客户端共用一个 FRP 服务端的 HTTP 服务端口,任何知道你的域名和 URL 的人都能访问到你部署在内网的 Web 服务,但是在某些场景下需要确保只有限定的用户才能访问。
FRP 支持通过 HTTP Basic Auth 来保护你的 Web 服务,使用户需要通过用户名和密码才能访问到你的服务。需要实现此功能主要需要在 FRP 客户端的配置文件中添加用户名和密码的设置。
[web]
type = http
local_port = 80
custom_domains = XXX.XXXX.com
http_user = abc (设置认证的用户名)
http_pwd = abc (设置认证的密码)
这时访问 http://XXX.XXXX.com:8080 这个 URL 时就需要输入配置的用户名和密码才能访问。

该功能目前仅限于 HTTP 类型的代理。
  • 给 Web 服务增加自定义二级域名

在多人同时使用一个 FRP 服务端实现 Web 服务时,通过自定义二级域名的方式来使用会更加方便。
通过在 FRP 服务端的配置文件中配置 subdomain_host参数就可以启用该特性。之后在 FRP 客户端的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
然后只需要将 *.{subdomain_host} 解析到 FRP 服务端所在服务器。之后用户可以通过 subdomain 自行指定自己的 Web 服务所需要使用的二级域名,并通过 {subdomain}.{subdomain_host} 来访问自己的 Web 服务。
首先我们在 FRP 服务端配置 subdomain_host 参数:
[common]
subdomain_host = hi-linux.com
其次在 FRP 客户端配置文件配置 subdomain 参数:
[web]
type = http
local_port = 80
subdomain = test
然后将泛域名 *.XXXX.com 解析到 FRP 服务端所在服务器的公网 IP 地址。FRP 服务端 和 FRP 客户端都启动成功后,通过 test.XXXX.com 就可以访问到内网的 Web 服务。

同一个 HTTP 或 HTTPS 类型的代理中 custom_domains 和 subdomain 可以同时配置。
需要注意的是如果 FPR 服务端配置了 subdomain_host,则 custom_domains 中不能是属于 subdomain_host 的子域名或者泛域名。
  • 修改 Host Header

通常情况下 FRP 不会修改转发的任何数据。但有一些后端服务会根据 HTTP 请求 header 中的 host 字段来展现不同的网站,例如 Nginx 的虚拟主机服务,启用 host-header 的修改功能可以动态修改 HTTP 请求中的 host 字段。
实现此功能只需要在 FRP 客户端配置文件中定义 host_header_rewrite 参数。
[web]
type = http
local_port = 80
custom_domains = test.XXXX.com
host_header_rewrite = dev.XXXX.com
原来 HTTP 请求中的 host 字段 test.XXXX.com 转发到后端服务时会被替换为 dev.XXXX.com。

该功能仅限于 HTTP 类型的代理。

六、frp高级设置

  • 给 FRP 服务端增加一个 Dashboard

通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示,要使用这个功能首先需要在 FRP 服务端配置文件中指定 Dashboard 服务使用的端口:

vim frps.ini

[common]
dashboard_addr = 0.0.0.0 (指定 Dashboard 的监听的 IP 地址)
dashboard_port = 7500 (指定 Dashboard 的监听的端口)
dashboard_user = admin (指定访问 Dashboard 的用户名)
dashboard_pwd = admin (指定访问 Dashboard 的密码)
其次重新启动 FRP 服务端:./frps -c ./frps.ini
浏览器端输入用户名密码后,打开如下:

  • 给 FRP 服务端加上身份验证

默认情况下只要知道 FRP 服务端开放的端口,任意 FRP 客户端都可以随意在服务端上注册端口映射,这样对于在公网上的 FRP 服务来说显然不太安全。FRP 提供了身份验证机制来提高 FRP 服务端的安全性。要启用这一特性也很简单,只需在 FRP 服务端和 FRP 客户端的 common 配置中启用 privilege_token 参数就行。
[common]
privilege_token = 12345678
启用这一特性后,只有 FRP 服务端和 FRP 客户端的 common 配置中的 privilege_token 参数一致身份验证才会通过,FRP 客户端才能成功在 FRP 服务端注册端口映射。否则就会注册失败

  • 启用 TCP 多路复用

从 v0.10.0 版本开始,客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 FRP 可以承载更高的并发数。
该功能默认启用,如需关闭可以在 FRP 服务端配置文件和 FRP 客户端配置文件中配置,该配置项在服务端和客户端必须一致:
在frps.ini 和 frpc.ini 中
[common]
tcp_mux = false

  • FRP 底层通信启用 KCP 协议

FRP 从 v0.12.0 版本开始,底层通信协议支持选择 KCP 协议,在弱网络环境下传输效率会提升明显,但是会有一些额外的流量消耗。
要开启 KCP 协议支持,首先要在 FRP 服务端配置文件中启用 KCP 协议支持:

vim frps.ini

[common]
bind_port = 7000
kcp_bind_port = 7000 (指定定一个 UDP 端口用于接收客户端请求 KCP 绑定的是 UDP 端口,可以和 bind_port 一样)
其次是在 FRP 客户端配置文件指定需要使用的协议类型,目前只支持 TCP 和 KCP。其它代理配置不需要变更:

vim frpc.ini

[common]
server_addr = 4.3.2.1
server_port = 7000 (server_port 指定为 FRP 服务端里 kcp_bind_port 指定的端口)
protocol = kcp (指定需要使用的协议类型,默认类型为 TCP)

  • 加密与压缩

如果内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,可通过设置 use_encryption = true,将 FRP 客户端 与 FRP 服务端之间的通信内容加密传输,将会有效防止流量被拦截。
如果传输的报文长度较长,通过设置 use_compression = true 对传输内容进行压缩,可以有效减小 FRP 客户端 与 FRP 服务端之间的网络流量,来加快流量转发速度,但是会额外消耗一些 CPU 资源。
这两个功能默认是不开启的,需要在 FRP 客户端配置文件中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用的是 snappy。

vim frpc.ini

[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
还有更多的功能请参考:https://www.hi-linux.com/posts/25686.html
https://blog.csdn.net/kxwinxp/article/details/88428053
https://java-er.com/blog/frp-simple-intro/

声明:Hello World|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - CentOS下搭建Frp内网穿透服务


Carpe Diem and Do what I like