精华内容
下载资源
问答
  • 1. 问题引入之前在使用tomcat的时候,启动tomcat默认都会绑定到127.0.0.1这个地址,最近在使用hexo写博客的时候发现通过 hexo server命令启动...2. IP地址分类2.1 IP地址表示IP地址由两个部分组成,net-idhost-id...

    2175835075efa40317183c13720f9c15.png

    1. 问题引入

    之前在使用tomcat的时候,启动tomcat默认都会绑定到127.0.0.1这个地址,最近在使用hexo写博客的时候发现通过 hexo server命令启动服务的时候绑定的ip地址是0.0.0.0。那么这两个IP地址到底有什么不同呢?

    在讲解两个地址的不同之前,我们先回顾一下IP地址的基础知识。

    2. IP地址分类

    2.1 IP地址表示

    IP地址由两个部分组成,net-id和host-id,即网络号和主机号。

    net-id:表示ip地址所在的网络号。

    host-id:表示ip地址所在网络中的某个主机号码。

    即:

    IP-address ::=  { <Network-number>, <Host-number> }

    2.2 IP地址分类

    IP地址一共分为5类,即A~E,它们分类的依据是其net-id所占的字节长度以及网络号前几位。

    • A类地址:网络号占1个字节。网络号的第一位固定为0。
    • B类地址:网络号占2个字节。网络号的前两位固定为10。
    • C类地址:网络号占3个字节。网络号的前三位固定位110。
    • D类地址:前四位是1110,用于多播(multicast),即一对多通信。
    • E类地址:前四位是1111,保留为以后使用。

    其中,ABC三类地址为单播地址(unicast),用于一对一通信,是最常用的。

    2.3 特殊IP地址

    特殊IP地址就是用来做一些特殊的事情。RFC1700中定义了以下特殊IP地址。

    1. {0,0}:网络号和主机号都全部为0,表示“本网络上的本主机”,只能用作源地址。
    2. {0,host-id}:本网络上的某台主机。只能用作源地址。
    3. {-1,-1}:表示网络号和主机号的所有位上都是1(二进制),用于本网络上的广播,只能用作目的地址,发到该地址的数据包不能转发到源地址所在网络之外。
    4. {net-id,-1}:直接广播到指定的网络上。只能用作目的地址。
    5. {net-id,subnet-id,-1}:直接广播到指定网络的指定子网络上。只用作目的地址。
    6. {net-id,-1,-1}:直接广播到指定网络的所有子网络上。只能用作目的地址。
    7. {127,}:即网络号为127的任意ip地址。都是内部主机回环地址(loopback),永远都不能出现在主机外部的网络中。

    3. 问题解答

    接下来我们来看之前问过的问题:127.0.0.1和0.0.0.0地址的区别是什么?

    我们先来看下共同点:

    1. 都属于特殊地址。
    2. 都属于A类地址。
    3. 都是IPV4地址。

    接下来我们分别看下这两个地址:

    0.0.0.0

    IPV4中,0.0.0.0地址被用于表示一个无效的,未知的或者不可用的目标。

    • 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。
    • 在路由中,0.0.0.0表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。

    用途总结

    • 当一台主机还没有被分配一个IP地址的时候,用于表示主机本身。(DHCP分配IP地址的时候)
    • 用作默认路由,表示”任意IPV4主机”。

    用来表示目标机器不可用。

    • 用作服务端,表示本机上的任意IPV4地址。

    127.0.0.1

    127.0.0.1属于{127,}集合中的一个,而所有网络号为127的地址都被称之为回环地址,所以回环地址!=127.0.0.1,它们是包含关系,即回环地址包含127.0.0.1。

    回环地址:所有发往该类地址的数据包都应该被loop back。

    用途

    • 回环测试,通过使用ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者TCP/IP实现是否工作正常。
    • DDos攻击防御:网站收到DDos攻击之后,将域名A记录到127.0.0.1,即让攻击者自己攻击自己。
    • 大部分Web容器测试的时候绑定的本机地址。

    localhost

    相比127.0.0.1,localhost具有更多的意义。localhost是个域名,而不是一个ip地址。之所以我们经常把localhost与127.0.0.1认为是同一个是因为我们使用的大多数电脑上都讲localhost指向了127.0.0.1这个地址。

    在ubuntu系统中,/ets/hosts文件中都会有如下内容:

    127.0.0.1   localhost
    
    127.0.1.1   jason-Lenovo-V3000
    
    # The following lines are desirable for IPv6 capable hosts
    
    ::1     ip6-localhost ip6-loopback
    
    fe00::0 ip6-localnet
    
    ff00::0 ip6-mcastprefix
    
    ff02::1 ip6-allnodes
    
    ff02::2 ip6-allrouters

    上面第一行是几乎每台电脑上都会有的默认配置。

    但是localhost的意义并不局限于127.0.0.1。

    localhost是一个域名,用于指代this computer或者this host,可以用它来获取运行在本机上的网络服务。

    在大多数系统中,localhost被指向了IPV4的127.0.0.1和IPV6的::1。

    127.0.0.1    localhost
    
    ::1          localhost

    所以,在使用的时候要注意确认IPV4还是IPV6

    4. 总结

    127.0.0.1 是一个环回地址。并不表示“本机”。0.0.0.0才是真正表示“本网络中的本机”。

    在实际应用中,一般我们在服务端绑定端口的时候可以选择绑定到0.0.0.0,这样我的服务访问方就可以通过我的多个ip地址访问我的服务。

    比如我有一台服务器,一个外放地址A,一个内网地址B,如果我绑定的端口指定了0.0.0.0,那么通过内网地址或外网地址都可以访问我的应用。但是如果我之绑定了内网地址,那么通过外网地址就不能访问。 所以如果绑定0.0.0.0,也有一定安全隐患,对于只需要内网访问的服务,可以只绑定内网地址。

    eb4e913f37c942a40de625bc664c022f.png
    展开全文
  • 前言:路由器在转发单播数据的时候依靠单播路由表。当单播路由表出现环路之后,那么被转发的单播数据也会出现环路现象,所以单播数据依靠单播...单播路由关心数据包要去哪里(Destination)---查看目的ip转发数据...

    前言:

    路由器在转发单播数据的时候依靠单播路由表。当单播路由表出现环路之后,那么被转发的单播数据也会出现环路现象,所以单播数据依靠单播路由协议,来形成准确没有环路的路由表,以此来保证数据的转发不会出现环路。

    那么组播是如何防止环路的呢?组播针对环路的问题使用RPF校验来防止环路的产生。

    一、单播路由和组播路由的主要区别

    >单播路由关心数据包要去哪里(Destination)---查看目的ip转发数据

    >组播路由关心数据包从哪里来(Source)---用来检测环路,和重复报文

    >单播路由依靠路由协议对目的地址的检测来防止环路

    >组播路由无法对目的地址检测,因为很可能在任何一个节点,因此组播路由需要依靠对源地址的检测来防止环路。

    针对源地址的检测方法称之:RPF(Reverse Path Forwarding)

    RPF针对的是所有组播路由协议,所以RPF是组播数据转发的依赖。

    RPF工作原理:当一台路由器收到一个组播包,会查看自己单播路由表中去往这个组播源的出接口是否跟自己的收包接口一致。一致就转发,不一致就丢弃。

    也从侧面说明组播数据的转发,需要单播路由的基础,因为RPF检测要用到。

    二、RPF校验的应用场景,如何去预防环路的产生?

    4b073b92535dd3d869f54a52662adf42.png

    上面这张图。我们说RPF的检测需要单播的基础,才能完成RPF校验,所以在组播路径树中运行了eigrp。

    Server作为一个组播源,R4下面的主机作为一台接受者,当R1收到Server发来的组播包后,首先会看到这个组播包的源单播ip地址,然后查找自己的路由表,看一下去往这个ip地址的出接口,是不是和收到这个组播包的出接口一致。如果一致就转发,不一致就丢弃。假设一致,R1会将组播包从自己的2 3端口发出,这时候R2 R3收到,R2又会执行RPF校验,然后发给R3,这时候R3从R1和R2同时收到了相同的组播包,那么应该去转发谁的呢?

    R3也执行RPF校验,查找路由表发现自己去往Server的出接口是5号口,那么此时就只接受R1发来的组播流量,这时候R3的5号口就是RPF接口,R1的3号口就是R3的RPF邻居。对于第一跳路由器只有RPF接口,没有RPF邻居。

    那么RPF是如何防止环路的呢?

    还是上面这张图,如果没有RPF校验的话,R3收到R1的会发给R2,R2又会发给R1就导致了环路。退一万步想即使R3发给了R2,那R2也只接受自己RPF邻居发来的流量,就不转发R3的。

    问题一、

    33dbf7148a71523557504c35e33e9580.png

    1.1.1.1作为组播源的ip地址,那么对于R3来说去往组播源的出接口只有一个,这时候R1 R3都会给它发送组播流量,应该接受谁的呢?

    首先R3的3号端口肯定是RPF接口,因为自己去往1.1.1.1的出接口只有一个,但是一台路由器只会接受RPF邻居发送给我的RPF接口的组播流量。R1和R2谁会成为RPF邻居呢?

    这时候会比较R1和R2的ip地址,越大越优先。很明显1.2大于1.1,所以R2的2号口是RPF邻居

    问题二、

    b368a99071cd3be062b893a35bb63675.png

    上面这个环境,R2从两个接口收到R1的发来的组播流量,这时候会选择哪一个接口为RPF接口呢?

    也是一样的,R2比较两个接口的ip地址大小,谁的ip地址大,谁成为RPF接口。

    问:一个路由器只接受RPF邻居发来的流量,其他接口收到的流量并不接受,那么其他路由器在转发组播包的时候,一定会占用很大的带宽资源,该如何去解决?

    答:确实存在这种问题,并且存在这种问题的解决办法。本章只针对RPF接口做介绍,之后会说到这个问题。

    三、总结:

    要成为RPF 接口必须满足的条件: 离组播源最近的, 并且运行 了组播路由协议的接口.

    针对每一个组播源而言, RPF 接口有且只有一个

    针对每一个组播源而言, RPF 邻居有且只有一个

    组播路由器只能转发来自RPF接口, 并且由RPF邻居发过来的组播数据

    RPF接口与RPF 邻居的选择方法:

    当有多个接口都能成为该组播源的RPF 接口时, 选择IP地址最 大的接口成为针对该组播源的RPF接口.

    当有多个邻居都能成为该组播源的RPF邻居时, 选择IP地址最大的邻居成为针对该组播源的RPF邻居

    当一个路由器收到组播流量,发现去往源的出接口与收包接口不一致则RPF检测失败,无法转发此组播流量。

    RPF检测一共有三种方法,默认情况下是查找单播路由表,之后的文章中会分别介绍三种检测方法、

    展开全文
  • IP协议使用IP地址来标识网络中的节点,分为IPv4IPv6。虽然一直在推行IPv6,但目前主流还是IPv4。IPv4使用32位二进制,分为A、B、C类(D类E类有特殊用途,不用于标识网络中的节点),共计大约37亿多个可用单播...

    87f8797cd6e16892594b914c5ec8d93b.png

    接下来要优化的,依然和IP有关!

    IP:“为什么受伤的还是我!!”

    别担心,不给你好好整整容,你不知道自己有多美!

    IP协议使用IP地址来标识网络中的节点,分为IPv4和IPv6。虽然一直在推行IPv6,但目前主流还是IPv4。

    IPv4使用32位二进制,分为A、B、C类(D类和E类有特殊用途,不用于标识网络中的节点),共计大约37亿多个可用单播地址。听上去很多,但是Internet发展太快了,早在2011年,IANA就宣布IPv4地址耗尽。

    等等,既然2011年IPv4地址就没了,那怎么直到现在,大家都还在高高兴兴地用着IPv4地址呢?

    这要归功于NAT(Network Address Translation,网络地址转换)。

    其实,在IPv4地址中,有一些特殊的地址范围:

    A类地址中,10.0.0.0~10.255.255.255;

    B类地址中,172.16.0.0~172.31.255.255;

    C类地址中,192.168.0.0~192.168.255.255。

    这些地址,我们称之为“私有地址”。

    什么是私有地址?就是说,这些地址不会在Internet公网上出现,任何人都可以随便使用,不用花钱!

    随便使用?那不会冲突吗?

    并不会,因为这些地址只限于你所在的局域网内部使用,如家庭、企业、学校等,公网上并没有这些地址。就好像你在一个局域网用10.1.1.1,我在另一个局域网也使用10.1.1.1,只要保证各自局域网内不冲突就行。

    可是,如果我们两人要通信呢?地址不是冲突了吗?

    不不,私有地址只在局域网内部使用,如果要访问外网,需要NAT给你发的数据包整个容!

    一般情况下,局域网接入公网的出口设备上都会配置NAT功能。家庭中常见的“无线路由器”,其实本质上不过是一台“无线NAT”而已!

    如果NAT设备发现有私有数据包要去公网,会给它整个容:把里面IP封装中的私有地址换成公网地址,做好记录,再发出去;数据包回来时,再把地址换回来,发回你的电脑。

    企业、学校的公网地址可以花钱向运营商购买固定地址,便于注册域名,向外提供网络服务;家庭上网一般由运营商动态分配。

    47ef5fa34d0f24f59baca0147742699a.png

    图中电脑的IP地址是私有地址192.168.1.10,出口NAT设备接入Internet的公网地址是12.34.56.78,假设公网上有一台地址为98.76.54.32的www服务器,内网电脑通过浏览器访问它。

    电脑产生http报文,向下交给传输层TCP协议。TCP封装时,源端口在49152~65535间随机选择一个,如60128,目的端口为80。

    1a6d6ae6f885cc4d194b9a5f75728763.png

    TCP封装后,交给网络层IP协议,IP封装源地址为内网电脑的私网地址192.168.1.10,目的地址为公网服务器的地址98.76.54.32,协议号为6。

    bd98b0d396632fda9b7e094172594967.png

    链路层的封装和前面文章所述一样,这里我们省略。这个报文发到NAT设备后,NAT设备将源地址修改为12.34.56.78,做好记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,然后将报文发到公网。

    fff7f7b947c151a4f8a6abb7ae045d5e.png

    公网根据报文中的目的地址98.76.54.32,将报文准确送达服务器。

    服务器返回的信息,数据是这样封装的:

    063b9c7a1eaf3781bb8940ed0cb590d1.png

    源和目的端口号、IP地址互换位置,公网会根据目的地址12.34.56.78,把报文送达NAT设备。NAT根据记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,把目的地址12.34.56.78换回192.168.1.10,然后根据内网地址192.168.1.10把报文送达电脑。

    但这样的转换方式并不妥当,因为一个内网地址需要对应转换为一个外网地址,内网电脑数量多就会消耗大量外网地址,并没有起到节省地址的作用。

    因此,我们所使用的NAT,叫做NAPT(Network Address Port Translation,网络地址端口转换)。

    NAT只转换IP封装中的IP地址,而NAPT则把传输层的端口号和IP地址一起转换,可以实现一个公网地址的复用。

    假设内网有两台电脑,地址分别为192.168.1.10和192.168.1.20,NAT设备地址和服务器地址和上例相同。假设两台电脑同时访问外网服务器,电脑A发出的报文封装是:

    1f5104bf92f444f3a7a86cb126c0e7e1.png

    电脑B发出的报文封装是:

    62f5a68b940786205a53b3c1a8a38dc5.png

    两个数据报文到达NAT设备后,NAT设备做个记录:

    5538953bb8dd9459aaab2645a71f11d4.png

    然后,NAT把电脑A的报文修改为:

    46dc0b434e5166fcdef77efa91d97985.png

    而电脑B的报文也被NAT修改为:

    b0508c147152740d94948550b76a6e95.png

    可以看到,NAT把两台内网电脑发出去的报文转换后,仅传输层的源端口号不同,IP的封装完全相同。这样一来,就可以实现同一个公网地址被不同内网电脑重复使用,只需通过端口号区别开就可以。外网返回的数据报文回到NAT设备后,NAT根据之前记录的信息再转换回内网地址和内网端口号,即可把报文送达不同的内网电脑。

    小Q:对于没有传输层的报文,如ICMP,无法进行端口号转换,NAT会怎么处理呢?

    欢迎大家留言讨论。

    展开全文
  • 网络地址转换(NAT)大家都不陌生,大街上随便抓一个网工,也能告诉你“网络地址转换技术是为了解决IPv4公网地址不够用的……”这么一个标准的回答。但在实际中,网络地址转换技术能做到的远不止于此,许多人对NAT存在...

    a3db882f99bc66f74aa3d5a5c4fbc998.png

    网络地址转换(NAT)大家都不陌生,大街上随便抓一个网工,也能告诉你“网络地址转换技术是为了解决IPv4公网地址不够用的……”这么一个标准的回答。但在实际中,网络地址转换技术能做到的远不止于此,许多人对NAT存在误解,抓着NAT大加抨击,对此也只能评价一句——少见多怪。

    在多年的实践中,NAT至少在两个场景中非常的有意义——

    • 属于不同的实体网络互连,使用NAT可以规避两方使用相同的IP地址规划而产生的冲突,在存在1个实体对接多个不同实体的时候,NAT更可以避免多个不同的实体使用相同的网络规划产生的问题;没有哪个网络运维会希望各种外部实体使用的IP地址跑到自己的网络中。IPv6可以解决这个问题么?只使用防火墙保证安全足够了吗?
      • 第一个,理论上可以解决没错,但可维护性呢?不同的实体之间的网络互连是为了特定的业务交换而存在的,这和Internet有本质的不同——Internet就是要让大家通,设计不通的人,脑袋里装着一脑袋的浆糊
      • 第二个,仅靠防火墙可以实现安全,但使用NAT并不见得是为了安全,更多是为了网络的维护性,不然久而久之,你就再也看不懂你的内网路由表了……
    • 在负载均衡技术中解决来回路径不一致的问题,无论是网络设备实现的粗暴的四层TCP负载均衡,还是F5实现的七层负载均衡,SNAT在这种场景中始终是有用的

    P.S. NAT阻碍了IPv6的发展?不,是IPv6自己太蠢,设计过于理想化,而且过时。

    今天这篇,主要讲一下第一个场景,不同的实体的网络对接中的NAT运用,以及在Cisco IOS Router上的实现原理和范例


    需求

    两个不同的实体因为业务需要,信息系统需要互通,网络工程师就要把网络打通。但我们不可能让网络直接就全通了,而一定是将其限定在特定业务数据的范围之内。除了防火墙上访问控制,在路由层面,由于两个实体完全有可能采用同样或者部分相同的私网IP地址规划,仅靠路由无法解决这个问题,因而就需要使用NAT来解决这个问题。

    在不同实体互连的架构上,如果网络工程师从一开始就设计了合理的NAT模型,可以避免很多问题,反之,随着互连的外部实体越来越多,网络里的路由也会越来越乱,哪天挖坑的人一走,接坑的人就是一脸懵逼。

    这里的需求还有人情因素——强势的外部实体可能并不在乎你的网络咋样咋样,他只要求你,要将访问过来的地址映射为他“规划”的地址。当然了,公司之间的合作,任何时候都是有强有弱,这里强那里弱,这里硬那里软的,所以,更普遍的情况应该是——

    实体A要求实体B,将从B访问A的数据流的源地址,转换为实体A要求的地址。简单来说就是实体A是爸爸,实体B要听话。但是实体B也不希望看见实体A的地址,而实体A并不怎么好说话,不想做地址转换,所以实体B就只能“自行”对实体A的地址进行地址转换。

    于是,当实体B访问实体A的时候,实体B的主机需要访问一个假的地址,实体B需要对这个地址进行翻译,同时,还要将自己的源地址翻译为实体A要求的地址。

    我估计看到这里,你已经晕了。没关系,下面的例子会说清楚一切的。


    例子

    d401c8aa74a99a1efb750a7267bf67e6.png

    如上所示,随便画了一个拓扑。TEST-RTR是一个外部实体,用蓝色的图标,GW,RTR1,RTR2则是本地网络,用绿色的图标。GW里是两个网络的边界,对TEST-RTR的接口为outside,对本地网络的接口为inside。

    在这个简易拓扑中,RTR1和RTR2想要访问TEST-RTR,但本地网络中并不想出现TEST-RTR的路由,同时,TEST-RTR对于RTR1和RTR2访问过来的地址也有要求。

    RTR1和RTR2在本地运维的策略下,希望通过访问10.254.1.1这个地址,来访问TEST-RTR的地址,也就是192.168.199.199。TEST-RTR希望RTR1和RTR2访问过来的时候,把自己的地址变成192.168.198.1,它只允许这个地址来访问它。

    所以,GW就需要做两个方向的地址转换。下面为访问的是RTR1访问TEST-RTR的来回流量的示意图——

    fa618e8523815f023945325b12bdf669.png

    RTR1的地址为10.254.0.2,它将访问10.254.1.1,这是"RTR1认为的TEST-RTR的IP地址",对,尽管是个假的。

    10.254.0.2 --> 10.254.1.1 的数据包在GW上,需要被翻译为 192.168.198.1 --> 192.168.199.199,真实的源地址被映射为TEST-RTR所要求的地址,反之,映射后的TEST-RTR的地址被翻译为它的真实地址。

    10.254.0.2 --> 10.254.1.1 变成 192.168.198.1 --> 192.168.199.199

    P.S. 红色的虚线代表了真实地址到映射地址的翻译,而黑色的虚线则代表映射地址到真实地址的翻译。

    从TEST-RTR返回的数据包,目的地址为192.168.198.1,源地址则是TEST-RTR的真实地址192.168.199.199,GW对返回的数据流再次进行翻译——

    192.168.199.199 --> 192.168.198.1 变成 10.254.1.1 --> 10.254.0.2

    熟悉这个套路的人,绝大部分,使用防火墙来完成这波操作,然鹅,其实路由器也可以很轻易的实现,然鹅鹅,很多人并不知道路由器也可以做这个事情……

    这个真不怪大家,Cisco IOS Router 的NAT逻辑实在过于吊诡,且文档写的晦涩难懂,当年考CCIE,在这个东西上真的是想破了脑子

    所以,在继续讲如何实现之前,我们先复习一波Cisco IOS Router 那吊诡无比的NAT逻辑


    Cisco IOS Router 的NAT实现

    曾有人吐槽过说outside和inside这个名字起的不好,应该叫pre-Routing和post-Routing,那位大哥文章写的非常激愤,然而,还是没想明白。

    outside和inside这个名字有问题吗?并没有。并且,outside和inside也不只是处理顺序的差别。先说一下我和这玩意打交道多年后的结论——

    • 第一个结论,outside和inside,就是为了将网络分为内部网络和外部网络,这带来了不灵活的NAT配置,但实际上,非常适合路由器,因为路由器这个设备,一定是为了“连接自己和别人”。
    • 第二个结论,Cisco IOS Router 的NAT,一定是和数据流反着的,所你要“反着思考”
    • 第三个结论,虽然 Cisco IOS Router 确实支持双向地址转换,但它还是个废物,如果能用防火墙,还是用防火墙做最合适……在后文,我们会讲到它的一些“莫名其妙”的设计和限制。

    IOS Router 的NAT实现过于吊诡,如果只是看书,很容易就把自己看晕过去,什么inside local,inside global,outside local,outside global……简直emmmmmm,看看ASA的逻辑,就清楚多了,Real IP & Mapped IP,多清晰……

    所以,用好IOS Router的NAT,首先要搞清楚数据流的流向——

    • inside to outside
    • outside to inside

    两个流向的流量的逻辑是有些差异的,并且有一些特性只在特定的方向上才能实现

    其次,如上第二点所述,IOS Router的NAT的配置逻辑总是反着的,意即任何时候,我们在IOS Router上都是在配置“源地址转换”,也就是SNAT,而对于目的地址的转换,实际上是SNAT的反向逻辑,因此——

    • 如果希望从outside访问inside一个服务器,我需要做的是 inside source static 转换
    outside client --> inside server
    • 如果希望从inside访问outside服务器,转换inside的源地址,并且希望复用源地址,那么就需要做 inside source dynamic 转换
    inside client --> outside server
    • 如果希望隐藏outside目标的地址,也就是从inside去访问outside的一个服务器但不访问outside的真实地址,而是访问一个分配给outside服务器的“inside”的地址,所以就需要做 outside source static转换
    inside client --> outside server inside address --> outside server outside address
    • 如果希望从outside访问inside一个服务器,并确保服务器看到一个“inside”地址,就需要做 outside source dynamic 转换,需要注意的是,这个场景不支持PAT,多个outside client不能复用1个inside地址(蠢爆了)
    outside client outside address --> outside client inside address --> inside server 

    当然,IOS Router 支持一种Destination的场景——ip nat inside destination,是一种四层负载均衡实现(好像也被强化过了!)

    以上四个逻辑,基本上就是我们通常做NAT时需要实现的逻辑,我们永远只需要记住的是,转换 outside 的地址就是 outside source ,转换inside侧的地址就是 inside source‘

    至于那个什么gloabl address和local address的概念……忘记它吧,蠢死了。


    例子解析1 inside client --> outside server

    看明白上面四个逻辑,再回过头去看例子——

    10.254.0.2 --> 10.254.1.1 变成 192.168.198.1 --> 192.168.199.199
    192.168.199.199 --> 192.168.198.1 变成 10.254.1.1 --> 10.254.0.2

    192.168.199.x 和 192.168.198.x 都是 outside 地址

    10.0.254.1.x 和 10.254.0.x 都是 inside 地址

    在这个例子中,数据流是由inside侧发起,访问outside侧的server,对比上面的四个逻辑,我们需要两条NAT来实现

    • inside source dynamic,实现inside client的源地址转换
    ip access-list extended insideClient
      permit ip host 10.254.0.2 any
      permit ip host 10.254.0.3 any
    ip nat pool insidePool 192.168.198.1 192.168.198.1 prefix-length 25
    ip nat inside source list insideClient pool insidePool overload

    P.S. 这里使用了PAT来复用一个地址,关键字overload

    • outside source static,实现outside server的源地址转换
    ip nat outside source static 192.168.199.199 10.254.1.1

    P.S. 前面我说忘记global address和local address的概念吧,太愚蠢,你只需要记住,不管是inside还是outside,写在前面的是Real IP,写在后面的是NATed IP

    当然,注意接口的inside和outside,不能配反

    interface GigabitEthernet4
     ip address 10.254.0.1 255.255.255.248
     ip nat inside
    interface GigabitEthernet1
     ip address 192.168.199.2 255.255.255.248
     ip nat outside

    然后,非常重要的事情来了——

    当inside侧的client,10.254.0.2要去访问10.254.1.1的时候,流量从inside进入,并不会直接触发NAT转换,这里涉及一个重要的逻辑——路由器的数据包处理顺序

    • 从inside到outside是先路由,再转换
    • 从outside到inside是先转换,再路由

    所以,访问10.254.1.1的数据包必须先通过路由确定到下一跳的出接口,才能触发NAT转换,因此,NAT路由器上要有一条路由

    ip route 10.254.1.1 255.255.255.255 192.168.199.1

    当然,指向真实地址192.168.199.199的路由也不能少

    ip route 192.168.199.199 255.255.255.255 192.168.199.1

    在路由器匹配第一条路由,确定了出接口后,进一步会匹配到NAT策略,由于我们已经设置了静态NAT,所以10.254.1.1会被转换为192.168.199.199,与此同时,由于还存在inside侧的dynamic转换,所以源地址10.254.0.2会被转换为192.168.198.1

    在NAT GW上执行 show ip nat translations 会看到如下输出

    Pro  Inside global         Inside local          Outside local         Outside global
    ---  ---                   ---                   10.254.1.1            192.168.199.199       
    tcp  192.168.198.1:34414   10.254.0.2:34414      10.254.1.1:23         192.168.199.199:23

    如此这般,192.168.199.199看到通过telnet连接过来的IP地址将会是192.168.198.1,反向的数据流由于优先匹配NAT表项,因此会再次转换,双向数据皆可通

    在192.168.199.199,也就是TEST-RTR这台路由器上,通过log日志,可以看到登陆过来的地址是什么——

    *Jun 28 04:25:19.198: %SEC_LOGIN-5-LOGIN_SUCCESS: Login Success [user: admin] [Source: 192.168.198.1] [localport: 23] at 04:25:19 UTC Fri Jun 28 2019

    大功告成!

    不,还没完,这是inside client --> outside server

    那outside client --> inside server 呢?


    例子解析2 outside client --> inside server

    这是一个正好反过来的场景,同样的,我们去匹配上述四个逻辑,可以得出结论——

    • outside source dynamic,实现outside client的源地址转换
    ip access-list extended outsideClient
      permit ip host 192.168.199.199 any
    ip nat pool outsidePool 10.254.1.2 10.254.1.100 prefix-length 24
    ip nat outside source list outsideClient pool outsidePool 

    其实配置上差别不大,只是inside换成outside而已,但是,需要注意,我也不知道为什么,C记也没解释,从outside到inside的Dynamic转换是不支持PAT的,这真是见了个鬼了

    所以在和外部实体对接的是,如果使用路由器来做双向转换,当数据流由外部实体发起时,就不能只分给外部实体一个地址,而必须分一个Pool,和外部实体实际要发起数据流的客户端数量相当或者更多,换言之,最好的方法是为外部实体分一个IP段

    然鹅,如果是防火墙来实现双向NAT,又没有这个问题了……给外部实体两个地址就好了,分别对应两个方向发起的数据流

    • inside source static,实现inside server的源地址转换

    配好了从outside访问到inside的Dynamic NAT之后,当然还少不了inside侧的静态转换

    ip nat inside source static 10.254.0.2 192.168.198.2
    • 仍然不要忘记配置路由,只不过这次,不能只配一条路由了,所以我们可以考虑整个pool的路由都写过去,实际中取决于你如何为outside侧的client分配地址
    ip route 10.254.1.0 255.255.255.0 192.168.199.1
    ip route 192.168.199.199 255.255.255.255 192.168.199.1

    这样配过之后,我们可以看一下NAT GW的转换表,这就跟我们通常配置的inside静态NAT没什么区别

    Pro  Inside global         Inside local          Outside local         Outside global
    ---  192.168.198.2         10.254.0.2            ---                   ---
    Total number of translations: 1

    从outside client连接到inside server

    TEST-RTR#telnet 192.168.198.2 /source-interface loopback 0
    Trying 192.168.198.2 ... Open
    
    User Access Verification
    
    Username: admin
    Password: 
    RTR1_lab# 

    然后查看NAT GW的转换表

    Pro  Inside global         Inside local          Outside local         Outside global
    ---  ---                   ---                   10.254.1.2            192.168.199.199       
    ---  192.168.198.2         10.254.0.2            ---                   ---
    tcp  192.168.198.2:23      10.254.0.2:23         10.254.1.2:38401      192.168.199.199:38401
    tcp  192.168.198.2:23      10.254.0.2:23         10.254.1.2:24577      192.168.199.199:24577

    由于我发起了两次连接,因此出现了两条NAT转换。其实从这里看可以发现,从 outside --> inside 完全有能力实现PAT的,只是不知道为什么,C记在软件上做了限制,将overload这一feature,限制在了 inside --> outside 这一方向上。

    P.S. 从路由器那吊诡的local/global地址的设计中不难看出,在最初设计NAT时,应该是只考虑了路由器连接内网和Internet这样的场景,而不是遵循“真实地址”和“映射地址”这样的逻辑,这可能就是问题的根源了。场景化来设计功能是C记诸多设备上都有的问题,好处是功能设计出来,用户可能更容易理解(也可能更不容易理解),但缺点就是会有一些莫名其妙的限制。

    我们可以进一步观察从 outside --> inside 这个方向上Dynamic NAT的实现,现在,修改NAT GW上的配置——

    ip access-list extended outsideClient
      permit ip host 192.168.199.199 any
      permit ip host 192.168.199.198 any
    ip nat pool outsidePool 10.254.1.2 10.254.1.2 prefix-length 24

    Client多了一个,我们用TSET-RTR上的另一个IP地址来模拟。同时我把pool内的地址限制在了1个

    测试结果是——

    *Jun 28 05:50:38.022: %IOSXE-6-PLATFORM: R0/0: cpp_cp: QFP:0.0 Thread:000 TS:00000936958686029110 %NAT-6-ADDR_ALLOC_FAILURE: Address allocation failed; pool 4 may be exhausted [2]
    GW#show ip nat trans
    Pro  Inside global         Inside local          Outside local         Outside global
    ---  ---                   ---                   10.254.1.2            192.168.199.199       
    ---  192.168.198.2         10.254.0.2            ---                   ---
    tcp  192.168.198.2:23      10.254.0.2:23         192.168.199.198:42497 192.168.199.198:42497
    tcp  192.168.198.2:23      10.254.0.2:23         10.254.1.2:24577      192.168.199.199:24577
    Total number of translations: 4

    不出意外的,.199被正常转换,而.198没有,因为pool内的地址资源耗尽

    让我们来试试overload参数……

    ip nat outside source list outsideClient pool outsidePool overload
                                                              ^
    % Invalid input detected at '^' marker.

    啊,看来并没有隐藏这个参数,而是真的没有……shit!

    小结

    虽然Router的NAT功能在不断地版本迭代中一直在被强化,但始终是“不那么好用”,除了双转,在IOS-XE上,还有VASI这一看上去很强,实际上复杂的1B的神器。对一个网络来说,单个Platform的feature是不是强,完整,很多时候并不重要,只要它在合适的位置发挥合适的作用就行了。所以对于IOS Router的NAT,我的使用感受是——没办法的时候就用用,能上防火墙的时候就不依靠它。就酱。

    展开全文
  • 一、NAT 概述NAT 是将 IP 数据报报头中的 IP 地址转换为另一个 IP 地址的过程,主要用于实现内部网络(私有 IP 地址)访问外部网络(公有 IP 地址)的功能。Basic NAT 是实现一对一的 IP 地址转换,而 NAPT 可以实现...
  • 在我们电脑的ip配置里,有静态配置 ip 地址和动态获取 ip 地址两种选择。我敢保证绝大部分人使用的都是动态获取 ip 地址,因为如果自己静态配置的话,容易出错,例如你不小心配置了一个已经被其他人在使用的 ip 地址...
  • 我用 flow->packet.iph.saddr flow->packet.iph.daddr 拿到的每个包的两个地址都是一样的(应该是不一样的才对),我就不理解了。 端口号我在tcp层拿到了。 **问题:** 1、 问什么拿到的地址是一样的? 2、 怎么...
  • 帧经过交换机时,其、目标MAC是不会变的,一句话:二层转发不改变帧的MAC地址、IP地址; 帧经过路由器时,进行路由转发,IP地址是不会变的,但MAC地址必定会变 举个例子:A----B----C-----D 四个路由器 比如A...
  • 今天再次看了看 TCP/IP详解 发现这个问题。我的理解是这样的。 考虑: 首先,TCP协议针对的单波的数据传输,从A~B的数据传输, 但是呢,可以在A~B之间建立很多...最后,你会发现这些链接如果用 源地址和目的地址
  • IPV6地址理解及配置

    万次阅读 2015-01-09 20:57:23
     理解: IPv6单播地址的类型可有多种,包括全球单播地址、链路本地地址和站点本地地址等。 1. 全球单播地址等同于IPv4公网地址,...使用链路本地地址作为目的地址的数据报文不会被转发 到其他链路上。 3.
  • 理解:在数据进行传输时,数据链路层的MAC地址改变,网络层的原IP地址和目的IP地址不变。MAC地址是为了进行数据传输,IP地址是为了确认目的主机。如果IP地址改变则目的主机改变无法进行正常通信。如果MAC地址不改变...
  • 华为交换机三种端口模式Access、Hybrid 和Trunk 的理解【针对...tag 报文结构的变化是在mac 地址和目的mac 地址之后,加上了4bytes 的vlan 信息,也就是vlan tag 头;一般来说这样的报文普通PC 机的网卡是不能识别...
  • 理解(要发送IP数据报的设备)发送一个包含目的地(接收数据报的一方)信息的广播,目的地则使用单播向该源发回一个响应,告诉那个目的地的MAC地址。2、ARP报文类型:首先,在ARP中发送了2种不同的报文,分别...
  • 透传:透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。(我的理解:就是不管内容如何我就负责传输,不对内容进行验证...
  • 地址解析协议(ARP)

    2019-05-08 19:49:47
    IP地址与MAC地址 要理解ARP协议的工作原理必须先理解IP地址和MAC地址的区别,MAC地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,...MAC帧在传送时使用的源地址和目的地址都是硬件地址...
  • 一:通信方式分类 在IPv4网络中,主机可采用的通信方式有如下三种: 1、单播:单台主机与单台主机之间的数据通信 ...单播是指单台设备与单台设备之间的通信,源地址和目的地址都是单一的IPv4地址,单
  • 在NAT中有4个术语:内部本地,内部全局,...(相同颜色处于同一层次平面)上面四个术语描述的IP地址,可以这样理解:内部本地外部全局,是通信中正式的真正/目的地址内部全局外部本地是在NAT过程中的一个中间量. 内部...
  • tag报文结构是在mac地址和目的mac地址之后,加上了4bytes的vlan信息,普通的PC网卡是不能识别 的。 Access端口只属于1个VLAN,一般用于连接计算机端口。 Trunk类型的端口可用于多VLAN通信。 Hybrid...
  • ...DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。 这是我们在设置Linu
  • 数据在网络传输中有几个比较重要的东西:一个是IP地址,分为源地址和目的地址,一个是MAC地址,分为源MAC地址和目的MAC地址,发送一个信息需要填写源IP,和目的IP,源MAC地址,和目的MAC地址,目的IP决定逻辑上的目的...
  • DNAT(Destination Network Address Translation,目的地址转换) 通常被叫做目的映谢。而SNAT(Source Network Address Translation,源地址转换)通常被叫做源映谢。 这是我们在设置Linux网关或者防火墙时经常要...
  • vTag,untag以及交换机的各种端口模式是网络工程技术人员调试交换机时接触最多的概念了,然而笔者发现在实际工作中技术人员...tag报文结构的变化是在mac地址和目的mac地址之后,加上了4bytes的vlan信息,也就是vl...
  • 预备知识:Tag,untag以及交换机的各种端口模式是网络工程技术人员调试交换机时接触最多的概念了,然而笔者发现在实际工作中技术人员往往对这些...tag报文结构的变化是在mac地址和目的mac地址之后,加上了4bytes的...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 305
精华内容 122
热门标签
关键字:

源地址和目的地址理解