关于《改进NAT》一文的勘误补充讨论大集合
2007-11-01 21:36
323 查看
我在CSNA发表的帖子,吸引了很多技术爱好者前来发表意见,很是感谢,在此予以集中整理!
=====
ISP通过检测高端口来鉴别客户使用NAT的可能性不大,一方面是2000/xp/2003开机时间长了,也会用到高端口;另一方面,现在的vista/2008一开始就用高端口,ISP用这个来鉴别岂不是自找麻烦?因此,目前还是以IPID等ip指纹为主来鉴别。
=====
虽然我们这类的isp没有封共享上网 但是楼主的帖子写的很生动具体 分析的也很透彻 是个好的NAT介绍
不过这个新的方法 为一个包在这一增一删上花费就大了点 主机多的话不知道吃不吃的消
=====
"这就是简单NAT的局限性!所以简单NAT要开放高端口(比如20000以上的端口),来为每一个Socket对建立一个外部端口,这样简单NAT的转发就不会出错。"
这并不存在因果关系,用低端口一样可以为每一个socks使用一个外部端口,之所以使用象45000以后的高端口完全因为端口定义的问题。
=====
“但是,设想极端的情况,如果1和2都用相同的源端口1025访问A的80,那么简单的NAT在接收到数据准备回复的时候,就会出错。简单的NAT会收到两个来自A服务器80,到本地1025端口的数据包,它不知道哪个应该返回给1,哪个给2。”
您前面已经说了,转换是通过4元组(源,目的地址,源,目的端口)实现的,即使同时发生了您上面说说的情况,NAT设备依然可以依靠不同的IP地址进行识别啊?
而且我认为,您的这种说法,貌似应用性不强哈~~~
=====
引用:
原帖由 lnan 于 29/10/2007 09:51 发表
您前面已经说了,转换是通过4元组(源,目的地址,源,目的端口)实现的,即使同时发生了您上面说说的情况,NAT设备依然可以依靠不同的IP地址进行识别啊?
绝对不可能,呵呵。至少以一个Socket对判断绝对不可能。
to:fnto,根据猜测isp应该是以IPID来判断的,但是至少我是没办法证实。
何谓“自找麻烦”,isp封路由本身就是/自找麻烦/,至于用什么手段,造成什么影响,isp的公关部门不是吃白饭的,我又不是没见识过,哈。您“端口定义”的理论我赞同,不过10000一下的端口还是有一些基础服务,所以要开得高点避免麻烦。
to: hhhlllttt
NAT的转发表,都是需要维护的,简单的NAT也是如此。如果不维护,一个链接一个端口,60000个端口我相信很快就会耗尽的。
维护的手段不同吧,这只是一个最初的想法,后期的技术还需要完善。
感谢朋友们与我分享你们的思路,在这儿能看到一些真实的意见。
ps:保留文章及其阐述技术之所有权,授权用途仅限于科学研究,不得用于商业、专利申请等,保留行使法律手段的权利。
=====
“但是,设想极端的情况,如果1和2都用相同的源端口1025访问A的80,那么简单的NAT在接收到数据准备回复的时候,就会出错。简单的NAT会收到两个来自A服务器80,到本地1025端口的数据包,它不知道哪个应该返回给1,哪个给2。”
1和2同时用1025访问A的80,路由器给A的返回端口应该不会都是1025。
=====
引用:
原帖由 chinarabbit 于 1/11/2007 13:53 发表
1和2同时用1025访问A的80,路由器给A的返回端口应该不会都是1025。
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
=====
引用:
原帖由 robur 于 2007-11-1 14:30 发表
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
如果路由不改变端口转发的话,又何来建立一个外部端口的说法呢?要是说都不改变端口转发,是否有高端口那就取决于客户机,和路由没什么关系了。真有不改端口的路由吗?
=====
引用:
原帖由 robur 于 2007-11-1 14:30 发表
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
从理论上讲,NAT在转发数据包时,肯定会对将源端口改为自己表中的一个相应端口,即我认为,出现robur所说的极端情况时,NAT设备也能够正常处理。所以,对于fnto所谈到的,简单NAT开放高端口(比如20000以上的端口),来为每一个Socket对建立一个外部端口,这样简单NAT的转发就不会出错,并不存在因果关系的观点,我比较赞同。
另外,据我所知,目前ISP对于共享的检测,有几种常见的方法。
1.一部分可以通过SNMP协议检测ADSL,有人做过这样的实验,在打开SNMP的情况下,通过SNMP管理软件连接上去,可以成功发现有多台机器在共享上网。但这个方法存在局限性,有些ADSL不支持SNMP协议,或者用户手工关闭了SNMP。
2.检测一个网络的并发连接,超过了设定的阈值,就认为存在共享(我曾经在一台机器上遇过到这样的情况,后来打电话去骂了一通ISP后解决),但这种方法在robur所在的ISP处行不通,可能各地ISP的方法存在一定差异。
3.检测数据包的IPID,这是我个人认为可能性最大的一种途径。由于NAT在转发时,不会对IP报头的数据包进行任何修改,而不同机器发出的数据包,其IPID可能相差较大,ISP的设备上可能存在一个阈值,即在多少的情况下,则认为存在共享上网。
设想,如果我们在NAT转发时,能将IPID进行统一规则的设定,问题不就可以解决了吗?(由于不懂研发,故胡乱说一通)。
有些人还说道,可以根据SESSION来判断,但我不太明白这个如何判断,期待中。
=====
现在的路由器使用的就是简单NAT,通过在外部开设不同的端口,来转发内网的数据,这是为了避免同一时间、同一目标IP、同一目标Port、同一源端口的数据报出现而造成错误。
所以在我前文中说的极端情况出现的时候,必然能避免。
但是我前文说的是,如果NAT不采用这种方法转发的话,会如何如何如何。。。望读者周知。
我只是在阐述一个能让NAT不改变外部源端口的转发技术,无他。准备就这个搞个项目。
另外IPID是一个极其严重但是却很弱智的问题,不知道路由厂商为何不考虑一下国情,做这个处理根本不需要几行代码。
=====
另外说下,不管楼上若干xd对本技术的意见如何,有任何技术上的质疑
我都很感谢能分享你们的观点!
做技术就是要精益求精,就是要不怕别人挑毛病,你说得更好,我就按你的做,呵呵
这很能说明CSNA是一个适合讨论技术问题的地方,能专心探讨技术问题才是我们需要的。
在别的地方仍出不成熟的技术帖总是要引来一大堆的挖苦讥讽,实在无奈。
=====
=====
ISP通过检测高端口来鉴别客户使用NAT的可能性不大,一方面是2000/xp/2003开机时间长了,也会用到高端口;另一方面,现在的vista/2008一开始就用高端口,ISP用这个来鉴别岂不是自找麻烦?因此,目前还是以IPID等ip指纹为主来鉴别。
=====
虽然我们这类的isp没有封共享上网 但是楼主的帖子写的很生动具体 分析的也很透彻 是个好的NAT介绍
不过这个新的方法 为一个包在这一增一删上花费就大了点 主机多的话不知道吃不吃的消
=====
"这就是简单NAT的局限性!所以简单NAT要开放高端口(比如20000以上的端口),来为每一个Socket对建立一个外部端口,这样简单NAT的转发就不会出错。"
这并不存在因果关系,用低端口一样可以为每一个socks使用一个外部端口,之所以使用象45000以后的高端口完全因为端口定义的问题。
=====
“但是,设想极端的情况,如果1和2都用相同的源端口1025访问A的80,那么简单的NAT在接收到数据准备回复的时候,就会出错。简单的NAT会收到两个来自A服务器80,到本地1025端口的数据包,它不知道哪个应该返回给1,哪个给2。”
您前面已经说了,转换是通过4元组(源,目的地址,源,目的端口)实现的,即使同时发生了您上面说说的情况,NAT设备依然可以依靠不同的IP地址进行识别啊?
而且我认为,您的这种说法,貌似应用性不强哈~~~
=====
引用:
原帖由 lnan 于 29/10/2007 09:51 发表
您前面已经说了,转换是通过4元组(源,目的地址,源,目的端口)实现的,即使同时发生了您上面说说的情况,NAT设备依然可以依靠不同的IP地址进行识别啊?
绝对不可能,呵呵。至少以一个Socket对判断绝对不可能。
to:fnto,根据猜测isp应该是以IPID来判断的,但是至少我是没办法证实。
何谓“自找麻烦”,isp封路由本身就是/自找麻烦/,至于用什么手段,造成什么影响,isp的公关部门不是吃白饭的,我又不是没见识过,哈。您“端口定义”的理论我赞同,不过10000一下的端口还是有一些基础服务,所以要开得高点避免麻烦。
to: hhhlllttt
NAT的转发表,都是需要维护的,简单的NAT也是如此。如果不维护,一个链接一个端口,60000个端口我相信很快就会耗尽的。
维护的手段不同吧,这只是一个最初的想法,后期的技术还需要完善。
感谢朋友们与我分享你们的思路,在这儿能看到一些真实的意见。
ps:保留文章及其阐述技术之所有权,授权用途仅限于科学研究,不得用于商业、专利申请等,保留行使法律手段的权利。
=====
“但是,设想极端的情况,如果1和2都用相同的源端口1025访问A的80,那么简单的NAT在接收到数据准备回复的时候,就会出错。简单的NAT会收到两个来自A服务器80,到本地1025端口的数据包,它不知道哪个应该返回给1,哪个给2。”
1和2同时用1025访问A的80,路由器给A的返回端口应该不会都是1025。
=====
引用:
原帖由 chinarabbit 于 1/11/2007 13:53 发表
1和2同时用1025访问A的80,路由器给A的返回端口应该不会都是1025。
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
=====
引用:
原帖由 robur 于 2007-11-1 14:30 发表
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
如果路由不改变端口转发的话,又何来建立一个外部端口的说法呢?要是说都不改变端口转发,是否有高端口那就取决于客户机,和路由没什么关系了。真有不改端口的路由吗?
=====
引用:
原帖由 robur 于 2007-11-1 14:30 发表
看来很多xd没有理解我说话的意思,联系上下文看看。。。
我的意思是,在路由不改变端口转发到情况下。。。
从理论上讲,NAT在转发数据包时,肯定会对将源端口改为自己表中的一个相应端口,即我认为,出现robur所说的极端情况时,NAT设备也能够正常处理。所以,对于fnto所谈到的,简单NAT开放高端口(比如20000以上的端口),来为每一个Socket对建立一个外部端口,这样简单NAT的转发就不会出错,并不存在因果关系的观点,我比较赞同。
另外,据我所知,目前ISP对于共享的检测,有几种常见的方法。
1.一部分可以通过SNMP协议检测ADSL,有人做过这样的实验,在打开SNMP的情况下,通过SNMP管理软件连接上去,可以成功发现有多台机器在共享上网。但这个方法存在局限性,有些ADSL不支持SNMP协议,或者用户手工关闭了SNMP。
2.检测一个网络的并发连接,超过了设定的阈值,就认为存在共享(我曾经在一台机器上遇过到这样的情况,后来打电话去骂了一通ISP后解决),但这种方法在robur所在的ISP处行不通,可能各地ISP的方法存在一定差异。
3.检测数据包的IPID,这是我个人认为可能性最大的一种途径。由于NAT在转发时,不会对IP报头的数据包进行任何修改,而不同机器发出的数据包,其IPID可能相差较大,ISP的设备上可能存在一个阈值,即在多少的情况下,则认为存在共享上网。
设想,如果我们在NAT转发时,能将IPID进行统一规则的设定,问题不就可以解决了吗?(由于不懂研发,故胡乱说一通)。
有些人还说道,可以根据SESSION来判断,但我不太明白这个如何判断,期待中。
=====
现在的路由器使用的就是简单NAT,通过在外部开设不同的端口,来转发内网的数据,这是为了避免同一时间、同一目标IP、同一目标Port、同一源端口的数据报出现而造成错误。
所以在我前文中说的极端情况出现的时候,必然能避免。
但是我前文说的是,如果NAT不采用这种方法转发的话,会如何如何如何。。。望读者周知。
我只是在阐述一个能让NAT不改变外部源端口的转发技术,无他。准备就这个搞个项目。
另外IPID是一个极其严重但是却很弱智的问题,不知道路由厂商为何不考虑一下国情,做这个处理根本不需要几行代码。
=====
另外说下,不管楼上若干xd对本技术的意见如何,有任何技术上的质疑
我都很感谢能分享你们的观点!
做技术就是要精益求精,就是要不怕别人挑毛病,你说得更好,我就按你的做,呵呵
这很能说明CSNA是一个适合讨论技术问题的地方,能专心探讨技术问题才是我们需要的。
在别的地方仍出不成熟的技术帖总是要引来一大堆的挖苦讥讽,实在无奈。
=====
相关文章推荐
- 【讨论】关于2440 触摸屏去抖动和防抖动的的补充(作者:gooogleman)
- 关于《程序语言-平台优越性》一文补充说明
- “关于winpcap捕获802.11帧”一文的补充
- [技术讨论]关于《交换编程——极限编程的延伸实践》一文拟录用通知
- 关于 如何将索引碎片数量降至最低 一文的勘误
- 关于误ghost和误分区一文的补充
- 关于“幽灵架构”的补充说明2:Struct以及Copy - on -Write
- 关于javascript 回调函数中变量作用域的讨论
- 关于数项级数收敛的专题讨论
- 关于广播注册方式的一点补充
- 关于在页面哪部分引入JS的讨论
- 非相关话题讨论:关于大峡!
- 关于打印机设置的讨论
- Discuz!X3.1安装图文教程的补充:IIS7.0下关于PHP配置的懒人模式
- 关于“幽灵架构”的补充说明5:改造控制器
- 关于Extjs4开发笔记(二)的补充说明
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于微分中值定理的专题讨论
- 关于SSH的Service层和Dao层的接口的讨论