免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1283 | 回复: 0
打印 上一主题 下一主题

NAT原理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-19 15:44 |只看该作者 |倒序浏览
看了一个视频教程,感觉很好,对NAT有了新的认识,于是做了笔录.      nat 翻译成中文就是地址转换,顾名思义也就是把一个ip地址转换成另一个ip地址,有人问为什么转换,请看下面.     数据包中的ip头部包含源ip地址,也就是发出这个包的源节点ip地址,和目的ip地址,也就是这个包最终会被谁收到.     举个例子,有一伙犯罪团伙,有三名成员,狗,老虎,老狼,为了作案方便,他们都办了假身份证,狗成了毛虫,老虎成了小白,老狼则成了绵羊的身份证.他们在窝点内部,直接用各自的真名来通话,作案的时候,他们对其他人来说,就是毛虫,小白,和绵羊,别人称呼他们也是这三个名字.      实际中,如果想隐藏自己的真实身份,那么可以人为的反源ip地址改成一个其他的ip地址,对方接受到之后,以为消息就是从这个ip发的,那么他回应的时候也使用这个地址作为回应消息的目的地址,目的地址处的nat设备一旦收到这个消息,就把消息中的目的地址替换成发信人的真实ip地址,然后转交给发信人.     nat的出现其实最初是为了解决ip地址不够的问题的,我们知道,ip地址中有一类私有地址,也就是大家谁都 可以用的地址,就类似比如冬冬,娜娜这样名字,大家谁都 可以用,但是你如果去办身份证,就不会让你用这个名字.ip地址就2的32次方那么多个,如果再人多余的节点要分配地址,就不够用了,所以就提出用nat来解决.也就是,如果犯罪团伙有10名匪徒,但是匪头就成功的办了5张身份证,那么每次只能有5个人拿着假身份证出去做案,余下的只能在窝里呆着,如果余下的5人想做案,那么只能等出去的那5个回来,一旦有外界要和他们联系,统统用假名字,匪头根据身份证假名字和真名字的对应,,然后点匪(点名),让对应的匪徒出去和外界交涉.但是,有一天匪头一想,这样太浪费了,得找个机制,让所有人都能出动,于是想了一个办法:让多个人都用同一个身份证,但是给他们再区分一个,比如绵羊:80和绵羊, 8000就不是一个人,找绵羊80的,匪头就告诉a匪,找绵羊8000的,匪头就告诉b匪.这们终于全部出动的.这样匪头就可以只用一个假身份证出动了.     目前企业申请一个ip,需要付钱给网通电信公司,因为负担不起给企业中每个办公室的每台pc都配一个公网ip,那么公司内部有那么多的人想和外界联系,他们用的源ip地址怎么办,那么刚才说过,大家都用这个ip地址做源ip地址,是个集体户,那么刚才也说了,得有个机制,不能集体了就全部集体,用什么来区分符号呢?冥思苦想,是否可以更改ip头部结构,就像vlan id一样,加入一个东西来区分.可以,但是全世界所有机器上运行的ip协议程序都要改,不行,对了,tcp不是有端口号吗,而且和外界联系的时候,除了ip这一层,一定有一个传输层内容,比如tcp或者udp,而他们都有个端口号,也就是除了源和目的ip地址,还要有源和目的tcp/udp端口号,我们就用这个已经存在在数据包中的端口号为第二区分符.     nat一共有4个具体实现,刚才说的那种,10个人,5个假身份证,5个人干活,5个人永远呆在窝里处理内务那种,叫做静态nat,也就是一个对一个,如果有100个身份证,10个匪徒,那么这个苦头比较厉害,10个人都能出去作案.第二种情况,也是刚才那种情况,10个人,5个证,但是大家都可以用,谁先抢来,谁就拿着出去作案,回来之后放到桌上,没轮到的再去抢,抢着了就出去,抢不着还在呆着,这们也就是同时只能有5名出去作案,但是全局意义上,每个匪徒都有机会出去,这叫做动态nat.第三种,10个匪徒,1个假身份证,大家都用这一个假身份证.但是可以同时出去作案,因为他们还有二级区分符:端口号.这种叫做pat.端口地址转换,或者复用的nat转换,第四种,动态nat+pat,也就是10个人,5个身份证,其中前4张身份证用动态nat,大家来抢,谁先抢到是谁的,但是剩下一张,就给没抢到的用pat方式共享,当然没有一对一来的爽了.     我们来看看具体实现机制.     一个路由器,两个接口,一个接外网,也就是isp接过来的,一个接内网,也就是和内网交换机相连,比如我现在就是内网的10.1.1.1这台机器,我现在打算访问www.sina.com.**,大家说第一步是做什么?对,是先进行*ns解析,由于我机器上配置了dns,比如是202.102,134.68,我的机器判断,这个dns服务器和本机地址不同在一个ip子网,那么它准备先把这个包发给网关,然后让网关转发到这个dns服务器上,所以我的机器会先发arp,请求我设置的网关10.1.1.254的mac地址,请求之后,机器立即组包,包的目的ip就是dns服务器地址202.106.134.68.源地址就是本机ip地址:10.1.1.1,有了这个还不够,ip只是定义了发信人的目的地,但是数据包到达之后提交给那个应用层来处理,必须利用tcp或者udp层的端口号来区别,所以ip头部之上,我机器附加了一层udp层,因为dns查询数据包标准情况下使用udp来传输,比如我随即选了一个我的源端口号,udp5555,那么目的端口号,必须设定为dns标准端口号,也就是对方一收到这个数据包就知道这个包是给dns程序的,需要提交给dns程序进行处理,所以目的udp端口设定为:udp53,就是53端口是dns程序的,传输层头结束之后就是上三层的内容了,属于应用特定的内容,随应用不同而不同,我们就不必深究了包组好了,下一步就是通过交换机发给网关了,这个步骤交换机会做,我们也不管.网关收到之后,提交给路由器的程序进行处理,如果此时,路由器上没有配置nat,那么路由器直接查找路由表,发现这个地址应该从连接isp的接口发送出去,做转发处理,如果包被直接转发出去,那么包将携带这10.1.1.1的源ip地址而出去.然后isp根据包的目的地址来路由该包,最终这个dns查询包会被正确传送到dns服务器.然后服务器应答的时候,以10.1.1.1作为目的ip地址,同样的过程,包发给dns服务器上配置的网关,此时问题出现了 ,那个网关是不会知道10.1.1.1这个地址是怎么走的,因为10网段的地址被internet地址分配机构定义为私用地址,就像是广播电台寻人启事,我用要找的人的小名可以吗?当然不行,一个道理,所以以目的地址10.1.1.1的包,是禁止被传送到internet上做路由的,因为大家都 不会用这个地址暴露在internet上,你就算路由出去了,也没用.     私有地址禁止在公网上出现,那么10.1.1.1最终怎么查到dns的?答案就是nat.我们看看配置了nat的路由器怎么处理这个包,10.1.1.1发出的的dns查询包被路由器收到之后,路由器先检查nat配置,这里我们用静态nat为例,静态nat需要手动提前配置好,比如我们这里配置成:211.64.208.2--------10.1.1.1,入端口为内网口,出端口为外网口,注意,端口很重要,nat必须依托端口!也就是说路由器收到包之后先根据目的ip做路由查找,找出这个包将要发送给哪个端口,如果那个端口配置有nat,那么这个包还必须经过nat处理,nat处理的时候路由器会查看源ip而不是目的ip,由于我们配置了211.64.208.2------10.1.1.1,所以路由器一看到源ip地址是10.1.1.1,就把10.1.1.1替换成211.64.208.2,然后通过那个端口转发出去,那么经过nat转换的包,源地址变成了211.64.208.2,这们dna回应的时候这个地址作为目的ip地址,就可以被发送到本地路由器接收了,接受的包,和发送包时候顺序恰好相反,路由器一旦看见有包从出端口进来,就做nat检查,(先做nat处理而不是路由),因为211.64.208.2-----10.1.1.1,所以它把包的目的地址逆向替换,也就是将211.64.208.1替换成10.1.1.1 ,然后再做路由查找,找到出接口,也就是内网接口,然后发给10.1.1.1,结束.    上面讲的是静态的,动态的也一样,就是谁先谁用. 下面是pat     同样是上面是的例子,如果此时我只买了一个公网地址,也就是211.64.208.1,那么大家只能公用了.我们看看流程,同样,10.1.1.1这个节点发出dns查询包,源地址10.1.1.1目的地址为dns服务器地址202.102.134.68.然后目的端口udp53,源端口号udp5555.我们知道,路由器一般情况下,它是不关心ip层之上的内容的,就刚才静态nat的例子,没有涉及到传输层的内容,但是在pat中,必须检查,接着说,路由器收到这个包之后,首先根据目的ip做路由查找,找到将要发送出去的出口,为外网口,然后因为做了nat,在内网口和内网口之间,那么路由器就要将这个包pat一个,具体动作是:将源ip10.1.1.1替换成211.64.208.1,然后再将源端口号,如果这个端口号已经被其它人占用,那么就替换成随即选择的,如果没有被占用,那么就保持不变,比如10.1.1.2占用了211.64.208.1的8790端口,那么虽然10.1.1.1发出的包的源端口是8790,但是路由器收到之后,就不能用8790,得随即选一个,这里它选了211.64.208.1:8000端口,然后将这个事件记录到pat表中,经过这样处理的包,最终被发送出去,在isp中路由,最终路由到目的:dns服务器,然后dns服务器回应包,利用211.64.208.1作为目的ip,源ip还是dns服务器地址,目的端口就是收到包时候的端口号:udp8000,原端口就是u**53,然后这个回应包被本地路由器收到,它一看是从配置的*at的接口上进来的,那么它先反pat处理,参照pat表,将目的ip变为10.1.1.1,然后目的端口变为8790,然后做路由查找,找到10.1.1.1对应的出接口,也就内网接口,然后发送给10.1.1.1
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94651/showart_1903898.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP