在网络架构中,有时候需要远程访问位于内网的设备或服务,但由于网络拓扑或安全限制,直接从外部访问内网设备可能会受到限制。FRP(Fast Reverse Proxy)是一款开源的内网穿透工具,通过建立反向代理通道,使得内网服务可以通过公网访问。本文将介绍如何使用FRP进行内网穿透,实现远程访问内网设备的目的。
一、FRP简介
1. 简介
Fast Reverse Proxy(FRP) 是一款由fatedier开发的高性能的反向代理工具,用于穿透防火墙、NAT等网络障碍,将内网服务映射到公网上。FRP支持TCP、UDP、HTTP等多种协议,操作简单,适用于各种场景。
开源地址: https://github.com/fatedier/frp
FRP的架构:
2. 准备环境
两台Ubuntu系统:
- Server:位于公网
- Client: 位于内网
3. toml文件
frp新版本使用toml格式作为配置文件。
TOML(Tom’s Obvious Minimal Language)是一种用于配置文件的轻量级数据格式,设计得易读、易写。TOML 的目标是成为一种容易理解和编写的配置文件格式,同时保持足够的表达能力。
TOML 特点:
- 易读性: TOML 文件的语法设计旨在保持简洁、直观且易读。它使用了明显的层次结构,不依赖于标点符号过于复杂的语法。
- 最小化: TOML 遵循最小化的设计原则,尽量减少冗余和复杂性,使得配置文件的编写和阅读变得更加简单。
- 易于集成: TOML 被设计为易于机器处理,便于在不同的编程语言中解析和生成。因此,许多编程语言都提供了 TOML 的解析器和生成器。
- 扩展性: TOML 具有一定的扩展性,允许在语法中添加一些自定义的元素以适应特定的应用场景。
TOML 的文件以 .toml 扩展名结尾,其中包含了键值对、表(Table)、数组等元素。下面是一个简单的 TOML 示例:
[owner]
name = "Tom"
dob = 1985-05-27T07:32:00Z
[database]
server = "localhost"
ports = [8000, 8001, 8002]
connection_max = 5000
enabled = true
4. toml文件语法
TOML(Tom’s Obvious Minimal Language)有一套简洁而直观的规则,用于定义配置文件。以下是 TOML 的主要规则:
(1)表(Table)
- 表的定义: 使用 [ ] 包裹表名,例如 [owner] 表示一个名为 “owner” 的表。
- 嵌套表: 表可以嵌套,形成层次结构,例如 [owner.address] 表示 “owner” 表下的 “address” 子表。
(2)键值对
- 键值对的定义: 使用 key = value 的形式定义键值对。
- 字符串: 字符串可以用双引号 "" 或单引号 '' 括起来,例如 name = "Tom" 或 name = 'Tom'。
- 多行字符串: 使用三个双引号 """ 或三个单引号 ''' 来定义多行字符串。
(3)数组
- 数组的定义: 使用方括号 [] 包裹,例如 ports = [8000, 8001, 8002]。
- 不同类型的数组元素: 数组中的元素可以是不同类型的值。
(4)布尔值
- 布尔值: 使用 true 或 false 表示布尔值。
(5)数值
- 整数和浮点数: TOML 支持整数和浮点数,例如 age = 30 或 pi = 3.14。
(6)日期和时间
- 日期和时间: TOML 支持日期和时间的表示,例如 dob = 1985-05-27T07:32:00Z。
(7)注释
- 注释: 使用 # 进行单行注释,例如 # This is a comment。
在 frp 的配置里,[]表放的是通用设置,[[proxies]]数组用于定义代理。 允许设置多个代理。
二、安装和配置FRP
1. 下载
从 https://github.com/fatedier/frp/releases 可以下载到对应操作系统的编译版本。
下载后解压缩即可。
本示例程序安装位置:
/opt/frp_0.53.0_linux_amd64/
2. 配置远程登陆SSH服务
(1)Server端配置
i. 配置文件: frps.toml
vim /opt/frp_0.53.0_linux_amd64/frps.toml
bindPort = 7000 # Server的绑定端口
webServer.addr = "0.0.0.0" # 0.0.0.0绑定所有网卡
webServer.port = Server的WEB服务端口
# dashboard's username and password are both optional
webServer.user = "Cient登陆账号"
webServer.password = "Client登陆密码"
transport.useEncryption = true
transport.useCompression = true
ii. 配置服务
sudo vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,路径要匹配
ExecStart = /opt/frp_0.53.0_linux_amd64/frps -c /opt/frp_0.53.0_linux_amd64/frps.toml
[Install]
WantedBy = multi-user.target
1234567891011
iii. 启动和开机启动
# 启动frp
systemctl start frps
# 配置frps开机自启
systemctl enable frps
(2)Clinet 配置
vim /opt/frp_0.53.0_linux_amd64/frpc.ini
i. 配置文件 frpc.toml
serverAddr = "Server地址"
serverPort = 7000 # server的bindPort
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # frpc在client上的端口
ii. 配置服务
sudo vim /etc/systemd/system/frpc.service
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,路径要匹配
ExecStart = /opt/frp_0.53.0_linux_amd64/frpc -c /opt/frp_0.53.0_linux_amd64/frpc.ini
[Install]
WantedBy = multi-user.target
(3)实现远程访问
ssh -oPort=6000 Client登陆账号@Server地址
3. 在外网访问内网 Web 服务
(1)修改 frps.toml
bindPort = 7000
vhostHTTPPort = 8080
vhostHTTPSPort = 8090 # 如果需要配置https proxy就设置这个
(2)配置frpc.toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["www.example.com"]
www.example.com 域名需要配置 CNAME 记录指向 ServerIP。
4. 配置简单 http 文件服务
简单http文件服务可以直接提供静态文件访问。
修改 frpc.toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "test_static_file"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "static_file"
localPath = "/tmp/files"
stripPrefix = "static"
httpUser = "abc"
httpPassword = "abc"
frp还可以配置私有服务、P2P服务等,这里不再详细介绍。
三、web控制台
服务端配置:
webServer.port = 7500
# dashboard's username and password are both optional
webServer.user = "admin"
webServer.password = "admin"
webServer.tls.certFile = "server.crt"
webServer.tls.keyFile = "server.key"
访问网页 https://[serverAddr]:7500 可以看到如下控制台。
客户端配置
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
本文暂时没有评论,来添加一个吧(●'◡'●)