其实NAT放在这里我不知道是不是个何时的位置,但是先写下来吧,如果后面觉得还是挪到后面比较我再挪到后面。
当我第一次帮别人配置路由器的时候(其实也就是帮别人设置下无线密码),我很好奇为啥这些路由器的IP地址都是192.168.0开头的一个地址?这个IP地址有啥魔力,为啥定这个地址作为一个看起来通用的IP地址呢?然后伴着我的搜索,NAT这个词就进入了我的视野,伴随着那个时候并不是很熟练的计算机网络知识。
NAT,学名Network Address Translation,猛的一看,有没有觉得这个名称给ARP的功能运用更加合适?网络地址转换,但实际上NAT是转换的是外网地址到某种私有网络的地址。为什么要这么做?因为前面也提过,网络终端的爆炸式增长和最初设计的时候IPv4地址总量限制的矛盾越来越突出。设计者们从来都没有停止过一分钟的与这个问题的搏斗而且不停的想出各种方案。IPv6就是在这种长期斗争后的目前最佳解决方案之一,而NAT也是非常成功的初代解决方案。
左边是有NAT的情况,在路由器内部,每一个圈圈(可以看做更下面的路由器)都分配了一个10.10x.x.x的子网地址,而路由器对外的接口是两个193的地址,那么如果外面的网路想往这个小子网里面发送消息的话,只要发送到193的这个子网,带有NAT功能的路由器会处理接下来的事情的。而这样做的效果就是只要255个保留地址就能管理者一大片的网络。相对于右边,每个子网都分配一个IPv4保留地址,那么同样大的一片网络需要1000个地址。
前面说过,Dest IP地址是写在IP地址包头里面的,才能保证这个数据包能被发送并且回复到正确的地址上,那么一个带有NAT功能的路由器是如何将内网部发送过来的IP包头中源地址替换成自己的外网的接口地址而又在返回的过程中替换成正确的内部IP呢?答案是通过查表。
那么这个表从和而来呢?有两种办法,一个是通过静态的配置,这种比较傻,凸显一个灵活性不高。第二种方法,采用动态的方法,大体过程是当内网的一个主机向外网发消息的时候,带有NAT的路由会把IP数据头里面的源地址换成自己的对外地址,然后记录下来对应转换的内网地址。这样当有从外网发回来的消息的时候,经过这个NAT路由器,路由器通过找到其表来找回相应的内网地址并且完成IP数据包头相应内容的替换。在linux上,使用iptables -t nat -l -n这个命令就可以查看到路由器所配置的NAT表。至于windows,我至今还未见到跑在windows上的路由器,我也不知道有没有这个功能可以供使用。
相反与上面的概念,还有一种就是NAT穿透,名词很霸气,其核心意思就是表失去了作用,防护失去了作用,外网和内网的某个地址发生了“直接”的通信,就造成了一个安全问题。
其实关于NAT的知识还是有很多的,但是作为一个只需要了解网络编程的程序员来说,我觉得这些就足够了,毕竟我们不是网络维护工程师也不是网络设计人员。
路由器这三个字可能已经成为最普及的专业网路设备名词了,但是大部分都是指带有无线功能的路由器。其实路由器的 功能太多了,如果是专业的网络技术人员,那么路由器肯定是需要认真深入学习的一个内容,但是对于仅仅是作为编程人员,就不需要知道的那么多了。但是,也不能一点也不知道,比如诸如路由器是工作在第几层的这种基本问题,如果在面试的时候不能脱口而出,那么我想就比较尴尬了。其实我觉得对于路由器,作为我们这种重点在编程的程序员来说,记住三点几足以了:
- 路由器的主要作用是链接各个子网,并且能提供子网地址的简单管理功能。