内网穿透_frp的使用

发布于:2024-06-26 ⋅ 阅读:(11) ⋅ 点赞:(0)


前言

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

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

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


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

一、frp工具的下载

Linux端的下载

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

1.创建目录
mkdir -p /opt/frp;cd /opt/frp
2.下载frp工具
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
3.解压缩
tar -zxvf *
4.进入解压缩后的文件夹
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配置

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就可以了。

#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

./frps -c frps.ini 

在这里插入图片描述

2.运行frpc

在内网服务器上运行frpc
打开cmd,并执行frpc
在这里插入图片描述
在这里插入图片描述
frps端也出现对应日志信息。

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

我这里的服务就随便写了一个打印数据
在这里插入图片描述

4.启动内网客户端

运行客户端即可
可以看到以下现象
在这里插入图片描述

5. 开始服务通讯

在这里插入图片描述
可以看到内网穿透成功实现。

总结

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