使用FRP搭建内网穿透工具,自己公网服务器独享内外网端口转发

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。

简单来说,就是让互联网(外网)设备能访问局域网(内网)设备提供的服务,这里的设备通常指电脑。

一、内网穿透的应用场景

对开发人员来说,需要使用到内网穿透的一个典型的应用场景就是针对第三方授权(通常是 OAuth2.0)和支付回调的开发调试。通过内网穿透工具将第三方 SDK 或平台的回调地址映射到本机开发环境,从而达到实时调试的目的。

其次是节约部署成本(通常是公网服务器费用)。通过将应用部署在本机,再利用内网穿透工具对外提供服务,这样既能节约服务器租用费用,又能提升服务器的硬件配置。

目前,市面上有不少免费提供内网穿透的工具/产品,比如很大众化的nat123,那为什么还要自己搭建呢?

笔者搭建内网穿透的目的就属于,低频率开发调试用,在拥有公网服务器的条件下,自建是最合适的方式。

二、内网穿透的搭建工具

ngrok:一个国外的穿透工具,1.0 版本是开源的,目前 2.0 及以上版本已经闭源,并且提供免费和收费的服务。

frp:这是一个国内的开源工具,目前最新版本为 v0.61.1(截止2025-02-14),有比较详尽的中文文档,并且一直在维护更新。

由于 frp 一直开源,并且维护积极、更新频繁,再加上中文文档的加持,笔者最终选择了 frp 作为搭建工具。

注:frp 自主搭建需要一个有公网 ip 的服务器,本文使用阿里云 ECS。

三、frp 下载和版本选择

官方 github release 地址,目前最新版本是 v0.61.1(截止2025-02-14),官方github地址可能不易访问和下载,这里提供了 v0.61.1 的常用平台安装包:developbook.cn/download/fr…

1、版本选择说明

压缩包说明

frp_0.61.1_darwin_amd64.tar.gz适用于 Mac OS 系统

frp_0.61.1_freebsd_amd64.tar.gz适用于 FreeBSD 64 位系统

frp_0.61.1_linux_amd64.tar.gz适用于 Linux 64 位系统

frp_0.61.1_linux_arm.tar.gz适用于 Linux 32 位嵌入式系统

frp_0.61.1_linux_arm64.tar.gz适用于 Linux 64 位嵌入式系统

frp_0.61.1_windows_amd64.zip适用于 Windows 64 位系统

frp_0.61.1_windows_arm64.zip适用于 Windows 64 位嵌入式系统

笔者的服务器系统为 CentOS7 64 位,所以选择了 frp_0.61.1_linux_amd64.tar.gz;笔者的个人电脑系统为 Mac OS X,所以选择了 frp_0.60.1_darwin_amd64.tar.gz。

2、下载方式

直接下载

直接点击链接,使用浏览器下载到本机。利用 ssh 工具连接到阿里云 ECS,再使用 lrzsz 工具的 rz 命令将 frp_0.61.1_linux_amd64.tar.gz 上传到服务器,而压缩包 frp_0.61.1_darwin_amd64.tar.gz 直接在本机解压。

推荐大家一款Mac上好用的免费SSH工具:FinalShell

注:ssh 工具、lrzsz 实用工具的安装和用法可自行搜索。

终端命令下载

    服务器// 下载
wget https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_linux_amd64.tar.gz

// 解压
tar -xzvf frp_0.61.1_linux_amd64.tar.gz

    本机// 使用curl下载
curl -O https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_darwin_amd64.tar.gz

// 解压
tar -xzvf frp_0.61.1_darwin_amd64.tar.gz

3、frp 压缩包文件说明

每个压缩包解压后都包含以下文件:

    frpc —— 客户端可执行二进制文件
frpc.toml —— 客户端使用的配置文件
frps —— 服务端可执行二进制文件
frps.toml —— 服务端使用的配置文件

注:服务端只需用到 frp_0.61.1_linux_amd64 目录下的 frps 相关文件,本机(客户端)只需用到 frp_0.61.1_darwin_amd64 目录下的 frpc 相关文件。

四、FRP服务端配置和启动

1、在服务器上打开 frps.toml:

  vi frps.toml

注:确保当前已进入工作目录/root/frp_0.61.1_linux_amd64/。

2、配置 frps 要监听的端口:按下 i 进入编辑模式,在末尾增加一行:vhostHTTPPort = 8080,使 frps.toml 最终配置如下:

  [common]
bindPort = 7000
vhostHTTPPort = 8080

注:vhostHTTPPort 监听的端口不能被占用,否则会导致 frps 不能启动,端口可根据实际需要修改;bindPort 端口为 frp 服务端和客户端连接通信的端口,默认为 7000。

3、保存配置并退出:按下 Esc,输入:wq。

4、启动 frps 程序:

  ./frps -c ./frps.toml

注:如遇 permission denied 错误,表明 frps 可能没有运行权限,则先赋权:

  chmod 700 frps

然后再次执行启动命令。

五、FRP客户端配置和启动

1、在本机进入 frp_0.61.0_darwin_amd64 目录,打开 frpc.toml 文件;

2、以配置访问内网的 web 服务(常见情形)为例,最终修改 frpc.toml 如下:

  serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "local-service"
type = "http"
localIP = "127.0.0.1"
localPort = 3000

注:x.x.x.x 为运行 frps 的服务器公网 ip,localPort 为本机启动的 web 服务对应的端口,请根据实际情况修改。

3、启动 frpc 程序:

  sudo ./frpc -c ./frpc.toml

注:此时 frpc 会通过 7000 端口尝试与 frps 建立通信连接,如果一切顺利,则终端会提示连接成功;但实际情况却显示连接失败,因为还少了两个步骤:

一、需要登录阿里云控制台将 7000 端口加入阿里云 ECS 安全组的入站规则里面,同理还需将 8080 端口加入。具体操作参考:添加安全组规则;

二、将 7000 和 8080 加入服务器防火墙规则,具体操作参考:CentOS7 使用 firewalld 打开关闭防火墙与端口。

当一切就绪,frpc 启动并连接成功后,打开浏览器输入 x.x.x.x:8080 就能访问到本机 127.0.0.1:3000 的服务(本机 web 服务需要处于启动状态)。

至此,一个最简配置的基于 frp 的内网穿透便搭建完成,更多配置和用法,请参考官方文档:frp 官方中文文档。

六、小结

有公网主机资源和有一定的网络知识的,是可以花点时间自己搭建自己专属的内网穿透服务器的,采用FRP这样的开源工具,社区支持文档多,有什么问题可以参考相应教程来处理。

没有公网IP的和普通用户,或确实不想多折腾的,还要是要老老实实用其他三方内网穿透工具,如nat123这样的有界面直接操作一步添加映射可以自定义内网地址和公网地址端口,就能实现内网提供发布到互联网。

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

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

相关文章

JavaWeb01——基础标签及样式(黑马视频笔记)

1.如何用VScode写html代码 1. 首先在vscode上安装一些插件,插件如下: 2.打开你要写入的html文件的文件夹,然后右击“ 新建文件”,命名 “xxx.html”, 3.如果是写 css文件,那么也是右击“新建文件”,命名“x…

在2G大小的文件中,找出高频top100的单词

将 2GB 的大文件分割为 2048 个大小为 512KB 的小文件,采用流式读取方式处理,避免一次性加载整个文件导致内存溢出。初始化一个长度为 2048 的哈希表数组,用于分别统计各个小文件中单词的出现频率。利用多线程并行处理机制遍历所有 2048 个小…

基于LNMP分布式个人云存储

1.准备工作a.关闭两台虚拟机的安全软件客户端:[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指针运算全攻略:加减、比较与排序

常见的指针指针运算说明1.指针与整数的加减运算对指针可以进行加法运算&#xff0c;即p n或者p - n。其结果依旧是一个是一个指针&#xff0c;新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型)&#xff09;个字节。示例&#xff1a;#include<stdio.…

物联网安装调试-物联网网关

物联网网关作为连接终端设备与云平台的核心枢纽,其分类与选型需结合功能定位、硬件性能、连接方式及应用场景等多维度考量。以下从分类体系和产品推荐两方面系统梳理,助您高效决策: 🔧 一、物联网网关分类体系 1. 按功能定位划分 类型 核心能力 典型场景 代表产品 边缘计…

Jenkins教程(自动化部署)

Jenkins教程(自动化部署) 1. Jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;广泛用于项目开发&#xff0c;具有自动化构建、测试和部署等功能。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&…

linux 驱动验证是否成功 之 查看moudle信息

这些是 Linux 内核模块&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通过如下方式查看&#xff1a;✅ 1. 使用 modinfo 命令查看已加载或已编译模块信息 示例&#xff1a; modinfo aw2013.ko输出内容大概如下&#xff1a; filename:…

浏览器关闭之前请求接口到后端

2025.07.24今天我学习了如何在浏览器关闭之前请求一个接口返回到后端。可以用performance.navigation判断是浏览器关闭&#xff0c;还是浏览器刷新&#xff0c;因为我这边只需要浏览器关闭的时候才去触发1. 利用performance API&#xff08;刷新检测&#xff09; 刷新页面时&am…

MySQL批量数据处理与事务管理

MySQL是一种广泛应用的关系型数据库管理系统&#xff0c;尤其在数据分析和业务逻辑处理方面具有重要地位。在数据量庞大的业务场景中&#xff0c;批量数据处理和事务管理是提高效率和保障数据一致性的重要手段。掌握高效的批量数据操作方法与事务管理技巧&#xff0c;不仅能够提…

iOS网络之异步加载

为什么你的图片要异步加载&#xff1f;在仿写天气预报时&#xff0c;我们常常需要从网络加载天气图标&#xff0c;例如显示某个小时的天气状态图标。这看似简单的事情&#xff0c;如果处理不当&#xff0c;却很容易造成界面卡顿&#xff0c;甚至影响整个 App 的用户体验。错误做…

C#值类型属性的典型问题

问题复现&#xff1a;值类型属性的副本问题以下代码展示了值类型属性的典型问题&#xff1a;struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用属性修改结构体&#xff08;无效&#xff01;&#xff09; var obj new MyC…

机器学习基础-k 近邻算法(从辨别水果开始)

一、生活中的 "分类难题" 与 k 近邻的灵感 你有没有这样的经历&#xff1a;在超市看到一种从没见过的水果&#xff0c;表皮黄黄的&#xff0c;拳头大小&#xff0c;形状圆滚滚。正当你犹豫要不要买时&#xff0c;突然想起外婆家的橘子好像就是这个样子 —— 黄色、圆…

【WPF】NumericUpDown的用法

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;NumericUpDown 控件并不是内置的标准控件之一&#xff0c;但它是一个非常常用的控件&#xff0c;用于让用户输入一个数值&#xff08;整数或浮点数&#xff09;&#xff0c;并提供上下箭头来递增或…

Kotlin位运算

Kotlin 提供了几种用于操作整数各个位&#xff08;bit&#xff09; 的运算符。这些操作是由处理器直接支持的&#xff0c;速度快且操作简单。在底层编程中非常重要&#xff0c;比如设备驱动、低级图形处理、网络通信、加密和压缩等。 尽管计算机通常都有高效的硬件指令来执行算…

墨者:通过手工解决SQL手工注入漏洞测试(MongoDB数据库)

一、SQL手工注入漏洞测试(MongoDB数据库) 本文以墨者学院靶场为例&#xff0c;演示MongoDB数据库的手工SQL注入全过程。靶场以自己的地址为准&#xff1a;http://124.70.71.251:42286/new_list.php?id1 二、注入原理说明 MongoDB作为NoSQL数据库&#xff0c;其注入方式与传…

Kafka——CommitFailedException异常处理深度解析

引言在分布式消息系统Kafka的生态中&#xff0c;消费者组&#xff08;Consumer Group&#xff09;机制是实现高吞吐量和负载均衡的核心设计。然而&#xff0c;消费过程中位移提交&#xff08;Offset Commit&#xff09;的稳定性始终是开发者面临的最大挑战之一。当消费者尝试提…

kafka的部署和jmeter连接kafka

zookeeper的安装 kafka依赖Zookeeper所以要先安装Zookeeper kafka的安装文章引用来源:Kafka下载和使用&#xff08;linux版&#xff09;-CSDN博客 通过wget命令安装 # 安装wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.7.1-bin.tar.gz# 解压tar…

Android UI 组件系列(八):ListView 基础用法与适配器详解

博客专栏&#xff1a;Android初级入门UI组件与布局 源码&#xff1a;通过网盘分享的文件&#xff1a;Android入门布局及UI相关案例 链接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取码: 4k9n 一、引言 在上一篇文章《Android UI 组件系列&#xff08;…

Android学习专题目录(持续更新)

1.Android 调试 1.1&#xff1a;Logcat日志分析 2.Android编译 2.1&#xff1a;android编译过程中的mk文件和bp文件的扫描机制 2.2&#xff1a;Android 构建系统中常见的 .mk 文件及其作用 2.3&#xff1a;Android构建系统中的mk文件语法函数 2.4&#xff1a;安卓中定…

c#Lambda 表达式与事件核心知识点整理

一、Lambda 表达式1. 概念 Lambda 表达式是一种匿名函数&#xff08;无名称的函数&#xff09;&#xff0c;简化了委托和匿名方法的写法&#xff0c;格式为&#xff1a; (参数列表) > 表达式或语句块 它可以作为参数传递&#xff0c;或赋值给委托类型变量。2. 基本语法与简写…