内网穿透_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工具实现内网穿透。

相关推荐
Amnesia0_07 小时前
网络层IP
网络·网络协议·tcp/ip
MR.欻7 小时前
ZLMediaKit 源码分析(七):HTTP-FLV 低延迟直播流分析
网络·网络协议·http
coward918 小时前
Linux内核驱动初始化流程认识(关于late_initcall和modul_init驱动初始化宏差异)
linux·嵌入式硬件
Zzzzmo_8 小时前
【网络原理】TCP/IP协议01
网络·tcp/ip
modelmd8 小时前
Linux man 命令详解:从入门到精通
linux
SWAGGY..8 小时前
Linux系统编程:(十一)进程状态&&Linux中的僵尸状态
linux·服务器·编辑器·vim
洵有兮8 小时前
Shell 脚本编程学习总结(基础 + 变量 + 条件 + 流程控制 + 函数数组)
linux·学习
我命由我123458 小时前
SEO 与 GEO 极简理解
java·linux·运维·开发语言·学习·算法·运维开发
dxxt_yy8 小时前
鼎讯信通 TY-30H 光纤熔接机:铁路通信施工设备科普
网络
楼兰公子8 小时前
RK3588 Linux驱动开发大纲
linux·驱动开发