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

news2024/12/23 10:53:17

一、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

 

 

 

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金山衍生新软件,wps,excel用户已在用,Access用户:以后就它了

我们常会用到微软的办公软件Word、Excel、PPT、Outlook,但在数据处理方面还是得看Access。Access用简短的表述来说就是微软开发的一个关系数据库管理系统。★好用,可门槛高,够不着 为啥说数据处理得看Access呢?举个例子&#xff0…

如何实现视觉识别形状

1. 功能说明 通过摄像头识别圆形及矩形两种形状。 2. 电子硬件 本实验中采用了以下硬件: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 Bigfish2.1 电池7.4V锂电池通信2510通信转接板WiFi路由器 其它 摄像头 配置OpenCV的Visual Studio 2015.…

深入了解网络通信原理

同一个 vlan 同一个网段的 ip 地址能够直接互通,那么同一个 vlan 不同的网段能不能互通呢?海翎光电的小编整理了一篇文章,可以解决大家在网络中遇到的一些奇怪的问题,也是可以加深对网络的理解。 一、同 VLAN 不同网段能否 Ping 通…

Linux基本背景介绍与应用场景,Linux两条版本线,创建删除用户与修改密码的指令

TIPS Linux是一款叫做操作系统的软件,比如说你买了一个笔记本,你以为你只买了一个笔记本,实际上笔记本里面还搭建了一个非常重要的软件:操作系统。正是因为有了操作系统的存在,所以说有一个行为:开机就诞生…

再摘一枚重要奖项!腾讯安全获得云安全联盟CSA 2022安全金盾奖

4月13日,第六届云安全联盟大中华区大会(CSA GCR Congress)在上海举办,大会由联合国数字安全联盟、上海市经济和信息化委员会、上海市委网络安全和信息化委员会办公室、上海市普陀区人民政府指导,云安全联盟大中华区主办…

【开源项目】BallCat 项目脚手架

简介 🎉🎉🎉 基于 React 和 Ant Design 版本的前端 ballcat-ui-react 已发布,欢迎大家尝鲜使用 BallCat 组织旨在为项目快速开发提供一系列的基础能力,方便使用者根据项目需求快速进行功能拓展。 在以前使用其他后台管…

开源协议 GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

一、GPL、BSD、MIT、Mozilla、Apache和LGPL的总体结构图如下: 二、协议详细说明 LGPL开源许可证: LGPL 是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL 允许商业软件通过类库引用…

Python学习笔记--文件操作

(一) 文件的编码 1. 编码 编码是一种规则集合,记录了内容和二进制间进行相互转换的逻辑 编码有许多种,最常用的是utf-8 2. 使用编码的原因 计算机只能识别二进制数,因此要将文件的内容翻译为二进制数,才能保…

【K8S系列】深入解析有状态服务

目录 序言 1 基本介绍 2 使用介绍 2.1 Headless Service 2.2 PersistentVolume 2.3 StatefulSet 2.4 Init Containers 3 问题 4 投票 序言 在你想要放弃的时候,想想是什么让你当初坚持走到了这里。 Kubernetes (k8s) 是一个容器编排平台,允许在…

RISC-V Linux 编译设备树

RISC-V Linux 编译设备树 flyfish 设备树是一种描述硬件资源的数据结构 引入设备树的主要目的 曾经 Linux内核中夹杂着大量的设备信息,影响Linux驱动开发效率,因为外部设备发生任何改动,需要重新编写和编译驱动代码。 现在 设备驱动程…

VSCode使用Remote SSH远程连接Linux服务器【远程开发】

文章目录前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程转发自CSDN远…

shell一些操作

文章目录【检查脚本目录】示例【时间和时区】修改时间修改时区修改时区查看时区脚本从服务器同步client主动同步client被动同步docker-compose 时区设置kubernetes设置时区【按时间备份】实例date命令【历史命令和快捷键】历史命令快捷键【重定向】相关符号脚本输出到黑洞cat输…

android studio 页面布局(1)

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/too…

论文阅读 - ANEMONE: Graph Anomaly Detection with Multi-Scale Contrastive Learning

目录 摘要 1 简介 2 问题陈述 3 PROPOSED ANEMONE FRAMEWORK 3.1 多尺度对比学习模型 3.1.1 增强的自我网络生成 3.1.2 补丁级对比网络 3.1.3 上下文级对比网络 3.1.4 联合训练 3.2 统计异常估计器 4 EXPERIMENTS 4.1 Experimental Setup 4.1.1 Datasets 4.1.2 …

Ethercat学习-QT添加SOEM主站

文章目录简介环境搭建1.QT安装2.VS安装3.Win10 Debuggers4.QT配置SOEM移植&#xff11;.lib库生成2.文件移植1.文件整理2.添加文件至QT工程测试简介 QT版本5.14.2 VS版本2017 系统Win10 环境搭建 环境搭建很简单&#xff0c;就是安装几个软件就好了&#xff0c;没有特殊的…

快速排序及优化

快速排序及优化 概要 关于快速排序的原理不赘述&#xff0c;可以查看912. 排序数组 - 力扣&#xff08;Leetcode&#xff09; 本篇文章旨在提供快速排序的C#实现&#xff0c;并通过随机pivot&#xff0c;三数取中&#xff0c;小区间使用插入排序&#xff0c;栈实现&#xff…

Makefile学习

什么是Makefile 使用 GCC 编译器在 Linux 进行 C 语言编译&#xff0c;通过在终端执行 gcc 命 令来完成 C 文件的编译&#xff0c;如果我们的工程只有一两个 C 文件还好&#xff0c;需要输入的命令不多&#xff0c;当文件有几十、上百甚至上万个的时候用终端输入 GCC 命令的方…

NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033

然后我们来看如何把mysql数据实时同步到hive中去 可以看到,其实就是使用 CaptureChangeMySql来获取mysql中变化的数据,具体就是增删改数据 然后再用RouteOnAttribute通过属性,也就是根据是增删改的话,根据这个属性进行路由 把数据路由到不同的位置 然后再用EvaluateJsonPa…

创客匠人人物访谈:客户,如何反推创业发展? |

古语有云&#xff1a;“君者&#xff0c;舟也&#xff1b;庶人者&#xff0c;水也&#xff1b;水则载舟&#xff0c;水则覆舟”。 从创业的角度来看&#xff0c;客户&#xff0c;就是创业这艘小船在市场的海洋里能够安稳航行的必要条件。 在创业的过程中&#xff0c;一定是先有…

STC89C52串口通信当中的UART

1.串口介绍 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大的扩展了单片机的应用范围&#xf…