Linux学习20 使用FRP进行内网穿透实现远程访问
- 一、FRP简介
- 1. 简介
- 2. 准备环境
- 3. toml文件
- 4. toml文件语法
- (1)表(Table)
- (2)键值对
- (3)数组
- (4)布尔值
- (5)数值
- (6)日期和时间
- (7)注释
- 二、安装和配置FRP
- 1. 下载
- 2. 配置远程登陆SSH服务
- (1)Server端配置
- i. 配置文件: frps.toml
- ii. 配置服务
- iii. 启动和开机启动
- (2)Clinet 配置
- i. 配置文件 frpc.toml
- ii. 配置服务
- (3)实现远程访问
- 3. 在外网访问内网 Web 服务
- (1)修改 frps.toml
- (2)配置frpc.toml
- 4. 配置简单 http 文件服务
- 修改 frpc.toml
- 三、web控制台
- 服务端配置:
- 客户端配置
在网络架构中,有时候需要远程访问位于内网的设备或服务,但由于网络拓扑或安全限制,直接从外部访问内网设备可能会受到限制。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
iii. 启动和开机启动
# 启动frp
systemctl start frps
# 配置frps开机自启
systemctl enable frps
(2)Clinet 配置
vim /opt/frp_0.53.0_linux_amd64/frpc.toml
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.toml
[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"