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

相关推荐
蜜獾云2 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维4 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
bitcsljl17 分钟前
Linux 命令行快捷键
linux·运维·服务器
ac.char20 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Cachel wood39 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Youkiup1 小时前
【linux 常用命令】
linux·运维·服务器
qq_297504611 小时前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
weixin_437398211 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~1 小时前
ubuntu开机进入initramfs状态
linux·运维·ubuntu
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http