一个关于NAT改进的设想

今天突然想到,isp如何检测客户机用路由了?
根据一些情况,很多客户机用了路由,就是浏览网页也会被封。而单机bt,再浏览网页啥的,都没问题,基本就排除了连接数。
剩下的一些在客户端能改的,比如什么浏览器发送的Agent字段啦,透明代理啦,etc,我就不说了,自己想办法。

我觉得可能的无非两种:A、检测客户机的高端口;B、检测客户IP包的IP标识字段。
至于B,我们认为很好解决,IP包中的标识字段不是决定性的关键字段,只要充填任意十六进制数即可,因此出网的时候,路由完全可以给改成连续递增的。啥?路由固件不能升级?大不了咱们土鳖点,用2000做个路由和远程访问,然后写个ndis驱动挂上,改出网的数据包总可以了吧???!!!

何为高端口?电驴不是有一个高ID么?哈,就不可以有高端口了?
其实我说的高端口就是现在简单NAT的一种固有缺点——路由器转发你的数据包到外网,它发送数据包的源端口可不是你计算机发给路由的数据包的源端口了。路由器维护了一个“基于传输层”的路由表,这里面有ip、端口等诸多因素,来确定一个Socket对之间的数据包转发。为了减少路由器的负载,现在大多数厂商用的是简单的NAT技术,就是只关心【源、目标ip】和【源、目标端口】,而不关心传输层其他的内容。

普及一个知识!!!何为Socket对?说白了,就是源IP、目的IP、源端口、目的端口四个因素,这就构成了一个唯一的Socket对。

但是简单的NAT为何要使用高外部端口转发你的数据呢?
我们看图来理解一下,图中有1和2两台计算机,都在内网(lan),a和b是两台服务器,在外网(wan)。
如果1和2访问外网,只要目的ip、源端口和目的端口这三者之一有不同,那么简单的NAT就不会出错。
但是,设想极端的情况,如果1和2都用相同的源端口1025访问A的80,那么简单的NAT在接收到数据准备回复的时候,就会出错。简单的NAT会收到两个来自A服务器80,到本地1025端口的数据包,它不知道哪个应该返回给1,哪个给2。
这就是简单NAT的局限性!所以简单NAT要开放高端口(比如20000以上的端口),来为每一个Socket对建立一个外部端口,这样简单NAT的转发就不会出错。

因此,很显然,isp可以根据开放高端口这一特性,判定客户使用了路由器。(虽然很流氓的理由,但是没办法。)

那么如何使路由器不开放高端口?办法有的。。。思路一个,提供给大家。
IP地址是网络层的内容,端口是传输层的内容。在内网和公网之间的通信,经过NAT后,如果不改变外部端口,在某些情况下,我们就没法通过Socket对来确定一个唯一的进程间通信了。

Tips:进程间通信,是指通过一个Socket对,来确定两台计算机之间的两个进程之间的唯一通信,因为端口是计算机上的进程打开的。

其实NAT本身就是个工作在网络层与传输层的东西,(转发数据包是网络层,获取port之类的就到了传输层了,分层原则是不干涉其他层的内容,我这么说有道理吧?)
我们可以获取更多的传输层的信息来判定。就tcp而言,如果有上一个包的seq和ack,判断下一个包很容易。
路由器分配NAT表的话,我认为可以这样:检测到一个新的tcp包发送,建立一个NAT转发规则,记录了发送出去的包的相关信息,诸如socket对的所有信息,seq,ack等,然后检测入站的包,一旦在seq、ack上有符合这条规则的了,就按规则转发给内网的响应机器,然后删除此规则,而无需判断下一个发出去的包是什么。(因为NAT发包本身不存在类似问题) 

最后,补充一点,建立一个超时机制,删除在一定时间之内没有匹配的规则,这就是回首资源,不至于搞到内存暴涨死机。

Tips:保留所有权,以及其涉及的技术内容的所有权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值