内网是如何访问到互联网的(华为源NAT)

news2024/12/14 14:06:39

私网地址如何能够访问到公网的?

图片

在上一篇中,我们用任意一个内网的终端都能访问到百度的服务器,但是这是我们在互联网设备上面做了回程路由才实现的,在实际中,之前也说过运营商是不会写任何路由过来的,那对于我们这种私网地址是如何访问到公网的呢?那就是依靠一个技术,NAT---网络地址转换

 「模拟器、工具合集」复制整段内容
链接:https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab=7ulgil

NAT技术的由来与实现

在网络基础篇中讲解过目前的IPV4地址已经是枯竭的状态了,在早期发现问题的时候提出过几个解决办法,取消固定网络位的方式,引入了子网掩码,VLSM、CIDR来解决IP地址浪费的问题,同时提出了私网地址的概念,这样使得局域网都可以使用私网地址来进行通信,缓解了IPV4地址被用尽的情况,但是也带来了一个问题,私网地址的流量是不能进入公网的,因为私网地址每个不同的局域网都可以使用,重复都没有关系,在这样的情况下引入了一个技术,就是NAT,它实现的功能就是把私网地址转换成公网地址,相当于做了一个”伪装”一样,这样自然就能够去访问互联网了。

(1)配置更改

想要知道是如何实现的,那就先得配置上,然后在配合抓包以及查看状态来整体了解,先来做下初始化操作。

#出口路由器整改[AR1200]interface  g0/0/1[AR1200-GigabitEthernet0/0/1]undo pppoe-client dial-bundle-number 1[AR1200-GigabitEthernet0/0/1]ip address dhcp-alloc [AR1200]undo  ip route-static 0.0.0.0 0.0.0.0 Dialer1这里把之前做的PPPOE去掉,改成简单的DHCP模式,跟目前家庭网络其实差不多,更容易理解  #互联网设备整改[internet]interface  g0/0/1[internet-GigabitEthernet0/0/1]ip address 192.168.1.1 24[internet-GigabitEthernet0/0/1]dhcp select interface 
[internet]undo  ip route-static allWarning: This operation may lead to the deletion of all the public IPv4 static routes and their configurations. Continue? [Y/N]:y           //去掉所有静态路由

图片

图片

现在已经获取到地址了,也可以访问到外网的百度服务器,但是下面是无法访问的,配置下NAT,来看看它是如何实现的。

(2)NAT相关配置
#ACL匹配需要NAT转换的流量[AR1200]acl number 3000[AR1200-acl-adv-3000]rulepermit  ip在华为路由器配置里面,它是需要先定义一个规则的,这个规则的作用是匹配哪些内网网段能够做NAT转换,也就是该列表里面的允许转换,如果不在则不允许,而这个规则匹配工具就叫做ACL(Access Control list,访问控制列表),它的作用非常广泛,在NAT里面它就起到一个匹配的作用。#命令解析#ACL匹配需要NAT转换的流量[AR1200]acl number 3000[AR1200-acl-adv-3000]rule permit  ip
在华为路由器配置里面,它是需要先定义一个规则的,这个规则的作用是匹配哪些内网网段能够做NAT转换,也就是该列表里面的允许转换,如果不在则不允许,而这个规则匹配工具就叫做ACL(Access Control list,访问控制列表),它的作用非常广泛,在NAT里面它就起到一个匹配的作用。
#命令解析 acl number 3000:这条命令的作用是定义一个高级ACL,ID编号范围是3000~3999,高级可以匹配源目IP、源目端口号、协议类型等参数,在实际中用的最多,也最推荐用这种。
 rule permit ip:这个命令的作用是定义规则,一个ID编号里面是可以匹配N多规则的  • rule 后面跟动作,其中permit为匹配(抓取)的意思  • ip表示整个IPV4全部匹配,其实它是一条简化命令,完整是rule permit ip source any destination any,平时可以省略不写
整体下来这条ACL的作用就是匹配(抓取)所有ipv4数据。
#NAT转换配置[AR1200]interface  g0/0/1[AR1200-GigabitEthernet0/0/1]nat outbound 3000 这条命令的就是做NAT转换,但是这里注意outbound表示是出去的方向,也就是从内网进从外网出,其中3000就是上面定义的acl number 3000,这里只需要输入ID即可,整体命令的意思是,ACL 3000里面规则匹配上的进行NAT转换。(目前这里ACL是全部匹配)
(3)开始测试

图片

图片

访问成功了,现在是互联网设备没有回程路由的(注意服务器DNS与HTTP服务开启)

(4)NAT是如何实现内网访问外网的

图片

开启互联网接口的抓包以及出口路由器G0/0/0口抓包,然后来看看NAT是如何实现访问的

图片

图片

出口路由器G0/0/0口的抓包,过滤下,输入tcp or dns

图片

互联网G0/0/1口的抓包,不知道大家第一眼看过去有没有发现不一样的地方

图片

这个地址就是出口路由器对接互联网接口获取到的地址,源地址是从192.168.255.1变成了192.168.1.254了!来看看具体是如何实现的

图片

1、PC2发起DNS请求,经过办公区一交换机的二层转发、A核心的三层转发,以及出口路由器的三层转发

图片

查询路由表交给互联网处理,该路由是DHCP模式,自动从运营商设备获取到的

2、出口路由器在发出的时候,发现接口配置了NAT转换

图片

有了nat outbound 3000这个配置存在,路由器会查询ACL 3000的规则,发现是全部匹配,就会执行一个操作,NAT转换

图片

图片

抓包对比可以发现,源地址:192.168.255.1变成了192.168.1.254,源端口:49153变成了3624,其余的目的IP与目的端口号是没有变化的。

图片

并且路由器会记录这个转换记录在NAT 会话中(原始的五元组信息:源IP、目的IP、源端口、目的端口、协议,以及转换后的源地址以及源端口号),它的作用待会就能体现了,但是,这里模拟器有一个小问题,它的端口号记录的是不对的,跟抓包的完全对应不上的,真机是没这个问题的,转换后,把这个数据从G0/0/1发送出去,交给互联网。

3、互联网设备收到以后,查询路由表直接发现目标地址是直连,直接把数据交给服务器处理。

图片

4、服务器收到DNS请求后,开始回应,告诉客户端 www.baidu.com ,对应的地址是61.128.1.1

图片

将这个回应交给网关处理,就从网卡发出去,值得注意的是,服务器回应的地址是192.168.1.254(出口路由器的接口地址)

5、互联网收到这个数据包后,查询目的地址,查询路由表,发现是直连网段,直接丢给出口路由器

6、关键的来了,出口路由器收到以后,发现是给自己的,但是它发现自己的G0/0/1口是有NAT功能配置的,于是查询是否有NAT会话表

图片

路由器只要发现NAT会话里面有对应匹配(比如这里目的地址是192.168.1.254,端口号是10258的,就会匹配第二条,自然就会把192.168.1.254转换成192.168.255.1,端口号变成2312,当然这个模拟器的NAT会话不对,但过程是这样的)

图片

抓包对比,从互联网交给出口路由器的回包,目的地址是192.168.1.254,目的端口号是3624,经过出口路由器后,出口路由缓存了NAT会话信息,该数据包匹配了NAT会话的信息,它执行一个操作,NAT还原,把192.168.1.254还原成192.168.255.1,目的端口号3624还原成49153,这个就是就是路由器保留这个会话信息的作用,如果说路由器只执行转换操作,而不去生成这个NAT会话信息,那么导致的情况是,数据包回来的时候,路由器发现找的是自己,但是自己并没与去DNS请求,就把数据包给丢弃了,导致内网无法得到响应,也可以看出来NAT会话信息的重要性,后续排错会经常查看会话表。

图片

转换后,出口路由器查询路由表,发现192.168.255.1属于直连路由,直接从G0/0/0口发出去,交给192.168.250.1处理,然后核心A经过三层转发,交给办公区1交换机,同样执行二层转发交给PC2,至此PC2就得到了www.baidu.com 对应的IP地址了,剩下的流程是一样的,发起SYN,关键的地方就在于出口路由器的NAT转换。

有用的信息汇总与经验分享

(1)通过上面的分析知道,之所以内网能够去访问到外网资源,就是出口路由器做了NAT技术,NAT技术在实际中有两种分类,目前我们这篇接触到的叫做源NAT技术中的NAPT(网络地址端口转换),从上面抓包可以看到,在经过出口路由做了NAT配置的接口,源地址以及端口都会被转换,所以这个技术叫做源NAT--NAPT。

(2)数据包经过出口路由器的时候,接口配置了nat outbound 3000,路由器会查看ACL 3000里面的规则来进行转换,那转换的是哪个地址呢?就是接口的地址

图片

从抓包也可以看出来,内网的192.168.255.1经过出口路由器后被转换成了192.168.1.254,这种直接使用接口获取的地址进行转换的在实际中用的最多的,通常的场景是能上外网的地址只有一个的情况下使用这种方式,像DHCP从猫获取只有一个可上网地址,PPPoE拨号获取到的也只有一个地址,所以我们直接在接口下面配置nat outbound后面跟对应的ACL ID即可,它就会利用接口获取(配置)的地址进行转换,这种方式叫做Easy IP,这个只是一个称呼,每个厂商不太一样,记住它的作用即可。

(3)在回顾之前说过的运营商不会去在乎你内网是如何配置的,它也不会写回程路由,第一个是因为内网使用的是私网地址,运营商没法写,第二个是运营商知道在企业的出口,都会去配置NAPT技术,把内网的IP信息转换成运营商能够正常回包的地址。比如上面的环境,就像家庭网一样,猫出来分配192.168.1.0/24的网络,电脑或者路由器接下面就可以直接上网,因为猫能够处理该网段的信息,同样的上面的出口路由器从互联网那获取了一个地址192.168.1.254,这个互联网是知道这个地址在哪的,它能够去处理与转发,最终内网的192.168.255.1或者其他网段过来转换成该地址,就自然能够穿越互联网抵达服务器那了,换个角度看,它就像换了一个”马甲”伪装了一样,从始至终互联网设备看到的都是192.168.1.254在发数据,是看不到内网里面真实的地址信息的,所以NAT技术还有一个特性是隐藏地址真实信息。

(4)出口路由器在进行NAPT转换以后,在NAT信息中会保存一份记录,叫做NAT会话信息表,它的作用就是记录当前的该会话把源地址以及端口号转换成了多少,当该数据从外网返回的时候,出口路由器能够正常的处理,它可以依据之前生成的会话信息表,来还原成之前的信息。

图片

这里要注意,很多初学者卡在这,觉得为什么要还原呢?,PC2在发起DNS请求的时候,源端口是自己随机生成的(抓包看到得是49153),目的端口是53,它本地会维护这样一个会话,等待服务器的返回,记录的信息就是对应的端口号信息,如果这个时候外网返回的不进行还原,第一个目的地址互联网返回的是192.168.1.254,而不是192.168.255.1,第二个互联网返回的端口号是转换后的3624,实际PC2随机的端口号是49153,这两个是缺一不可的,否则会导致该通信就失败了,这就是要还原的原因,也是为什么要生成这样一个NAT会话表的作用,就是为了后续的数据包能够正常的还原信息返回。

(5)NAT会话信息并不是永久存在的,它有一个生存时间,不同的协议与应用生存时间不一样

图片

通过display firewall-nat session aging-time可以查看,也可以通过firewall-nat session 修改时间

多个内网网段它是如何转换的?

图片

在上面我们只测试了192.168.255.1访问,实际内网有很多内网都需要去访问外网的很多资源,那假设同时用PC2以及client2都去访问61.128.1.1,能不能通呢?

图片

重新抓互联网G0/0/1接口的数据

图片

测试没有问题

图片

过滤一下,只看DNS,有两次请求,两次回应,自然有一个是PC2,一个是client2的,这是经过路由器NAPT转换,所以源地址都变成了192.168.1.254了

图片

源地址都是一样,因为现在出口路由器就一个可上网地址,自然都转换的192.168.1.254,区别不一样的就是源端口,一个是3112,一个是3624,这个就是NAPT的核心机制了,不同的内网终端在经过出口路由器的时候,执行NAPT转换,接口地址只有一个都转换成192.168.1.254,端口号随机转换成不一样的,这样就能够很清晰的区分,当服务器回应这两个请求后,抵达出口路由器的时候,可以根据对应的端口号信息来进行区分,到底哪个回应给PC2的,哪个是回应给client2的,还原成会话信息表中之前的信息进行回复,这样保证只有一个可上网地址的情况下,多私网用户可以上网。

其他外网对接方式如何调用(PPPoE与静态)

#静态专线调用NATinterface GigabitEthernet0/0/1 ip address 219.135.2.55 255.255.255.192  nat outbound 3000这个跟DHCP模式是一样的,直接物理口调用即可
#PPPoE拨号调用NATinterface Dialer1 link-protocol ppp ppp chap user ccieh3c ppp chap password simple ccieh3c.com ppp pap local-user ccieh3c password simple ccieh3c.com mtu 1492 tcp adjust-mss 1452 ip address ppp-negotiate dialer user ccieh3c dialer bundle 1 nat outbound 3000          
这个有点特别,在拨号接口调用,因为实际可上网的地址在拨号口上,而不再物理口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…

软考:工作后再考的性价比分析

引言 在当今的就业市场中,软考(软件设计师、系统分析师等资格考试)是否值得在校学生花费时间和精力去准备?本文将从多个角度深入分析软考在不同阶段的性价比,帮助大家做出明智的选择。 一、软考的价值与局限性 1.1 …

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一,自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop,从其起源、核心架构、关键组件,到典型应用场景,并结合代码示例和图示,帮助您更好地掌握Hadoop的实战…

HTML综合

一.HTML的初始结构 <!DOCTYPE html> <html lang"en"><head><!-- 设置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置网页…

c#笔记2024

Ctrl r e自动添加get和set CompositeCurve3d 复合曲线 List<Entity> entS listline.Cast<Entity>().ToList();//list类型强转 前面拼上\u0003&#xff0c;就可以实现&#xff0c;不管有没有命令都能打断当前命令的效果 取消其他命令&#xff1a;Z.doc.SendStri…

debian12学习笔记

前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…

supervision - 好用的计算机视觉 AI 工具库

Supervision库是一款出色的Python计算机视觉低代码工具&#xff0c;其设计初衷在于为用户提供一个便捷且高效的接口&#xff0c;用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型&#xff0c;就能轻…

QT图形/视图架构详解(一)

场景、视图与图形项 图形/视图架构主要由 3 个部分组成&#xff0c;即场景、视图和图形项&#xff0c;三者的关系如图所示&#xff1a; 场景、视图和图形项的关系 场景&#xff08;QGraphicsScene 类&#xff09; 场景不是界面组件&#xff0c;它是不可见的。场景是一个抽象的…

RANS(Reynolds-Averaged Navier-Stokes) 湍流模型类型

RANS&#xff08;Reynolds-Averaged Navier-Stokes&#xff09; 湍流模型有多种不同的类型&#xff0c;除了标准的 kkk-ω 湍流模型&#xff0c;还有其他一些常用的湍流模型。RANS 模型的核心思想是对 Navier-Stokes 方程进行 雷诺平均&#xff0c;通过将流动场的瞬时变量分解为…

ORACLE逗号分隔的字符串字段,关联表查询

使用场景如下&#xff1a; oracle12 以前的写法&#xff1a; selectt.pro_ids,wm_concat(t1.name) pro_names from info t,product t1 where instr(,||t.pro_ids|| ,,,|| t1.id|| ,) > 0 group by pro_ids oracle12 以后的写法&#xff1a; selectt.pro_ids,listagg(DIS…

使用 GD32F470ZGT6,手写 I2C 的实现

我的代码&#xff1a;https://gitee.com/a1422749310/gd32_-official_-code I2C 具体代码位置&#xff1a;https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c 黑马 - I2C原理 官方 - IIC 协议介绍 个人学习过程中的理解&#xff0c;有错误&…

【Unity踩坑】Unity生成iOS的XCode项目时提示错误:xcrun: error: SDK “iphoneos“ cannot be located

问题描述&#xff1a; Unity生成iOS的Xcode项目时&#xff0c;出现错误&#xff1a;xcrun: error: SDK “iphoneos” cannot be located 解决方法&#xff1a; 运行Xcode, 打开设置-Locations&#xff0c;将Command Line Tools里下拉项再选择一下。&#xff08;不管之前有没有…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

React的状态管理库-Redux

核心思想&#xff1a;单一数据源、状态是只读的、以及使用纯函数更新状态。 组成部分 Store&#xff08;存储&#xff09; 应用的唯一状态容器&#xff0c;存储整个应用的状态树,使用 createStore() 创建。 getState()&#xff1a;获取当前状态。dispatch(action)&#xff…

Unity WebGL 编译和打包说明(官方文档翻译校正)

目录 Unity WebGL 编译和打包说明WebGL 简介WebGL 浏览器兼容性 (WebGL Browser Compatibility)平台支持 (Platform Support)多线程支持限制多线程支持的因素安装 Unity Hub 并添加所需模块WebGL 开发WebGL Player 设置Resolution and PresentationResolutionWebGL TemplateSpl…

论文概览 |《IJGIS》2024.11 Vol.38 issue11

本次给大家整理的是《International Journal of Geographical Information Science》杂志2024年第38卷第11期的论文的题目和摘要&#xff0c;一共包括9篇SCI论文&#xff01; 论文1 A review of crowdsourced geographic information for land-use and land-cover mapping: cur…

Linux系统编程——进程间通信

目录 一、前言 二、进程间通信的目的 三、进程通信的方法 四、管道 通信 1、进程如何通信 2、管道概念 3、匿名管道 1&#xff09;理解 2&#xff09;匿名管道的创建 3&#xff09;匿名管道用途——控制进程 4&#xff09;匿名管道对多个进程的控制 5&#xff09;总…

Ensembl数据库下载参考基因组(常见模式植物)bioinfomatics 工具37

拟南芥参考基因组_拟南芥数据库-CSDN博客 1 Ensembl数据库网址 http://plants.ensembl.org/index.html #官网 如拟南芥等 那么问题来了&#xff0c;基因组fa文件和gff文件在哪里&#xff1f; 2 参考案例 拟南芥基因组fa在这里 注释gff文件在这里

linux-16 关于shell(十五)date,clock,hwclock,man,时间管理,命令帮助

想显示一下当前系统上的时间该怎么显示&#xff1f;有一个命令叫做date&#xff0c;来看date命令&#xff0c;如下图&#xff0c; 第一个星期几对吧&#xff1f;然后是月日小时分钟秒&#xff0c;最后一个是年对吧&#xff1f;CST指的是它的时间格式&#xff0c;我这个可以先姑…

SMMU软件指南SMMU编程之寄存器

安全之安全(security)博客目录导读 本博客介绍了SMMUv3的编程接口&#xff1a; • SMMU寄存器 • 流表&#xff08;Stream table&#xff09; • CD&#xff08;Context Descriptor&#xff09; • 事件队列&#xff08;Event queue&#xff09; • 命令队列&#xff08;…