frp - 内网穿透工具
1. 简介
FRP(Fast Reverse Proxy):这是一个开源的、高性能的内网穿透和反向代理软件,支持TCP、UDP、HTTP、HTTPS等多种协议。FRP可以将内网服务安全、便捷地通过具有公网IP的节点暴露到公网,实现内网穿透。FRP由客户端(frpc)和服务端(frps)组成,服务端部署在具有公网IP的机器上,客户端部署在需要穿透的内网服务所在的机器上。FRP支持多种代理类型,包括TCP代理、HTTP代理和UDP代理,还支持静态文件服务器,可以将本地文件通过HTTP或HTTPS方式提供给公共网络访问
2. 工作原理
FRP由两个主要组件构成:服务端(frps)和客户端(frpc)。服务端通常部署在具有公网IP的机器上,而客户端部署在需要穿透的内网服务所在的机器上。工作原理如下:
-
服务端运行并监听一个主端口,等待客户端的连接。
-
客户端连接到服务端的主端口,并告诉服务端要监听的端口和转发类型。
-
服务端fork新的进程监听客户端指定的端口。
-
外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端。
-
客户端进程再将数据转发到本地服务,实现内网对外暴露服务的能力。
3. 实例
整体文件结构
dev-ops
---frpc
---config
---frpc.toml
---docker-compose.yml
---frps
---config
---frps.toml
---docker-compose.yml
3.1 服务端
需要一个公网服务器,上各大主流网站买一个最低配的服务器(2核2G,几十块钱一年),需要的只是其IP。在服务器中安装frp作为server。
编写frps.toml文件
# https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板的账号密码(修改成自己的)
dashboard_user = admin
dashboard_pwd = admin
# token =
token:如果设置了,需要客户端和服务端保持一致。
docker-compose.yml
# 命令执行 docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
frps:
image: fatedier/frps:v0.60.0
hostname: frps
container_name: frps
volumes:
- "./config/frps.toml:/frps.toml"
command:
- "-c"
- "/frps.toml"
network_mode: "host"
-
docker compose 按照脚本,走的是
network_mode: "host"不需要额外指定端口。 -
你需要在云服务器开放 7000、7500 以及需要映射出去的端口。比如客户端配置了 8080、9001 也需要在云服务器开放端口,这样才能访问进来。
-
官网配置:https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml (opens new window)这里有很全的配置可以参考。
在服务器中运行这个文件
docker-compose.yml up -d
3.2 客户端
在内网中启动一个frp容器,将需要代理的服务注册到frps服务器。
编写frpc.toml文件
# 服务端地址 https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml
serverAddr = "117.72.37.243"
# 服务端配置的bindPort
serverPort = 7000
# token =
[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "jenkins-demo"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "127.0.0.1"
# 客户端代理应用端口
localPort = 8811
# 服务端反向代理端口;提供给外部访问
remotePort = 8811
[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "mysql-dashboard"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "127.0.0.1"
# 客户端代理应用端口
localPort = 8899
# 服务端反向代理端口;提供给外部访问
remotePort = 8899
-
[[proxies]]:需要代理其他端口只需要添加重复代码,然后按需修改即可代理多个端口。
-
已经代理两个应用端口,需要在服务器的安全组中添加规则,8811、8899。
docker-compose.yml
# 命令执行 docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
frpc:
image: fatedier/frpc:v0.60.0
hostname: frpc
container_name: frpc
volumes:
- "./config/frpc.toml:/frpc.toml"
command:
- "-c"
- "/frpc.toml"
network_mode: "host"
docker-compose.yml
注:服务器中启动frps容器、内网启动frpc容器。针对该示例需要在添加服务器安全组规则,7000、7500、8811、8899。
4. 测试
本文参与测试的玩家:
frpc:nas(私有云,一个内网服务器,可以在其中部署应用)。
frps:华为云(2核2G)。
4.1 启动frps容器

4.2 启动frpc容器

4.3 配置安全组规则

4.4 验证
访问 http://服务器IP:7500,进入frps管理界面,账户密码在frps.toml文件中配置,本文都为admin。

可以看到代理的服务应用都注册到frps。
访问 http://服务器IP:8811,已经可以访问到nas中的应用。

注:
1、部署在nas私用云中的应用与部署在电脑本地一样,都是在内网中。
2、后期可能出一篇关于nas的文章。
不积跬步,无以至千里 --- xiaokai
更多推荐



所有评论(0)