在这里插入图片描述

在网络架构中,有时候需要远程访问位于内网的设备或服务,但由于网络拓扑或安全限制,直接从外部访问内网设备可能会受到限制。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 特点:

  1. 易读性: TOML 文件的语法设计旨在保持简洁、直观且易读。它使用了明显的层次结构,不依赖于标点符号过于复杂的语法。

  2. 最小化: TOML 遵循最小化的设计原则,尽量减少冗余和复杂性,使得配置文件的编写和阅读变得更加简单。

  3. 易于集成: TOML 被设计为易于机器处理,便于在不同的编程语言中解析和生成。因此,许多编程语言都提供了 TOML 的解析器和生成器。

  4. 扩展性: 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)布尔值

  • 布尔值: 使用 truefalse 表示布尔值。

(5)数值

  • 整数和浮点数: TOML 支持整数和浮点数,例如 age = 30pi = 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"

四、windows 远程桌面客户端设置

1. 下载windows客户端

2. 设置 frpc.toml

[common]
server_addr = 服务器ip
server_port=7000  # 服务器端口号

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6200   # 在frps上的端口号

3. 远程连接

使用远程桌面,连接服务器,指定端口号为6200。

4. 设置成服务

(1) 下载 winsw

https://github.com/winsw/winsw/releases

(2)写配置文件

把 下载的 WinSw.exe 改名为 winsw.exe,
新建 winsw.xml文件,内容为:

<service>
	<!-- 该服务的唯一标识 -->
    <id>frp-rdp</id>
    <!-- 该服务的名称 -->
    <name>frp-client</name>
    <!-- 该服务的描述 -->
    <description>frpc客户端</description>
    <!-- 要运行的程序路径 -->
    <executable>D:\tools\frp_0.54.0_windows_amd64\frpc.exe</executable>
    <!-- 携带的参数 -->
    <arguments>-c frpc.toml</arguments>
    <!-- 第一次启动失败 60秒重启 -->
    <onfailure action="restart" delay="60 sec"/>
    <!-- 第二次启动失败 120秒后重启 -->
    <onfailure action="restart" delay="120 sec"/>
    <!-- 日志模式 -->
    <logmode>append</logmode>
    <!-- 指定日志文件目录(相对于executable配置的路径) -->
    <logpath>logs</logpath>
</service>

(3)使用命令

//注册服务
winsw.exe install
//卸载服务
winsw.exe uninstall
//启动服务
winsw.exe start
//停止服务
winsw.exe stop
//重启服务
winsw.exe restart
//查看状态
winsw.exe status
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐