最近几天感觉自己有点懒了,可能是被这年底休假的气氛所感染吧。哈哈

其实NAT放在这里我不知道是不是个何时的位置,但是先写下来吧,如果后面觉得还是挪到后面比较我再挪到后面。

为啥路由器的管理IP地址都是那么几个?

当我第一次帮别人配置路由器的时候(其实也就是帮别人设置下无线密码),我很好奇为啥这些路由器的IP地址都是192.168.0开头的一个地址?这个IP地址有啥魔力,为啥定这个地址作为一个看起来通用的IP地址呢?然后伴着我的搜索,NAT这个词就进入了我的视野,伴随着那个时候并不是很熟练的计算机网络知识。

NAT,学名Network Address Translation,猛的一看,有没有觉得这个名称给ARP的功能运用更加合适?网络地址转换,但实际上NAT是转换的是外网地址到某种私有网络的地址。为什么要这么做?因为前面也提过,网络终端的爆炸式增长和最初设计的时候IPv4地址总量限制的矛盾越来越突出。设计者们从来都没有停止过一分钟的与这个问题的搏斗而且不停的想出各种方案。IPv6就是在这种长期斗争后的目前最佳解决方案之一,而NAT也是非常成功的初代解决方案。

NAT的主要思想就是在一个小的范围内,比如一个家庭,一个小型办公室网络中,我们没有必要给每一个网络终端都从IPv4的地址池里分配一个,相对于用爆炸这个词来形容的终端增长速度,如果按照这种朴素的方案,要不了多久,世界上就不能再有人能上网了。所以大师们就想到复用这个方法,我觉得复用这个思维体现在计算机的方方面面,大师们在一个小的范围内来复用一部分地址,而这一部分地址作为保留地址从不会分配给某一个主机永久占有。而这一部分地址的分配权利交给每个子网的路由器,其实也就是局域网架构的设计者。放到现实中,有点区域自治的意思。而这个地址范围一般是192.168.x.x或者10.x.x.x,所以这也就是为什么路由器的配置地址都是192.168开头的。其原理用以下两个图就能很清楚的表达:

 NAT,路由器与防火墙  - 图1左边是有NAT的情况,在路由器内部,每一个圈圈(可以看做更下面的路由器)都分配了一个10.10x.x.x的子网地址,而路由器对外的接口是两个193的地址,那么如果外面的网路想往这个小子网里面发送消息的话,只要发送到193的这个子网,带有NAT功能的路由器会处理接下来的事情的。而这样做的效果就是只要255个保留地址就能管理者一大片的网络。相对于右边,每个子网都分配一个IPv4保留地址,那么同样大的一片网络需要1000个地址。

NAT如何完成转换?

前面说过,Dest IP地址是写在IP地址包头里面的,才能保证这个数据包能被发送并且回复到正确的地址上,那么一个带有NAT功能的路由器是如何将内网部发送过来的IP包头中源地址替换成自己的外网的接口地址而又在返回的过程中替换成正确的内部IP呢?答案是通过查表。

那么这个表从和而来呢?有两种办法,一个是通过静态的配置,这种比较傻,凸显一个灵活性不高。第二种方法,采用动态的方法,大体过程是当内网的一个主机向外网发消息的时候,带有NAT的路由会把IP数据头里面的源地址换成自己的对外地址,然后记录下来对应转换的内网地址。这样当有从外网发回来的消息的时候,经过这个NAT路由器,路由器通过找到其表来找回相应的内网地址并且完成IP数据包头相应内容的替换。在linux上,使用iptables -t nat -l -n这个命令就可以查看到路由器所配置的NAT表。至于windows,我至今还未见到跑在windows上的路由器,我也不知道有没有这个功能可以供使用。

NAT与防火墙

前面说了,NAT的一个作用是提供IP地址的复用,其实NAT还有一个重要作用就是提供过滤的功能。因为NAT在做映射的时候不仅仅是可以将一个IP地址映射成一个外网的IP地址,而且还可以将端口映射到外网的端口,虽然说端口是下一个大节才能介绍的内容,但是你可以这样认为。NAT就像一个外网到内网的屏障,可以通过这种对应关系来选择传给内网的某个消息就到此为止了。这个特性就可以利用作为防火墙。

相反与上面的概念,还有一种就是NAT穿透,名词很霸气,其核心意思就是表失去了作用,防护失去了作用,外网和内网的某个地址发生了“直接”的通信,就造成了一个安全问题。

其实关于NAT的知识还是有很多的,但是作为一个只需要了解网络编程的程序员来说,我觉得这些就足够了,毕竟我们不是网络维护工程师也不是网络设计人员。

路由器

路由器这三个字可能已经成为最普及的专业网路设备名词了,但是大部分都是指带有无线功能的路由器。其实路由器的 功能太多了,如果是专业的网络技术人员,那么路由器肯定是需要认真深入学习的一个内容,但是对于仅仅是作为编程人员,就不需要知道的那么多了。但是,也不能一点也不知道,比如诸如路由器是工作在第几层的这种基本问题,如果在面试的时候不能脱口而出,那么我想就比较尴尬了。其实我觉得对于路由器,作为我们这种重点在编程的程序员来说,记住三点几足以了:

  • 一般所说的路由器是工作在网络层上的,所以也称三层路由器。
  • 路由器的主要作用是链接各个子网,并且能提供子网地址的简单管理功能。
  • 每个路由器里都配置有路由表,决定每个数据包从哪个端口发到哪个子网上,一个数据包每经过一个路由器就称之为经过了一“跳”。
    另外,路由表的建立和路由发现都有很多很复杂的协议。有兴趣可以参考IGP,EGP等关键词。