跳到主要内容

1、frp部署

实战:docker式部署frp内网穿透-2024.7.13(测试成功)

image-20240713102435925

目录

[toc]

前提

首先就需要准备好一台云服务器,用于提供公网 IP 和流量转发。至于购买哪家的云服务产品,本着能省则省的原则,这个当然是哪家便宜用哪家呢。

我手上目前有闲置的腾讯云的服务器,刚好可以用来作为内网穿透的机器,首先需要在云服务器上设置安全组,我这里为了演示方便,就把所有的端口都放开了,小伙伴可以自行根据自己的需求,开放指定的端口即可。

环境

1台公网服务器(centos7.x系统)
1台家里nuc小主机(ubuntu24.4系统)


frp镜像:
registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps:latest
registry.cn-shenzhen.aliyuncs.com/mogublog_business/frpc:latest

#配置
frp server:
阿里云ecs,2核(vCPU),2 GiB,公网带宽3 Mbps,40GiB ESSD Entry云盘(2120 IOPS)

frp client:
英特尔NUC11TNHi5老虎峡谷(8c,16g,512g ssd)

说明:只要是linux系统就好,且提前安装好docker环境。

源码

链接:https://pan.baidu.com/s/1B42I1kEZYzRm-rKdPm4FLQ?pwd=fxbk 提取码:fxbk 2024.7.13-实战:docker式部署frp-2024.7.13(测试成功)

image-20240713110016819

简介

Frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCPUDPHTTPHTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有 公网 IP 节点的中转暴露到公网。

通过在具有公网 IP 的节点上部署 Frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性:

  • 多种协议支持:客户端服务端通信支持 TCPQUICKCPWebsocket 等多种协议。

  • TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。

  • 代理组间的负载均衡。

  • 端口复用:多个服务可以通过同一个服务端端口暴露。
  • P2P 通信:流量不必经过服务器中转,充分利用带宽资源。

  • 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTPSOCKS5 代理等,以便满足各种需求。

  • 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。

  • 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。

frp 主要由两个组件组成:客户端 ( frpc ) 和 服务端 ( frps )。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frpsfrp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

Frp 是一款在 Github 上非常热门的项目,使用 Golang 语言开发,目前已经有 82kstar 数,社区也很活跃。

https://github.com/fatedier/frp/releases

1、安装服务端

首先来安装服务端,服务端需要在具有公网 IP 的设备上进行安装,我目前的云服务器是预装了 ubuntu24.04 系统。(是linux系统就好)

这里需要使用到 docker 来进行安装,关于 docker 的安装教程,请看如下链接:

linux主机具有docker环境。如何安装dodcker,

https://onedayxyy.cn/docusaurus/docs/centos-docker-online-install 《实战:centos在线安装docker-2022.8.4(成功测试)》

https://onedayxyy.cn/docusaurus/docs/ubuntu-docker-online-install 《实战:ubuntu上安装docker-2022.8.4(成功测试)》

  • 首先使用远程连接工具连接到云服务器,然后使用下面的命令,创建 frp 的服务端配置文件:
vim /root/frps.ini

然后填写配置信息,这里会启动两个端口号:

7000:用于和内网设备数据交互;

7500:提供 frp 图形化界面,同时需要配置面板访问的账号和密码,以及 token 是内网设备和 frp 服务端建立连接时的密码。

cat >>/root/frps.ini <<EOF
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
# 登录面板的密码
dashboard_pwd = 123456

# 身份验证
token = 666666
EOF
  • 启动容器

使用下面 docker 命令,下载我们的 frp 服务端。其中,这里使用到了蘑菇的阿里云镜像仓库地址,官方的镜像地址因为被墙的原因,可能很多小伙伴目前无法访问了。

docker run --restart=always --network host -d -v /root/frps.ini:/etc/frp/frps.ini --name frps registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps

细心的小伙伴,可能会发现:命令行中使用了 --network host 定网络模式为 host 模式。

众所周知,Docker 使用了 Linux 的 Namespaces 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable 规则等都与其他的 Network Namespace 隔离。

如果使用 host 模式时,容器中的应用都直接绑定在宿主机的端口上,没有经过 NAT 转换,但容器的其他如文件系统等还是隔离的。

  • 查看

安装完成后,输入下面命令,即可查看容器运行状态

[root@docusaurus-wiki ~]#docker run --restart=always --network host -d -v /root/frps.ini:/etc/frp/frps.ini --name frps registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps
Unable to find image 'registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps:latest' locally
latest: Pulling from mogublog_business/frps
396c31837116: Pull complete
23169097eaa2: Pull complete
Digest: sha256:2356311d8aa9f01c8b60501af1655756c04bfc9595cd4e2c9eeed02bb62bd62c
Status: Downloaded newer image for registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps:latest
ba8cb18a543f77592e6eb93b4b692cfcd93334121747d25dc8270ba3af8b2ddc
[root@docusaurus-wiki ~]#docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba8cb18a543f registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps "/bin/sh -c '/usr/bi…" 35 seconds ago Up 35 seconds frps
[root@docusaurus-wiki ~]#

可以看到,现在运行了一个 frps 的容器

  • 登录web查看后台

http://47.100.215.163:7500/

同时,frp 还提供了图形化的界面,我们使用 http://your_ip:7500 即可打开对应的图形化界面。输入上面配置文件中,配置的账号和密码登录即可。

如果能看到下面的页面,说明就我们的服务端就安装成功了

自己测试效果:

image-20240713062222592

2、客户端安装

客户端需要在我们的内网的机器上进行安装,在上一期的文章中,我们通过 PVE 系统安装了一个 CentOS 服务器,并搭建了蘑菇系统。

我们接着打开之前的机器,然后使用 SSH 工具进行连接。

  • 首先,需要在这台机器上,创建 frp 的客户端配置文件:
vim /root/frpc.ini

然后填写下面的配置,这里需要注意的是 server_addr 填写的是服务器端的地址,然后 token 是服务端配置的 token 令牌,用于客户端和服务端建立连接。

[common]
# server_addr为云服务器IP地址
server_addr = 47.100.215.163
# server_port为服务端监听端口,bind_port
server_port = 7000
# 服务端设置的token
token = 666666

[ruyu-blog]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8083

上面配置是将这台机器中的四个端口,映射到服务端的四个端口上。

这里我映射的是本地80端口服务,其是我测试的一个博客服务。(比较复杂)

为了简便,这里我再映射一个Ngninx服务,如下:(大家使用nginx来测试就好)

[common]
# server_addr为云服务器IP地址
server_addr = 47.100.215.163
# server_port为服务端监听端口,bind_port
server_port = 7000
# 服务端设置的token
token = Admin@2024

[ruyu-blog]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8083


[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8084

[nginx-test]
type = tcp
local_ip = 127.0.0.1
local_port = 81
remote_port = 8085
  • 启动容器

配置完成后,执行下面命令下载客户端的 docker 镜像,并加载上面的配置文件,启动 frp 的客户端。

docker run --restart=always --network host -d -v /root/frpc.ini:/etc/frp/frpc.ini --name frpc registry.cn-shenzhen.aliyuncs.com/mogublog_business/frpc



docker run -d -p 81:80 --name=web --restart=always nginx

image-20240713104737686

  • 验证

我们再打开 frp 的图形化界面,选中:Proxies → TCP,可以看到这几个端口都已经注册上来了

image-20240713104808493

image-20240713103756614

3、测试效果

访问公网 IP 的8083端口,即可看到本地虚拟机部署的页面。

http://47.100.215.163:8083/

当前的demo为:http://47.100.215.163:81/

image-20240713070443131

nginx-test:

http://47.100.215.163:8085/

image-20240713104827525

最后:

测试完,删除Nginx-test,只保留博客、ssh frp即可。

image-20240713105246414

FAQ

二进制方式部署

已收藏,待测试,目前使用docker方式部署就好。

==安装==

关于如何安装 frp 的说明。

frp 采用 Go 语言编写,支持跨平台,只需下载适用于您平台的二进制文件即可执行,无需额外依赖。

==系统需求==

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

==下载==

您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。

==部署==

  1. 解压下载的压缩包。
  2. frpc 复制到内网服务所在的机器上。
  3. frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

==开始使用!==

  1. 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐
  2. 使用以下命令启动服务器:./frps -c ./frps.toml
  3. 使用以下命令启动客户端:./frpc -c ./frpc.toml
  4. 如果需要在后台长期运行,建议结合其他工具,如 systemdsupervisor

如果您是 Windows 用户,需要在命令提示符中执行相同的命令。

有关如何编写配置文件,请参考 示例 部分中的内容。

完整的配置项说明,请参考 Reference 中的内容。


使用 systemd

此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

==使用 systemd==

此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

在 Linux 系统下,使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。

以下是具体的操作步骤:

  1. 安装 systemd

    如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:

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

    # 使用 apt 安装 systemd(Debian/Ubuntu)
    apt install systemd
  2. 创建 frps.service 文件

    使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。

    $ sudo vim /etc/systemd/system/frps.service

    写入内容

    [Unit]
    # 服务名称,可自定义
    Description = frp server
    After = network.target syslog.target
    Wants = network.target

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

    [Install]
    WantedBy = multi-user.target
  3. 使用 systemd 命令管理 frps 服务

    # 启动frp
    sudo systemctl start frps
    # 停止frp
    sudo systemctl stop frps
    # 重启frp
    sudo systemctl restart frps
    # 查看frp状态
    sudo systemctl status frps
  4. 设置 frps 开机自启动

    sudo systemctl enable frps

通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。

docker方式

次文档已提供。

shell脚本一键安装(测试成功)😍

公网服务器上执行:

cat >>/root/frps.ini <<EOF
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
# 登录面板的密码
dashboard_pwd = 123456

# 身份验证,这里需要修改为自己的token
token = 666666
EOF

docker run --restart=always --network host -d -v /root/frps.ini:/etc/frp/frps.ini --name frps registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps

家里局域网小主机上执行:

cat > /root/frpc.ini << EOF
[common]
# server_addr为云服务器IP地址
server_addr = x.x.x.x(替换成你的公网ip)
# server_port为服务端监听端口,bind_port
server_port = 7000
# 服务端设置的token,身份验证,这里需要修改为自己的token
token = 666666

[ruyu-blog]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080

[ruyu-blog-admin]
type = tcp
local_ip = 127.0.0.1
local_port = 81
remote_port = 8081
EOF

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 81
remote_port = 8022
EOF


docker run --restart=always --network host -d -v /root/frpc.ini:/etc/frp/frpc.ini --name frpc registry.cn-shenzhen.aliyuncs.com/mogublog_business/frpc

引用

搭建的小主机服务器,如何被互联网访问?(蘑菇大佬)https://mp.weixin.qq.com/s/nwAGNd3gbP7gCmRUOAdw_g

frp文档地址:https://gofrp.org/zh-cn/docs/

frp github:https://github.com/fatedier/frp/releases

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人主页:

https://onedayxyy.cn

image-20240711101911622

🍀 知识库:

https://onedayxyy.cn/docusaurus/

image-20240711101933614

🍀 博客:

https://onedayxyy.cn/hexoblog/

image-20240711102002480

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!