当前位置: 首页 > news >正文

使用FRP(快速反向代理)实现内网穿透——以腾讯云服务器为例

一、FRP简介

FRP,即快速反向代理技术(fast reverse proxy)。本文的FRP程序是基于github开源项目GitHub - fatedier/frp。当前,该程序可实现:“将位于 NAT 或防火墙后面的本地服务器暴露给互联网”。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,允许通过域名 / IP将请求转发到内部服务器。

我个人理解的frp原理如图:

db8622bb49f14cc0b893b67945216d3a.png

 

        主机3想要通过端口X访问主机2的端口D,通过端口Y访问主机2的端口E,但是主机2位于局域网内,外部无法访问

        FRP借助于具有公网IP的主机1。在主机1上运行frps.exe,在主机2上运行frpc.exe,主机1和主机2上的这两个frp进程通过端口C时刻保持连接

        现在,可以通过访问主机1的端口A和端口B,通过两台主机上的FRP程序,转发给主机2的端口C和端口D,实现了内网穿透功能。

        例如,主机3通过端口X 主机1所绑定公网IP  的 端口B 发送请求,该请求由主机1的frps.exe通过端口B接收,然后从端口C转发。因为主机1和主机2的这两个进程通过端口C始终保持连接,因此,在主机2上,侦听端口C的frpc.exe可以接受到该请求并转发给端口D。由此,实现了从端口X端口D的访问。

注:

        以上提到的端口C对应于frps.ini文件中的bind_port 和frpc.ini文件中的 server_port。端口A、B对应于frpc.ini文件中的remote_port。端口D、E对应于frpc.ini文件中的local_port

 

二、前提条件

1. 具备一台拥有公网IP的主机(本文使用腾讯云服务器)。

2.局域网内的主机可以正常访问互联网。

 

三、问题描述

        我有一台位于某局域网下的主机,在该主机上部署了Docker、MySQL等服务,我希望能够在任意地方都能够访问到该主机。但是我的主机位于局域网内,在局域网外无法访问主机资源。考虑到当前有一台可用的腾讯云服务器(拥有一个公网IP),因此,希望通过frp技术实现内网穿透,能够通过腾讯云服务器的某些端口,访问位于局域网下主机的某些端口,进而实现在任意地方通过互联网访问局域网内主机的目的。

        主机和服务器的操作系统均为Windows,因此本文采用FRP的windows发行版。

 

四、软件资源

1. 资源下载

方式一、我在github上下载了linux及windows版本的发布程序,可以直接在下面链接下载。

frp-windows-linux-程序-download-from-github-网络基础文档类资源-CSDN文库

2258833cd3924d0eb93fc4242b160e6d.png

 方式二、在github项目中下载(包含更多的操作系统/处理器版本)GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

be5e51c874d8436286b2058a4d369f7e.png

 2. 资源内容

本例的计算机使用的操作系统为Windows,处理器为X86架构,因此选择frp_0.48.0_windows_386.zip 文件。该文件包含以下内容:

974a243771a3431995b13a0d51a9bdf9.png

 其中:

frpc.exe  运行在客户端(内网中的主机,不具备公网IP)的程序。

frpc.ini  客户端程序的配置文件。

frpc_full.ini  客户端程序的配置文件的所有配置语句都可以参考该文件。

frps.exe  运行在服务器端(具备公网IP的主机)的程序。

frps.ini  服务器端程序的配置文件。

frps_full.ini  客户端程序的配置文件的所有配置语句都可以参考该文件

 

五、服务器端的部署

服务器端是指具备公网IP的主机。

此过程中使用到的文件为:frps.exe 和 frps.ini(两个文件建议放到同一个目录下)

1. 配置文件修改

为了尽可能降低配置复杂度,本次配置以最简方式进行。如果需要一些更复杂的配置或者是想要提高安全性,可以参考Releases · fatedier/frp (github.com)或其他相关资料。

frps.ini 文件的内容为:

[common]
bind_port = 7000

此处仅包含了一个端口号(此端口号可以修改为自己想要使用的任意未使用端口),没有做任何身份验证,因此该连接的安全性不能得到保证。可以增加验证环节,将上述文件修改为:

[common]
# bind_port可以根据自己的需求设置,此处以9000为例子
bind_port = 9000# 此处token(令牌)的值也可以自己根据需要设置
token = ABC123456789xyz

2. 放通云服务器端口(如果非云服务器可跳过这一步)

在服务器中放通所有要使用到的端口。

f200e33c81004b6488bd701a44406e72.png

3. 防火墙设置

在设置 - Windows防火墙 - 允许应用通过防火墙 - 允许其他应用。

然后根据程序的路径找到frps.exe程序,并添加。

d17e1fbac7da4e94be8a83aa1db303c5.png

 0760339ccad947bbbc2c2e74e71b6ec4.png

4. 在服务器端的命令行运行frps.exe程序

 在cmd中切换到对应目录下,运行:

frps.exe -c frps.ini

51848036dd4f4d11b8728a49d308a8d1.png

 需要保持命令行窗口打开。

 

六、客户端的部署

客户端是指内网中的主机,不具备公网IP

此过程中使用到的文件为:frpc.exe 和 frpc.ini(两个文件建议放到同一个目录下)

1. 配置文件修改

可以将客户端的配置文件frpc.ini内容修改为(请在server_addr处填写IP):

[common]
server_addr = 服务器端公网IP# server_port要和frps.ini中的server_port保持一致
server_port = 9000# token也要和frps.ini中的token保持一致
token = ABC123456789xyz# 自己任意起一个名字,比如这里写mysql_port
[mysql_port]
# tcp、udp、http、https、stcp、xtcp默认是tcp
type = tcp# 一般情况下是本机,即127.0.0.1
local_ip = 127.0.0.1# 本地主机使用的端口
local_port = 3306# 远程主机(服务器端,具有公网IP的主机)端口,设置完成后需要通过远程主机的此端口访问local_port,可以与local_port不一致。
remote_port = 10000

2. 运行程序

在cmd中切换到对应目录下,运行:

frpc.exe -c frpc.ini

cd0b9734f9b4427da4b062a099c5c948.png

连接成功 !

七、测试

在内网主机的3306上运行MySQL服务,通过其他主机进行测试:

3b224f4a467444409560b24a5a7bd0b1.png测试成功! 

 

八、更细致的配置文件以供参考

frps.ini

[common]
# bind_port可以根据自己的需求设置,此处以9000为例子
bind_port = 9000# 此处token(令牌)的值也可以自己根据需要设置
token = ABC123456789xyz# only allow frpc to bind ports you list, if you set nothing, there won't be any limit'
# 只允许frpc绑定您列出的端口,如果不设置,则不会有任何限制
allow_ports = 9998,10000-20010# max ports can be used for each client, default value is 0 means no limit
# 每个客户端可以使用的最大端口数,默认值为0表示没有限制
max_ports_per_client = 5# pool_count in each proxy will change to max_pool_count if they exceed the maximum value 
# 如果每个代理中的pool_count超过最大值,则它们将更改为max_pool_count
max_pool_count = 5# Check frp's status and proxies' statistics information by Dashboard.
# 通过仪表板检查FRP的状态和代理的统计信息。dashboard可以在frps端查看状态。
# dashboard's username and password are both optional 仪表板的用户名和密码都是随意的'
# 使用http://[server_addr]:9999 通过admin访问
dashboard_port = 9999
dashboard_user = admin
dashboard_pwd = admin123# console or real logFile path like ./frps.log 
# 控制台或实际日志文件路径,设置日志文件路径后,原本的控制台输出
log_file = ./frps.log# trace, debug, info, warn, error
log_level = trace# 日志最大记录天数
log_max_days = 365

修改完成后还可以在 服务器的http://127.0.0.1:9999(端口号视配置而定) ,使用用户名和密码查看状态。

b7ca6bc108ec4b7e8a3c1e9d7a588c3e.png

frpc.ini

[common]
server_addr = XXx.XXX.XXX.XXX
# server_port要和frps.ini中的server_port保持一致
server_port = 9000# token也要和frps.ini中的token保持一致
token = ABC123456789xyz
# 自己任意起一个名字,比如这里写mysql_port[mydocker]
# tcp、udp、http、https、stcp、xtcp默认是tcp
type = tcp
# 一般情况下是本机,即127.0.0.1
local_ip = 127.0.0.1
# 本地主机使用的端口
local_port = 10101
# 远程主机(服务器端,具有公网IP的主机)端口,设置完成后需要通过远程主机的此端口访问local_port,可以与local_port不一致。
remote_port = 10000# 每个代理的名称不能相同,此处可以设置为mydocker2
[mydocker2]
type = tcp
local_ip = 127.0.0.1
local_port = 17002
remote_port = 17002

 

 

 

如有不当或错误之处,恳请您的指正,谢谢!!!

 

相关文章:

使用FRP(快速反向代理)实现内网穿透——以腾讯云服务器为例

一、FRP简介 FRP,即快速反向代理技术(fast reverse proxy)。本文的FRP程序是基于github开源项目GitHub - fatedier/frp。当前,该程序可实现:“将位于 NAT 或防火墙后面的本地服务器暴露给互联网”。它目前支持 TCP 和…...

d跨语言链接优化

原文 使用LDC的(LTO)链接时优化的简短文章,包含演示了如何提高程序性能的简单示例.因为LTO在LLVMIR级别工作,因此可跨越C/D语言优化! 重要提示:LDC/LLVM的LTO在窗口上不可用. 链接时优化 (LTO)链接时优化是指链接时的程序优化.链接器提取所有目标文件在一起,并合并到一个程序…...

【Linux】-- 进程概念的引入

目录 硬件 冯诺依曼体系结构 冯诺依曼体系结构推导 重点概念 网络数据流向 软件 操作系统(Operator System - OS) 概念 定位 进程内核数据结构PCB(task_struct) 通过系统调用创建进程-fork初始 fork基本用法 使用if进行分流 查看运行效果 …...

一文看懂“低代码、零代码”是什么?有什么区别?

低代码和零代码近几年热度一直居高不下,乍一看,很容易混淆低代码和零代码开发平台—— 因为它们都是传统开发的替代方案,旨在通过类似于可视化编程的功能加速软件开发过程。 但二者根本不是一回事。从开发人员经验 、目标角色到使用场景&…...

【华为OD机试真题】去除多余的空格(java)

去除多余空格 知识点字符串数组Q队列时间限制:2s空间限制:256MB限定语言:不限 题目描述: 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束 下标,去除多余空格后刷新关键词的起始和结束下标。 输入: Life is painting a picture, not …...

【SQL 必知必会】- 第十三课 创建高级联结

目录 使用表别名 Oracle 中没有AS 使用不同类型的联结 自联结 用自联结而不用子查询 自然联结 外联结 全外联结 使用带聚集函数的联结 使用联结和联结条件 使用表别名 SQL 除了可以对列名和计算字段使用别名,还允许给表名起别名。这样做有两个主要理由&#xff…...

ios逆向工具有那些

以下是一些常用的 iOS 逆向工具: Cycript:一种用于在运行时动态分析和修改 iOS 应用程序的强大工具,可以与应用程序进行交互式调试和注入代码。 Frida:一个强大的动态二进制插桩工具,可以在运行时修改应用程序的行为&…...

【软件设计师14】UML建模

UML建模 稳定出一个,但是由于UML的图比较多,所以这种题比数据流图和数据库难度高 一般都会考用例图和类图,再附加其他的图 1. 用例图 包含关系include:比如登记外借信息必须先有用户登录 扩展关系extend:修改书籍…...

容器镜像的设计原理

1 概述: 1.1 历史概要 2016年,Docker制定了镜像规范v2,并在Docker 1.10中实现了这个规范。镜像规范v2分为Schema 1和Schema 2。 Schema 1主要兼容使用v1规范的Docker客户端(从2017年2月起,镜像规范v1不再被Registry支…...

arm64异常向量表

arm64异常向量表1 arm64异常向量表2 linux arm64异常向量表3 kernel_ventry宏4 异常向量表的保存4. VBAR_ELx寄存器4.2 __primary_switched4.3 __primary_switched1 arm64异常向量表 When an exception occurs, the processor must execute handler code which corresponds to …...

【测试面试】吐血整理,大厂测试开发岗面试题(1~4面),拿下年40w...

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 自动化测试面试题&am…...

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍,今天我们来聊一下,如何避免自己重复的写相同的代码,一次代码实现,即可完美复制到任何项目中实现权限相关的功能。 实现…...

002_双指针法

1.移除元素 目标:移除数组中的某一个元素 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。 1.1暴力解法 建立两个for循环,当查找到某个元素以后,将此元素后面的元素全部往前移动 时间复…...

超实用的 Linux 高级命令,程序员一定要懂

前言 在运维的坑里摸爬滚打好几年了,我还记得我刚开始的时候,我只会使用一些简单的命令,写脚本的时候,也是要多简单有多简单,所以有时候写出来的脚本又长又臭。 像一些高级点的命令,比如说 Xargs 命令、管…...

AI+明厨亮灶智能算法 yolo

AI明厨亮灶智能算法通过pythonyolo网络模型分析算法,AI明厨亮灶模型算法可接对后厨实现如口罩识别、厨师服穿戴、夜间老鼠监测、厨师帽识别、厨师玩手机打电话识别、抽烟识别等实时分析监测。Python是一种由Guido van Rossum开发的通用编程语言,它很快就…...

gRPC-Go源码解读一 客户端请求链路分析

最近在学习gRPC相关的知识,为啥要学呢?因为一直在用,古人云,“工欲善其事,必先利其器”。为此,花了不少时间阅读gRPC-Go的源码,收货甚多,比如透过服务发现和负载均衡这俩组件来学习复…...

Word控件Spire.Doc for .net 功能详解

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…...

联想服务器配置RAID

一、背景描述 目前有台联想服务器,配置如下: CPU:2颗处理器,40核 内存:512GB 磁盘:2*960GB SATA 4*2.4TB SAS 计划在联想物理机上安装 Vmware 的 ESXi 6.7 虚拟化管理软件,作为虚拟化服务器。…...

C++ 虚函数表

在 C 中,虚函数表(Virtual Function Table,简称 vtable)是一种用于实现多态性(Polymorphism)的机制。它是一种编译器和链接器生成的数据结构,用于处理虚函数调用。 虚函数是在基类中声明的&…...

rancher2.7丢失集群信息

使用Docker 单节点安装rancher,然后在rancher中创建了一个k8s的集群。重启rancher所在的虚拟机后,登录rancher发现这是新的实例,集群信息丢失了。但是k8s集群还是好好的。 检查k8s的日志,api server日志会报错 time"2023-0…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...