编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

使用FRP进行内网穿透实现远程访问

wxchong 2024-06-08 23:11:16 开源技术 45 ℃ 0 评论


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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表