Linux网络:代理 穿透 打洞

Linux网络:代理 & 穿透

    • 代理
      • 正向代理
      • 反向代理
    • 内网穿透
      • frp
    • 内网打洞


代理

正向代理

正向代理是一种常见的网络代理方式,它位于客户端与目标服务器之间,代表客户端向服务器发送请求,接收响应。

在这里插入图片描述

如图,客户端发送的所有请求,都交给正向代理服务器,由代理服务器转发数据给服务端。当服务端返回响应时,先把响应发给正向代理服务器,正向代理服务器再把这个响应转发给客户端。

基于这种代理方式,可以实现很多功能:

  1. 隐藏客户信息:这种方式下,服务端全程只与代理服务器交互,无法得知用户的IP地址等信息
  2. 缓存加速:正向代理服务器中,可以缓存一些经常访问的资源,当客户端请求资源时,如果已经在缓存中存在,那么不会去访问服务器,而是直接返回。这样既可以加速客户端的响应时间,还可以减轻服务端的压力
  3. 访问控制:正向代理服务器可以限制用户的访问内容,比如禁止某些网址的访问,如果检测到用户访问不允许的内容,直接拒绝

反向代理

反向代理也位于客户端与服务器之间,但是客户端需要通过互连网访问代理服务器,而不再由代理服务器去访问互连网。

在这里插入图片描述

可以看出,相比于正向代理,其实交换了互连网和代理服务器的顺序,就得到了反向代理。

反向代理一般由服务端配置,当客户端请求数据时,发送请求到互连网,再访问到反向代理服务器,由服务器把请求转发给后端。

反向代理也可以实现很多功能:

  1. 负载均衡:当处于一个分布式系统中,反向代理服务器可以把请求均匀的分配到不同的服务器上,实现负载均衡
  2. 安全保护:反向代理模式下,客户端与反向代理交互,无法得知具体的后端信息,可以保护后端,除此之外,在反向代理服务器上,还可以配置防火墙、访问控制列表等功能
  3. 缓存加速:这个和正向代理相似,可以把频繁访问的数据放到反向代理服务器上,如果访问到缓存内部的数据,直接返回,不再经过后端
  4. 动静分离:用户请求的数据,分为动态数据和静态数据,动态数据需要经过后端计算,而静态数据是固定的,对于这样的静态数据,就可以配置到反向代理服务器上,不再经过后端返回,而是代理服务器直接返回

内网穿透

内网穿透也称为NAT穿透,它允许位于内网的设备能够被公网上的设备所访问。简单来说,就是实现内外网之间的互联互通。

在这里插入图片描述

如图所示,现有三台主机,其中公网服务器具有公网IP,可以直接访问互连网。而客户端与服务端都处于内网环境,需要通过路由转发,将数据转发到公网。

那么要如何实现客户端与服务端之间的通信?

如果不考虑公网服务器的存在,只有两个处于内网的主机,那么可以使用NATP技术,让服务端获取一个公网地址以及具体端口。这样客户端就可以访问到内网的服务端了,但是这样有一个缺陷,那就是必须由服务端先发起通信,这样的话就不能算作一个服务器了。

如果有了公网服务器,就可以使用内网穿透的解决方案。

在这里插入图片描述

流程如下:

  1. 服务端提供一个端口6666,用于与公网服务器进行通信
  2. 服务端通过NAT建立映射关系,随后就可以通过该端口和公网服务器通信
  3. 公网服务器再提供另一个端口8888,这个端口用于接收来自互连网的请求
  4. 公网服务器接收到所有来自8888端口的请求,都转发给内网的6666,这样就实现了内网穿透

后续任何客户端,只需要访问公网服务器的8888端口,就可以间接访问到内网的主机,进而实现把内网的主机暴露到公网上。


frp

frp(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透。它由两个部分组成:frps(服务端)和 frpc(客户端)。frp 允许将内网服务暴露给公网,使得在不同地点的客户端可以通过公网访问内网的服务,即便这些服务原本只能在局域网内访问。

下载地址:

https://github.com/fatedier/frp/releases/tag/v0.58.1

接下来基于frp这个工具,完成内网穿透的测试,你需要准备:

一台Windows主机,一台Linux云服务器,注意一定要有一台有公网地址的云服务器,本地的虚拟机不行。

云服务器下载Linux版本的frp,一般是frp_0.58.1_linux_amd64.tar.gz ,解压后得到如下内容:

在这里插入图片描述

其中frps是服务端,frps.toml是服务端的配置文件。

Windows下载frp_0.58.1_windows_amd64.zip,解压后得到如下内容:

在这里插入图片描述

和刚才一样,但是Windows处于内网环境,此处使用客户端frpc.exe,相应的配置文件是frpc.toml

  • 配置Linux服务端:

frps.toml中,配置服务端使用的端口:

在这里插入图片描述

此处bindPort=7000是默认值,我们就使用默认值。这个端口用于和客户端进行通信。

随后运行服务端程序./frps -c ./frps.toml
在这里插入图片描述

此处的-c用于指定配置文件,看到frps started successfully,那么一个frp服务端就启动成功了。此处注意要开放云服务的7000端口,一般在服务器的供应商的安全组中可以进行配置。

  • Windows客户端配置:

客户端的配置文件是frpc.toml,初始值如下:

serverAddr = "127.0.0.1"
serverPort = 7000[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

简单介绍一下配置项:
这段配置是用于 frp(Fast Reverse Proxy)的客户端配置文件 frpc.toml 的一个示例。它定义了如何将内网服务通过 frp 代理暴露给外网。以下是每个配置项的详细解释:

  1. serverAddrfrps 服务端的IP地址或域名
  2. serverPortfrps 服务端监听的端口
  3. name:代理规则的名称
  4. type:代理的类型,如 tcpudphttphttps
  5. localIPfrpc 客户端上要暴露的服务的IP地址
  6. localPortfrpc 客户端上要暴露的服务的端口
  7. remotePortfrps 服务器上用于接收流量的端口

配置为如下规则:

serverAddr = "8.141.8.176"
serverPort = 7000[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6666
remotePort = 8888

此处8.141.8.176是服务器的公网地址,服务端监听了7000端口与客户端通信,此处也要填入7000

随后本地暴露6666地址,服务端使用8888端口接收数据。

经过以上配置,Linux服务端就会把8.141.8.176:8888的数据,转发给Windows主机的6666端口。

Windows客户端启动服务:

在这里插入图片描述

此处-c也是在指定配置文件。当看到start proxy success说明服务启动成功了。

但是到目前为止,Windows主机还没有在6666端口开启一个tcp的服务,为此可以运行一下脚本:

$port = 6666$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, $port)try {$listener.Start()Write-Host "TCP 监听器已启动,正在监听端口 $port ..." -ForegroundColor Greenwhile ($true) {$client = $listener.AcceptTcpClient()Write-Host "有客户端连接进来!" -ForegroundColor Yellow$clientIP = $client.Client.RemoteEndPoint.Address.ToString()$clientPort = $client.Client.RemoteEndPoint.PortWrite-Host "客户端 IP: $clientIP, 端口: $clientPort" -ForegroundColor Cyan$stream = $client.GetStream()$reader = New-Object System.IO.StreamReader($stream)$writer = New-Object System.IO.StreamWriter($stream)$writer.AutoFlush = $true$message = $reader.ReadLine()Write-Host "收到客户端消息: $message" -ForegroundColor White$response = "你好,客户端!你发送了: $message"$writer.WriteLine($response)Write-Host "已发送回复给客户端。" -ForegroundColor Green$client.Close()Write-Host "客户端连接已关闭。" -ForegroundColor Red}
} catch {Write-Host "发生错误: $_" -ForegroundColor Red
} finally {$listener.Stop()Write-Host "TCP 监听器已停止。" -ForegroundColor Red
}

想要运行以上脚本很简单,直接粘贴到powershell就可以了:

在这里插入图片描述

随后按下Enter键,一个简单的tcp服务就开启了,此处注意要关掉Windows的防火墙。

  • 测试内网穿透:

目前我们完成了三件事:

  1. Linux服务端启动frps服务
  2. Windows客户端启动frpc
  3. Windows6666端口开启了一个tcp进程

接下来访问Linux8888端口,这一步可以在任何地方执行,通过telnet连接:

在这里插入图片描述

连接成功后,发送”你好世界“,此时收到来自客户端的响应“你好,客户端!你发送了:你好世界”,这说明Windows的脚本开始工作了。

power shell接口也可以看到:

在这里插入图片描述

这个过程中最重要是,客户端访问的是Linux8888端口,最后访问到的却是处于内网的Windows6666端口的服务,这就是内网穿透。


内网打洞

内网打洞是一种网络技术,它允许两个位于不同内网中的主机在没有公网IP的情况下,通过互联网直接建立连接。

内网打洞依赖于NAT,通过在内网和外网之间建立一个虚拟通道,使得内网主机能够通过这个通道与外网进行通信。

一个内网的主机,想要访问互连网可以通过NAT,但是NAT最大的问题就是只能由内网的主机发起第一个数据包

假设现在有两台内网的主机之间要通信:

在这里插入图片描述

A想和B通信,就要知道B的地址和端口,同理,B也要知道A的地址和端口。这就导致AB第一个报文不知道要发往哪一个地址,虽然它们都能通过NAT连到互连网,却不能进行点对点通信。

为了解决这个问题,需要一个具有公网地址的中介服务器:

在这里插入图片描述

两者之间进行点对点通信的困境,在于不知道第一个报文发到哪里,无法得知互相的地址和端口,导致无法进行下一步通信。

为此,一个具有公网地址的服务器出来做媒介,AB的第一个报文都发送给公网服务器,报文内部携带了自己经过NAT转化后的IP + Port,随后公网服务器把这两个报文分别转发给对方:

在这里插入图片描述

当两者知道对方的地址与端口号后,那么就可以直接通过互连网通信了,不再需要公网服务器了,也就是说不再走灰色的部分进行通信,而是直接通过互连网进行点对点通信。

这个过程叫做内网打洞,处于内网的两个主机,借用临时的公网服务器交换对方的IP + Port,得知对方所处的位置,随后好像在网络中打了一个隧道,可以让两个内网的主机点对点通信。


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

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

相关文章

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中,你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容,placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始&#xff0c…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6&#xf…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据,笔者在今年10月写了文章,怎么使用配置化实现kafka的装载:springboot kafka多数据源,通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中,kafka broker是加密的&#xff0c…

Jupyter Lab打印日志

有时候在 jupyter 中执行运行时间较长的程序,且需要一直信息,但是程序执行到某些时候就不再打印了。 可以开启 日志控制台,将日志信息记录在控制台中。 参考:https://www.autodl.com/docs/jupyterlab/

EtherCAT转ProfiNet网关实现西门子1200PLC与伺服电机连接的通讯案例

一. 案例背景 西门子1200PLC通过捷米特JM-ECTM-PN(EtherCAT转ProfiNet)网关将松下伺服电机(包括不限于型号MHMFO22D1U2M)或EtherCAT协议的其它设备或连接到ProfiNetPLC上,并在正常运行中支持EtherCAT协议。本产品可作为EtherCAT主站,做为西门子S7-1200系…

Redis 基础、Redis 应用

Redis 基础 什么是 Redis? Redis (REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库(BSD 许可)。与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库&#xf…

Vue 组件通信全面解析

Vue 组件通信全面解析:方式、原理、优缺点及最佳实践 在 Vue 开发中,组件通信是一个重要的核心问题。随着应用复杂度的增加,如何在组件之间有效传递数据、触发事件,直接影响代码的可维护性和可扩展性。Vue 提供了多种组件通信方式…

Python-链表数据结构学习(1)

一、什么是链表数据? 链表是一种通过指针串联在一起的数据结构,每个节点由2部分组成,一个是数据域,一个是指针域(存放下一个节点的指针)。最后一个节点的指针域指向null(空指针的意思&#xff0…

电脑插入耳机和音响,只显示一个播放设备

1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项

ISAAC SIM踩坑记录--添加第三方3D场景

ISAAC SIM仿真首先就是要有合适的3D场景,官方提供了一些场景,如果不能满足要求,那就只能自己建。 对于我这种不会3D建模的菜鸟,只能到网上下载了,sketchfab就是一个不错的平台,有不少免费资源可以下载。 …

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布,基于 RHEL 7,并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本,今天闲来闲来无事下载下来后…

C++趣味编程玩转物联网:基于树莓派Pico控制无源蜂鸣器-实现音符与旋律的结合

无源蜂鸣器是一种多功能的声音输出设备,与有源蜂鸣器相比,它能够通过不同频率的方波生成丰富多样的音调。本项目使用树莓派Pico开发板,通过编程控制无源蜂鸣器播放经典旋律《归来有风》。本文将详细介绍项目实现中的硬件连接、C++代码解析,以及无源蜂鸣器的工作原理。 一、…

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!! 【VScode】VSCode中的智能AI-G…

Runway 技术浅析(六):文本到视频(Text-to-Video)

1. 核心组件与工作原理 1.1 自然语言处理(NLP) 1.1.1 文本解析与语义理解 文本到视频的第一步是将用户输入的自然语言文本解析为机器可理解的语义信息。Runway 使用预训练的 NLP 模型,如 GPT-3 和 BERT,这些模型通过大规模文本数…

【C++】双温度转换与并联电阻计算的编程题分析与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯从华氏温度到摄氏温度的转换题目背景与华氏温度与摄氏温度的转换初始代码与验证通过的解法代码分析特点与优缺点 老师的代码:结合 C 与 C 的风格代码分析与对比…

【采样率、采样定理、同步和异步采样】

内容来源:【数据采集卡的【采样率】【采样定理】【同步采样】【异步采样】的相关说明】 此篇文章仅作笔记分享。 前言 模拟信号需要通过采样、储存、量化、编码这几个步骤转换成数字信号,本篇文章将会对采样进行一个更详细的说明。 采样 采样就是将一…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能,无论是数据传输、充电还是外接设备,都离不开它。然而,当USB接口突然没有反应时,这无疑会给我们的工作和学习带来不小的困扰。下面,我们就来探讨一下笔记本USB接…

linux运维之shell编程

Shell 编程在系统运维中及其重要 1. Shell 编程概述 Shell 是一种命令行解释器,能够执行操作系统的命令。Shell 脚本是一个包含一系列 Shell 命令的文件,它可以被执行,以自动化和批量处理任务。常用的 Shell 类型包括 bash、sh、zsh 等。Shel…

怎么自己创建一个网站? 开发语言首选 java,使用CMS网站内容管理系统是不错的选择

怎么自己创建一个网站 推荐使用 Java CMS 网站内容管理系统,根据网站规划的功能模块,创建不同的页面风格; 文章目录 怎么自己创建一个网站一、规划网站1.1确定网站主题和目的1.2规划网站结构和内容 二、注册域名2.1选择域名注册商2.2 查找并…