内网穿透_frp的使用

文章目录


前言

由于NAT技术的存在,我们的内网设备是无法从内网直接与公网设备或者其他内网的设备进行连接的,所以,今天我们来学习一种内网穿透技术,来实现内网之间互相访问。

其原理很简单,先让架设服务的内网服务器先与一台处于公网的主机建立连接,然后所有其他需要访问这台处于内网的服务器的客户端主机只需要连接那台公网主机,向公网主机发送服务请求数据,再由这台公网主机将你对应的数据转发至内网服务器暴露的端口中,而之后所有的数据通讯都要经过公网主机的转发,这就是内网穿透的原理。

本次实验需要使用到frp工具。


提示:以下是本篇文章正文内容,下面案例可供参考

一、frp工具的下载

Linux端的下载

最好是以root的身份进行下载

1.创建目录
bash 复制代码
mkdir -p /opt/frp;cd /opt/frp
2.下载frp工具
bash 复制代码
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
3.解压缩
bash 复制代码
tar -zxvf *
4.进入解压缩后的文件夹
bash 复制代码
cd /frp_0.51.3_linux_amd64

可以看到这几个文件

Windows端的下载

1.下载frp

github网址: https://github.com/fatedier/frp/releases

下载windows_amd64的压缩包。

2.将解压包压缩到指定目录

自行解压

解压缩后可以看到这几个文件

frp的配置

根据我拥有的主机的环境为例子,我有一台Linux云服务器处于公网,两台处于内网的电脑。

现在我想让一台处于内网的电脑架设某种服务作为服务器,这里就叫它内网服务器。

我的那台在公网中的Linux云服务器我称为公网主机。

最后一台处于内网的电脑用于访问内网服务器,我称为内网客户端。

公网主机的frps配置

从frp的角度来讲,我们的这台公网主机才是服务器,所以之后就是使用frps程序。

我们需要配置的文件是fprs.ini

fprs.ini

它默认是这个样子,其实这样也够了,我们今天也就是简单使用一下内网穿透。

bind_port: 是fprs的监听端口,fprc需要配置相同的server_port来做到与frps进行连接。

如果需要的话还可以设置了token作为内网穿透的密钥,如果设置了token,frpc端也要设置相同的密钥。

例如

common

bind_port = 7000

token = 1234

内网服务器的frpc配置

bash 复制代码
fprc.toml
serverAddr = "你的frps主机的IP地址"
serverPort = 7000  #端口号要与bind_port一致
[[proxies]]
name = "test-tcp"  #这个代理的名字
type = "tcp"           #连接的类型,这里使用tcp
localIP = "127.0.0.1"  #本地IP地址,直接127.0.0.1就行了
localPort = 7999        #将本地的7999端口暴露给frps
remotePort = 6000    #fprs对应的端口地址,如果frps端有人向它的6000端口发送数据,会被直接转发给fprc的7999端口。

需要注意的就是localPort和remotePort,这里其实就可以理解为fprs对frpc的localPort做了端口映射,映射到了自己的remotePort,有人向remotePort端口建立连接或发送数据,都会被转发到frpc的localPort端口。

内网客户端

内网客户端无需frpc,只需要知道公网主机的IP地址和frpc配置里面的remotePort就可以了。

cpp 复制代码
#include"Socket.h"

const std::string server_ip = "公网主机IP";
const int server_port = 6000;  //与fprc.toml的remotePort一致

int main()
{
	WSADATA wsd;
	WSAStartup(MAKEWORD(2, 2), &wsd);

	Socket sock;
	sock.Init();

	sock.Connect(server_ip, server_port);
	std::cout << "Connect Succeeded!" << std::endl;

	std::string mes;
	char buffer[1024];

	while (1)
	{
		std::cin >> mes;
		send(sock._listensock, mes.c_str(), mes.size(), 0);


		int n = recv(sock._listensock, buffer, sizeof buffer, 0);
		if (n > 0)
		{
			buffer[n] = 0;
			mes = buffer;
			std::cout << mes << std::endl;
		}
	}

	WSACleanup();   //清理网络环境
	return 0;
}

客户端就是一个简单的发送消息的程序。

开始内网穿透实验

1.运行frps

在公网主机上运行frps

bash 复制代码
./frps -c frps.ini 
2.运行frpc

在内网服务器上运行frpc

打开cmd,并执行frpc

frps端也出现对应日志信息。

3.启动内网服务器的服务

我这里的服务就随便写了一个打印数据

4.启动内网客户端

运行客户端即可

可以看到以下现象

5. 开始服务通讯

可以看到内网穿透成功实现。

总结

本章主要讲解了内网穿透的原理,认识如何使用frp工具实现内网穿透。

相关推荐
爱吃生蚝的于勒6 分钟前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森18 分钟前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
翼龙云_cloud35 分钟前
腾讯云代理商: Linux 云服务器搭建 FTP 服务指南
linux·服务器·腾讯云
纤纡.37 分钟前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
科技块儿44 分钟前
2026年我会推荐哪些IP归属地查询网站?
网络·ip地址·ip归属地·运维工具·网络工具·实用网站·2026工具推荐
好好学习天天向上~~1 小时前
6_Linux学习总结_自动化构建
linux·学习·自动化
冉佳驹1 小时前
Linux ——— 静态库和动态库的设计与使用
linux·动态库·静态库·fpic
米羊1211 小时前
已有安全措施确认(中)
网络
陌上花开缓缓归以1 小时前
linux mtd-utils使用源码分析(ubuntu测试版)
linux·arm开发·ubuntu
迎仔2 小时前
A-算力中心网络隔离总览:数字世界的“酒店房间“
网络