怎么样让两个kali linux局域网入侵间的linux主机通过P2P互连

公司局域网如何禁止P2P下载?[1]
公司局域网如何禁止P2P下载?[1]
& &&& 目前,各大中小型企业纷纷将自己的内网与其外网相连,虽然这样可以从网上“猎取”到很多对公司有利的商机,但是有些企业内部员工,还要使用PSP软件非法占用公共的网络资源,从而影响到了其他人员的办公。
&&& 由于雇员滥用对等(P2P)网络技术共享音乐和视频,这项技术已经直接影响到企业的利益。由于目前国内企业一般只有有限的带宽,而P2P的出现在给你带来好处的同时,也给网络带宽带来了巨大的压力,尤其在用来进行大量数据下载的时候,很容易导致企业的其他业务无法正常进行。
&&& 用户在利用P2P技术进行传输时,多使用80端口,同时还会使用其他非正式协议,常常绕过企业的防火墙,使用P2P技术的文件共享使企业暴露在传统安全措施检测不到的病毒的威胁下。此外,由于不能阻止雇员访问违法或非授权资料,企业还面临法律风险。
&&& 那么作为网管的你,如何在企业局域网内部封堵P2P应用则成为维护企业安全的关键点之一。下面有介绍三种方法,可以帮助你达到目的。
&&& 方法一:使用聚生网管工具进行封堵
&&& 面对于P2P尚没有专门的控制软件诞生,一般只能通过防火墙或者代理服务器进行频繁的规则设定来完成,这也给网络管理人员带来巨大的工作量。殊不知P2P终结者软件,可帮助企业轻松解决这个日益严重的问题。
&&& 软件名称:聚生网管&&& 软件版本:2.2&&& 软件大小:3450KB&&& 软件性质:免费软件&&& 应用平台:Windows 9X/NT/2000/XP&&& 下载地址:
&&& 小提示: 聚生网管( ),是国内目前首套专门针对网络P2P滥用问题开发的系统软件,该软件可以实现对局域网所有主机的P2P下载进行控制,非常容易部署想要发出的限制方案,可保证企业网络的有限带宽能够得到正当利用,不会被内部自私的人所滥用。
&&& 根据以上下载地址,将其工具下载到本地计算机,然后在双击里面的安装程序,在所弹出的“安装向导”界面里,单击“下一步”按钮,进入安装“软件位置”的安装页面,这里你需要根据企业网络的具体情况,来决定此软件具体安装到机器的位置。例如大部分公司采用的路由器是共享上网,那么你就可以将该软件安装到网络中的任意机器中,反之安装到通过代理服务器上网的主机内即可。
&&& 当你安装完成后,第一次运行该软件时,就会弹出“系统初始化设置”对话框,如果你是“路由器共享上网”的企业,那么就在“接入公网类型”栏目里,选择跟自己对应的“路由器共享上网”选项。反之你是通过代理服务器上网,这里就请选择对应的上网方式“代理服务器上网”选项,另外下面“网络连接设备”栏目里的选项,可根据网络架设的实际情况进行选择,而后单击“完成设置”按钮,即可自动运行“P2P终结者”软件。稍等片刻后,会弹出“P2P终结者软件”的操作界面,这里在其左侧选择“软件配置”标签,此时编辑区默认选择的是“网卡设置”标签,在其下方“请选择监测所使用的网卡”标签里,选择自己的物理网卡。如果你是双网卡,则选择“内网的网卡”选项后,单击“保存配置”按钮,即可将其监测网卡配置完毕。
&&& 接下来为了使软件检测到内网里的所有主机,请选择“网络控制台”标签,单击里面“启动网络控制服务”按钮,此时软件会自动扫描网络里的主机,并且将其所检测到的信息,会显示到网络主机的扫描栏内。当显示主机信息完毕后,大家就可以对网络带宽进行限制了,这里选择“网络带宽管理”标签,并且分别勾选上“启用主机公网带宽限制”和“启用发现P2P下载时自动限制该主机带宽功能”的两个复选框(如图2),根据里面所给标签提示,选择想要限制的速度值,单击“保存配置”按钮,这样就可以执行自己设置限制网络带宽,以及限制使用P2P下载用户的带宽值。如图:
[1] &[] &[] &
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&您的浏览器已经禁用了脚本,这可能会影响您正常使用本站的功能。
为了限制无线路由器上大家的上网速度,减少p2p工具的影响
可以通过arp欺骗和iptables来限制局域网的上网速度
操作系统:Ubuntu
1)sudo apt-get install dsniff nmap
2)探测局域网主机的ip地址
sudo nmap -ss 网关ip/24
在此例中:
192.168.1.100 为要...
Linux操作系统早已支持局域网唤醒(WOL),而下一版本的Linux 3.1 Kernel系统内核将会引入无线局域网唤醒,简称WWOL。
和有线版本类似,无线局域网唤醒可以让系统在进入挂起状态(ACPI S3)或者另一种低功耗状态的同时继续保持无线连接处于开启状态,而一旦接到用户的特定操作,或...
收藏Ctrl+D
关注Linux/Unix应用技术、业界新闻,同时也发布开源、移动互联网等新鲜资讯!
—— Powered ——运行在p2p终结者怎么用
p2p终结者怎么用  在和别人一起使用局域网共用ADSL宽带呢?是不是觉得有时会网速好慢,打开一个网页都要好长时间,特别是在玩网络游戏的时候,网速一慢,等网络反映过来游戏人物已经壮烈牺牲了,是不是觉得郁闷呢?  和别人一起共享ADSL宽带的环境下,如果排除了ADSL本身原因及设备原因或接入人数过多原因,造成网速慢的绝大部分原因就是局域网中某用户无节制的使用P2P软件/下载软件(bt软件、电驴、迅雷、快车等)。  P2P软件虽好,但是它也占用了绝大部分的带宽,而局域网中只要有某个用户使用P2P软件,又没有限制下载/上传速度无节制的进行下载的话,那么整个局域网其它用户连接互联网速度就会变成龟速。而某些用户不但不限制下载/上传速度,而且还一天24小时的挂机下载,一副不撑爆誓不罢休的样子,确实让其它人觉得很郁闷。  遇到这类用户该如何办呢?买个带带宽限制的路由器?但是通常这种路由器并不便宜。真人PK?如果真的想找他PK的话,至少得知道局域网中到底是谁在疯狂下载。接下来介绍一款免费的网络管理软件--P2P终结者,简单的找到元凶,如果不想真人PK的话,还可以轻松限制对方的网速,这一切只需要轻点鼠标。  P2P终结者是一款局域网流量管理软件,只需要在局域网中任意一台电脑上安装后就可以可控制整个局域网的流量,还可以限制局域网中任意用户的进行网页浏览及QQ聊天及使用各种下载软件。在之前的版本中,P2P终结者是收费的,从3.X的某个版本开始免费提供给家庭用户使用,最近推出了4.01版本,来看看新版来了那些新功能。  P2P终结者4.0的安装很简单,在安装完毕首次运行P2P终结者的时候会弹出配置向导,这个配置向导中的&网卡设置&可是不能略过的,只有正确设置了接入需要进行控制的局域网的网卡才能正确的对该局域网进行控制。  在&控制设置&中建议勾选启动后自动开启控制网络 及发现新主机自动对其进行控制(防止新接入主机不受控制),为了避免被其它人安装的ARP防火墙探测到你正在使用P2P终结者,可以勾选&启用反ARP防护墙追踪模式&,启用该选项后,对方ARP防火墙将无法发现ARP攻击IP地址,但是依然能够顺利的阻挡P2P终结者的控制。  在&界面设置&中可以对P2P终结者的界面进行换肤及风格设置。  进入主界面,只需要点击&启动控制&按钮,那么局域网内所有主机的接入互联网带宽都尽在掌握中了。谁不守规矩找出来  从&主机列表&中我们可以清楚的看到局域网中每台主机的带宽使用情况。如果有些主机没有显示出来,可以点击&扫描网络&来刷新主机列表。从图7中我们可以看到,IP地址为192.168.1.3机器名为&MYHOME&的主机的下载带宽达到了&216.76KB/S&,几乎霸占了2M ADSL宽带的所有带宽,难怪网速那么慢。找到罪魁祸首了,赶快和对方商量一下,局域网中的秩序也要大家一起来维护的。建立规矩大家来遵守  什么?对方口头上答应了,但是依然继续进行着大流量的下载,别激动,用不着真人PK,也犯不着拔了对方的网线,这些得罪人的方法不用。来限制一下他的网速就可以了。限制网速的操作不用在对方的电脑里进行,直接使用P2P终结者就可以了。  来限制一下对方的网速,但是也无需全时段限制,在凌晨的时候还是可以开放给他全速下载的,这样对大家都好。  首先先得创建一个时间计划,也就是设置在什么时间段运行什么规则。点击&系统设置&时间计划设置&新建&进入时间计划设置,选中想要生效的时间段就可以了。  接着再创建该时间计划对应的控制规则。&系统设置&控制规则设置&新建&进入控制规则设置向导。首先是设置名称及对应的时间计划,这里有个不好的设置就是,一定要先有至少一个&时间计划&,否则就无法建立控制规则。原以为没有选择时间计划时就可以默认为全时间段监控的。  接下来就是设置宽带限制数值,2M ADSL宽带下行速度推荐限制为50KB/S(默认是512KB/S记得更改,否则在2M ADSL宽带中相当于没有限制),当然想把对方限制回拨号上网时的速度也行。  接下来的就是需要限制的P2P软件的选择了,可以看到包含了下载工具、网络视频工具等的使用带宽较多的软件,没啥特别的需求就直接全选吧。  聊天工具也可以进行限制,不想别人聊天,可以直接在这里勾选进行限制。看到了新增的飞信,却没有看到hi,阿里旺旺也不在此列。  限制了下载工具,还能限制一下使用IE直接下载文件的类型,要进行限制的话,exe、zip、rar这三个可是推荐加入的,其它的文件类型任君选择。  P2P终结者还可以进行WWW访问限制(网页浏览限制),可以编辑被控方可以进行浏览或不能进行浏览的网址的白/黑名单,还可以让被控主机无法浏览网页。  acl规则设置可以设定需要控制的协议类型及端口范围。下载速度降下来,正常上网互不影响  编辑好规则后,只需要切换回&系统运行信息&网络主机列表&找到需要控制的主机,点击鼠标右键,在右键菜单中选择&为选中主机制定规则&,然后选择一个需要应用到该主机的规则,就可以用设定的规则在制定的时间段来控制该主机的联网活动了。如果发现对某个主机没有成功的进行限制,一是没有没有勾选在&网络主机列表&里对应的主机,一是没有点击&启动控制&按钮,再者就是对方使用了ARP防火墙。(说起ARP防火墙,特定测试了一下新版P2P终结者能否控制安装使用了ARP防火墙的主机,测试结果依然是控制失败。对于安装了ARP防火墙的主机,新版P2P终结者依然无能为力。)  对某个主机实施了控制后,对方即使 使用迅雷下载时也只能达到最高50KB/S的速度。  这个&控制规则&的概念虽好,但是当用户只是想限制某台主机的带宽时,倒不如旧版的直接在主机列表中设置网速限制来的快捷了、现在要把主机限定在某个网速范围的话,先得创建&控制规则&,而创建&控制规则&又得先有&时间计划&,远不如旧版方便。  当局域网中有新主机添加进来时,可以让P2P终结者自动将控制规则应用到新加入主机中。具体操作&系统设置&高级选项&控制设置&发现新主机自动指派规则&。  P2P终结者有日志功能,用户可根据日志来查看局域网用户所触犯的拦截规则。还有一个&网络带宽图&,以曲线图的形式报告网络流量。  有网友不禁要问,如果局域网中有两个或两个以上的用户都在使用P2P终结者的话,会是什么结果呢?以下的P2P终结者提示信息告诉答案。  接着上边的问题,来到官网,看到了官方网站的解释,以下引号内内容来源于P2P终结者官方网站。&网络管理权限是4.0版本新引入的一个概念,因为在一个网络中如果有多人同时需要运行P2P终结者,那么需要确定出谁具有网络管理权,权限较高的电脑可以执行,而权限较低的电脑需要退出软件。管理权限一共分为5级:最低、较低、中、较高、最高,软件安装完毕默认是最低权限。&而如何提高权限的方法却让笔者大跌眼镜,引号内内容同样来源于P2P终结者官方网站。&P2P终结者为您提供了提升本机网络管理权限方法,在您需要上网搜索时,您可以使用P2P终结者附带的&超级快搜&软件来搜索网页,P2P终结者将会根据您的搜索贡献度来对应提升您的网络管理权限。您使用频率越高,获得的网络管理权限将会越高,此外管理权限是按照日期进行更新,当日期发生变化时,P2P终结者的网络管理权限将会自动恢复到原始最低状态。&  p2p终结者怎么用?使用P2P终结者来管理局域网内带宽虽然简单快捷,但是维护局域网内网络秩序还得靠局域网中的每一位用户,当开启P2P软件进行全速下载时,想想和自己共用一条宽带的其它用户吧。相关阅读:pp助手正版激活失败怎么办皮皮无法连接网络怎么办P2P种子搜索器怎么用&
最新更新栏目
您可能喜欢
大家都在搜用户名:xiong2127
文章数:783
评论数:392
访问量:965387
注册日期:
阅读量:1297
阅读量:3317
阅读量:436748
阅读量:1123862
51CTO推荐博文
原文:NATBLASTER:Establishing TCP Connections Between Hosts Behind NATs来源:
&&&&&&&&&&&&&& NATBLASTER:Establishing TCP Connections Between Hosts Behind NATs*
&&&&&&&&&&&&&&&& Andrew Biggadike, Daniel Ferullo, Geoff Wilson, Adrian Perrig&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Information Networking Institute&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Carnegie Mellon University&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Pittsburgh, PA 15213, USA&&&&&&&&&&&&&&&&&&&&& {biggadike, ferullo, ggw,
&&&&&&&&&&&&&&&&&&&&&&& NAT爆破者:在不同NAT后的主机间建立TCP连接
&&&&&&&&&&&&&&&&&&&&&&&& 译(初稿): &&&&&&&&&&&&&&&&&&&&&&&& 增译并修改(初稿):weljin &&&&&&&& 译文来源:&&&&&&&& 修改:
摘要&&& 防火墙和网络地址转换(NAT)设备正变得越来越流行了,同时他们也对使用点对点协议建立连接造成一个非常大的问题。合适地限制时,这些中间件设备将抑制来自外部本地网络到内部网络的TCP请求。这篇文章的目的是提出一个能够在两个NAT设备内部的主机间建立直接的TCP连接的方法,同时又尽量不依赖于第三方主机。我们已经在两个普通的硬件条件下实现了这个功能。我们能够为两个不同典型的NAT后面的主机建立TCP连接。一旦建立了这个连接,应用程序就可以跟原来的TCP一样调用这个连接,而不需要任何其他的帮助。
分类及题目描述&&& D.4.4[操作系统]:信息管理――网络通信;C.2.5 [计算机通信网络]:本地和大区域网络――英特网;C.2.2[计算机通信网络]:网络协议――协议构建
综合术语&&& 算法,设计,可靠性
关键字&&& TCP连通性,网络地址转换,点对点穿透NAT,状态防火墙,一致转换,未请求过滤,松散源路由,打洞
1. 前言&&& NAT技术的出现从某种意义上解决了IPv4的32位地址不足的问题,它同时也对外隐藏了其内部网络的结构。NAT设备(NAT,一般也被称为中间件)把内部网络跟外部网络隔离开来,并且可以让内部的主机可以使用一个独立的IP地址,并且可以为每个连接动态地翻译这些地址。此外,当内部主机跟外部主机通信时,NAT设备必须为它分配一个唯一的端口号并连接到同样的地址和端口(目标主机)。NAT的另一个特性是它只允许从内部发起的连接的请求,它拒绝了所有不是由内部发起的来到外部的连接,因为它根本不知道要把这个连接转发给内部的哪台主机。&&& P2P网络已经日益流行。尽管p2p文件共享软件引发了很多争夺站,比如Nepster和KaZaA之间,但是还是有很多有用的并且合法的P2P软件存在着,比如即时消息共享和文件共享。另一个P2P程序是一个叫OpenHash的项目,它为公众提供了一个可用的分布式的哈希表,很多应用程序都在它的基础上开发了出来,比如很多的即时通信软件和可靠的CD标签库。&&& 不幸的是,两个处于不同NAT后面的主机无法建立TCP连接,因为各自的NAT都只允许外出的连接。NAT销售商在已经为NAT设备开发了端口映射的功能来解决这个问题。NAT管理员可以使用端口映射来为那些需要接受那些不是从内部发起的连接请求的主机指定端口。但是这种解决方法根据情况还需要很多其他的支持。当有的服务器需要动态的分配端口的时候,这种方法就很受限了。再说了,如果一般的用户没有权限或者不懂得如何进入NAT设备为他们指定端口映射,那这种方法就一点用处也没有了。&&& P2P协议对此已经阐述了少数通用的方法。第一个可被p2p协议使用的技术是:那些本来不能当作服务器的程序收到了来自请求者的消息后主动向请求者发起连接。这种情况只适用于只有一方在NAT后面的情况。第二种通用的方法是通过两个主机都可以连接得到的代理路由数据,但是这种方法对于两个NAT后面的主机来说效率太低了,因为所有的数据都必须经过代理。其他相关的技术将在第三部分讨论。&&& 我们努力的目标是找出一个可以让NAT后面的两个主机直接建立TCP连接的解决方案。特别地,我们已经开发出几种方案可以用于那些支持端口分配地NAT和那些支持LSR路由的网络。我们的方法是通过第三方提供建立直接连接需要的信息。根据不同的环境,我们开发了几种不同的方案可以在可以预测和适当的时间的情况下建立连接。这些技巧都需要把数据包的TTL值设置得很小,并且捕捉和分析外传的数据包以提供信息给第三方“媒人”。并且人为地向网络发送一些数据包用来检测NAT所分配地端口。补充一点,如果端口分配是随机地,我们就使用一种叫“birthday paradox”的方法减少检测的次数。这种方法需要的空间是直接的穷举所使用的空间的开方。
2. NAT的类型&&& NAT必须考虑路由器的三个重要的特性:透明的地址分配、透明路由、ICMP包负载解析。&&& 地址分配是指在一个网络会话开始的时候为内部不可以路由的地址建立一个到可路由地址的映射。NAT必须为原地址和目标地址都进行这样的地址分配。NAT的地址分配有静态的和动态的方式。静态的地址分配必须预先在NAT中定义好,就比如每个会话都指派一对&内部地址,外部端口&映射到某对&外部地址,外部端口&。相反地,动态的映射在每次会话的时候才定义的,它并不保证以后的每次会话都使用相同的映射。&&& 一个相似的特性,NAT必须实现的是透明路由。正如上面提到的,NAT是一种特殊的路由,它在它所路由的数据包中翻译地址。这种转换基于数据流来改变相应的IP地址和端口。其次,这种转换必须是设备透明的,这样才保证对现有网络的兼容性。一个不是很明显的要求是,NAT必须保证内部网络的数据包不被发送到外部网络去。&&& 最后一个NAT必须实现的特性是当收到ICMP错误包的时候,NAT使用正常的数据包做出同样的转换。当在网络中发生错误时,比如当TTL过期了,一般地,发送人会收到一个ICMP错误包。ICMP错误包还包含了尝试错误的数据包,这样发送者就可以断定是哪个数据包发生了错误。如果这些错误是从NAT外部产生地,在数据包头部的地址将会被NAT分配的外部地址所代替,而不是内部地址。因此,NAT还是有必要跟对ICMP错误一样,对在ICMP错误包中包含的数据包进行一个反向的转换。&&& 虽然所有的NAT都实现了这三个特性,但是根据他们的特点和他们所支持的网络环境,他们还可以进入分类。NAT可以分为四种:Two-way NATs,Twice NATs,Multi-homed NATs和Traditional NATs。关于Two-way NATs,Twice NATs和Multi-homed NATs的特性讨论请看[12]。Two-way NATs,一般也叫双向NAT(Bidirectional NATs),在外部地址和内部地址间执行双向转换,尽管它个数据包只转换一个IP地址。这种NAT是唯一一种允许从外部发起的连接请求。相反地,Twice NATs,它每路由一个数据包都对内部和外部的地址进行转换。这种NAT用在那些外部地址和内部地址交叠的情况下。Multi-homed NATs对于Twice NATs来说,多了一个功能,它可以允许在内部使用不能路由的地址并且还可以有多个连接到外部网络。之所以Multi-homed NATs能够这样做,是因为它跟另一个保持通信以确定他们的地址映射是不变的。Multi-homed NATs允许大量的内部网络和增加冗余来允许多个连接到Internet。到目前为止,最常用的NAT是传统NAT(Traditional NATs),它可以分为基础NAT(Basic NATs)和NATP(Network Address Port Translation)两种。&&& 基本NAT和NATP的区别它所能分配给内部地址的外部地址是否比内部地址多。一个Simple NAT用在那种所能分配的外部地址跟内部地址的数量相等或者更多的时候。这种NAT进行端口分配,因为每个内部地址都可以分配到一个唯一的外部地址。NATPS用于当NAT所能用来分配的外部地址的数量比内部地址少的时候,最常见的一种情况是很多的内部机器共享一个外部IP地址。在这种情况下,NAT必须分配端口来补充IP用以消除网络传输的不明确的几率。NAT和NATP共同的地方就是他们都阻止外来的连接,并且都可以进行静态和动态的地址分配。&&& NAPT是传统NAT中最普遍的一种,因为它允许很多的内部连接共享很少量的外部网络地址。大部分为小型网络设计的商业NAT都是NAPT。我们选择NATP作为我们研究的对象就是因为它的流行和它通过不允许外来连接限制了P2P协议。后面我们就把NATPs简称为NATs了。&&& 我们首先要做的是得到商业防火墙以确定他们的特性跟资料上记载的是否一样。我们使用NatCheck这个程序对三个常用的NAT设备进行了测试:Netgear MR814,Linksys BEFSR41,和Linksys BEFW11S4。三个NAT都有相似的行为:他们对UDP和TCP都进行了一致的转换,这表明在内部主机使用&内部IP:内部端口&的时候,NAT是否直接将&内部IP:内部端口&映射到&外部地址:外部端口&,而不管它连接出去的目标主机&目标IP:目标端口&是多少。一致转换是静态NAT与动态NAT截然不同的一个特点,因为这不只是跟内部主机使用的地址有关,而且还跟端口有关。RFC3002明确指出要支持一致转换。没有一个NAT支持环路转换,不管是TCP还是UDP,这表明NAT是否可以正确的处理两个只知道对方外部地址的内部主机之间的连接。在我们的项目中,我们假设两个主机是在不同的NAT后面的,所以这个测试跟我们的目标是无关的。最后,所有的NAT都提供了对非主动请求的外来TCP和UDP包都进行过滤,这个测试可以表明NAT是否预防非主动恳求的外来包进入到内部网络。非主动请求过滤发生在除了Two-way NAT之外的所有NAT中,这也是在不同NAT后面的主机建立P2P连接最主要的障碍了。
3. 相关研究工作&&& 三个来自科内尔的作者独立于我们做了关于穿过NAT的TCP直接连接工作并且结果和我们的类似。他们的被称为NUTSS[4]的框架为不同的NAT后的主机的UDP和TCP连接性作了准备,但是他们的TCP技术有一个重大的缺点。协议依靠于为了能够TCP连接的欺骗包,这包在真实的网络作了限制。许多ISP作了进入过滤以防止欺骗包进入他们的网络,这将导致作者的协议失败。欺骗不能是真实连接主机的组成部分。为了他们所信任的,作者提出了一个不依靠于欺骗的方案。然而,这技术依靠于平台相关的TCP堆栈行为。我们在这里所描述的技术在相当于NUTSS[4]环境中为连接性做真实的假设时避免了欺骗。&&& 为了解决NAT给很多协议带来的困难,一种MIDCOM的架构被提了出来[13]。MIDCOM是一种可以允许NAT或者防火墙后面的用户根据需要改变NAT行为的而允许连接的一种协议。这个系统虽然在某些情况下是适用的,当它却不能保证每个时候都可以。在那些用户没有办法控制NAT的情况下,这种方法对于P2P的连接还是行不通的。&&& 很多时候NAT或者防火墙后面的用户通过代理服务器进行连接。一种商业的代理解决方法是Hopster[6]提供的,Hopsetr的代理在连接方本地以隧道级别的传输在本地运行,它通过HTTPS(端口443)连接到Hopster自己的机器。但是,因为Hopster的代理需要所有的传输都经过他们的机器,所有他们的方法跟我们的比起来就显得低效了,具体见第5部分。&&& 为了能够进行直接的P2P连接,出现了针对UDP的解决方法。UDP打洞技术[5]允许在有限的范围内建立连接。STUN(The Simple Traversal of User Datagram Protocol through Network Address Translators)协议实现了一种打洞技术可以在有限的情况下允许对NAT行为进行自动检测然后建立UDP连接[10]。&&& 在UDP打洞技术中,NAT分配的外部端口被发送给协助直接连接的第三方。在NAT后面的双方都向对方的外部端口发送一个UDP包,这样就在NAT上面创建了端口映射,双方就此可以建立连接。一旦连接建立,就可以进行直接的UDP通信了。在UDP打洞技术可以成功的情况下,我们在这篇文章中所用的有的技术也同样适用。建立TCP连接比UDP连接更有优势。首先,UDP连接不能够依赖建立好的连接,就是不能够持久连接。UDP是无连接的并且没有对明确的通信。一般地,NAT见了的端口映射如果一段时间不活动后就是过期。为了保持UDP端口映射,必须每隔一段时间就发送UDP包,就算没有数据的时候,只有这样才能保持UDP通信正常。第二,很多防火墙都配置成拒绝任何的外来UDP连接。最后,一个单纯的TCP连接的实现更直观,并且现有的代码简单得修改就可以使用我们的技术。&&& 目前的工作由bryan Ford[2]完成,已经扩展了打洞技术,使能在正规的NAT后的不同主机间进行TCP连接。方法类似于UDP打洞,由于一个映射在各个主机的NAT上被建立以使TCP直接连接能被创建,同步或同时TCP打开。这工作的焦点在于开发一种工作于最多的被定义为其它NAT所需要而描述的NAT的技术来和TCP打洞协调一致。我们工作的不同点在于我们所开发的方案能够在目前各类NAT行为上进行直接地TCP连接,包括不协调于TCP打洞的NAT。&&& Gnutella有一个能使在两个不同端点的TCP通信的方案[14],但这仅仅应用于一个端点在NAT后面的情形。这方案被称为Push Proxy并本质地建立多个能够推连接请求到NAT后的服务器的节点。NAT后的服务器发送消息到端点询问他们是否愿意推为代理。当NAT后的服务器指明它有一个文件和询问匹配,服务器包含了一列同意被推为代理的端点。当端点想下载文件,它发送一个Gnutella PUSH消息到一个push proxy,这代理允许消息通过到达NAT后的服务器。NAT后的服务器就打开一个连接到这个发送PUSH消息的端点,所以文件可以被传送。这方法使其更容易建立连接,这仅仅处理了一个端点在NAT之后的情况。我们的方案解决的是当两个端点都在NAT之后的更困难问题。&&& Walfish[15]指出,采用间接的服务可以提供NAT或者防火墙后面主机之间的连通性,通过在两主机向间接服务器打开一个连接,并且服务器在他们之间传输所有的通信,在这篇文章中我们会完成一个不需要这样的间接服务器也能建立起这样得连接。
4. 问题陈述和假设&&& 假设两个主机在不同的NAT后面,并且都知道对方的IP地址。如果这些主机想直接发起TCP连接,那肯定失败。在直接的TCP连接中,必须有一方是发起者(创建初始的SYN包),另一方必须监听。在两个都在NAT后面的情况下,监听者将不可能收到SYN包,因为SYN包在到达NAT的时候就被丢弃了。这是因为NAT或者防火墙不允许来自英特网的未请自来的数据包进入他们的网络内部。所以,为了在不同NAT后面的主机之间建立直接的连接,必须让NAT以为这个连接是经过内部主机发起的。我们可以通过让两边的主机都发起一个TCP连接,也就是创建一个SYN包,这样两边的NAT都会以为这个连接是从内部发起的,是经过内部请求的,因此,就可以允许后续的数据经过它的网络了。注意,虽然两个端点都发送SYN包,但我们没有使用TCP的同时打开。
&&& A的内部网络&&&&&&&&&&&&&&&& B的内部网络 ┌────────┐&&&&&& ┌────────┐│&&&& 主机A&&&&& │&&&&&& │&&&& 主机B&&&&& ││192.168.2.2:400 |&&&&&&& │192.168.2.2:500 |└────────┘&&&&&& └────────┘&&&&&&&& ↑↑&&&&&&&&&&&&&&&& ↑↑&&&&&&&& ↓ \&&&&&&&&&&&&&&&& / ↓┌────────┐&&&&&& ┌────────┐│&&& NAT NA&&&&& │&&&&&& │&&& NAT NB&&&&& ││128.2.4.1:4000& |&&&&&&& │151.3.43.1:5000 |└────────┘&&&&&& └────────┘&&&&&&&& ↑&&&&&&& \_____/&&&&& ↑&&&&&&&&& \&&&&&&&& 目标&&&&&&& /&&&&&&&&& ↓&&&&&&&&&&&&&&&&&& ↓&&&&&&&&& ┌──────────┐&&&&&&&&& │&&&&& 第三方X&&&&&& │&&&&&&&&& │& 66.4.2.23:8000&&& |&&&&&&&&& └──────────┘&&&&&&&&&&&&&&&&&& 英特网&&&&&&&&& 图1:我们所开发的技术环境&&& 为了在两个端点间成功地建立一个TCP连接,每个端点必须知道它的伙伴在初始连接前的外部表面端口号。一旦一个从NAT的内部网络请求被路由到外部网络的一个IP地址的包到达时,这些端口将被NAT所选择。就像记帐一样,NAT用所选的外部端口号绑定到内部的IP地址和端口号。我们把这绑定称为映射。NAT不会向任何主机共享这个映射。我们的技术展示了为何NAT映射可以被高效地确定。一旦两个端点都知道他们伙伴的外部表面端口号,TCP连接就被两个端点初始化。TCP序列号和应答号是TCP连接同步的完整组成部分。序列号不能够指定,只能捕捉它。我们的文章将会说明怎么协议管理这些参数以成功地在任何的环境下建立一个TCP连接。&&& 在不同的位于NAT后的主机间建立直接的TCP连接是一个难题,因为NAT选择外部端口不是NAT后的主机能直接理解到的,并且因为成功的TCP连接需要序列号和应答号的协调。没有工作于所有情况的单一方案。NAT的行为依靠于它的实现,并且预测端口的能力依靠于内部网络活动的数量。&&& 我们所做的两个假设在我们测试过的NAT中都是成立的。第一个假设是我们假设主机都收不到来自外部网络的ICMP TTL过期包。如果这些包被主机接收,那么TCP连接就会被中断。我们的很多解决方法中都依赖于能够为发送SYN的数据包设置一个很低的TTL值。当SYN包被路由丢弃的时候,TCMP TTL过期包会被发送回NAT。用于我们实现的NAT必须没有转发收到的ICMP TTL过期包给内部网络。如果NAT真的把这个包发送回内部网络,也可以配置防火墙来阻止这类包。我们的另一个假设是NAT看到ICMP TTL过期包的时候映射的端口还不会失效。作为另一个选择,我们可以不修改TTL值,那就必须让目标NAT不会产生TCP RST包。而实际上这个选择是可行的,因为很多的NAT为了防止端口扫描一般都不发送TCP RST包。
5. 技术& 使用图1的模型,我们的目标是让在NA和NB后面的A和B建立直接的TCP连接。& 我们已经开发出几种方法可以建立这样的连接,根据NAT和网络情况的不同,我们有对应的方法。考虑以下的信息作为有序的三元组:&NA端口可预测性,NB端口可预测性,源地址可路由&。我们考虑下面几种情况:情况 1: &可预测的, 可预测的, LSR&情况 2: &可预测的, 可预测的, no LSR&情况 3: &随机的, 可预测的, LSR&情况 4: &随机的, 可预测的, no LSR&情况 5: &随机的, 随机的, LSR&情况 6: &随机的, 随机的, no LSR&
//------第一次修改,以后修改将加入测试代码,以下内容由weljin翻译,更新将放在或,转载请保持来源的完整性------////------Translated by weljin.QQ:.MSN:.G-mail:weljin..E-mail:.Q-mail:.------//注意:&随机的, 可预测的,X&等同于&可预测的, 随机的,X&。
5.1 连接前诊断&&& 作为协助者X还有两个端点A和的B,为了确定A和B将试图的连接属于下面的哪种情况,X必须首先对各个端点做一些诊断。&&& 为了使用1,3,5的情况,两端必须确定在A和X还有B和X之间的LSR(松散源路由)是否是可用的。loose source routing(LSR)是一个允许IP包的创建者指定一列在数据包的路由中使用的托管IP地址的IP选项。这个选项的结果是在路由表里的各个IP地址将按照路由表里指定的顺序收到数据包。LSR选项引来了一个安全性风险,这是因为一个攻击者能监听到在路由表里的会话。由于这一潜在的危险,许多路由器直接抛弃包含LSR选项的数据包。&&& 为了确定从A穿过X到B时LSR是否可用,A可以简单的尝试用松散源路由穿过X连接到B,如果X收到这个包,这时LSR在A到B的第一半到X的行途是可用的。如果在一段指定的超时后X还没收到任何包,这时可以假定LSR不可用。由于X可以用这种方法得知从A到B的一半行途是否允许LSR可用,所以它必须检查也能收到从B来的LSR包。如果也能收到,则X可以断定从A到B穿过X的LSR是可用的,任何的其它情况都必须假定LSR是无此选项。&&& 为了确定是否NA可以随机或者可预测地分配端口,A可以用连续的端口打开两个到X的TCP连接。如果X得到的这些连接端口是连续的,则X可以断定NA连续地分配了端口,同时是可预测的。当连接到B时,A必须使用连续的下一个端口来确保NA继续按照X能预测的方式来分配端口。&&& 如果NA没有连续地分配端口,但如果NA执行了一致地转换,这时仍然可以预测到A的端口。A必须先打开一个在内端口PA到X的合法连接。NA将分配给这个连接一个随机端口。当包被发到X时,X可以非常清楚地看到NA所选择的端口。A可以在相同端口打开第二个到X的不同端口的连接,这时X可以看到这两个连接是否包含了相同的外部端口。如果是,则NA进行了一致性转换。由于现在A必须用内部端口PA连接到B,所以X可以把NA所选的外部端口告诉B。把A到X的连接维持到A被连接到B以使NA不会改变端口映射是很重要的。&&& 如果尝试了两种端口预测方法后,X不能可靠地预测NA分配的端口,这时X必须假定NA是随机的分配端口。&&& 当X完成对A的诊断,它可以同时用相同的方法对B进行诊断。一旦X拥有了所需的信息,连接协议就可以开始了。从这个诊断收集信息确保了详细情况的执行。
5.2 序列号和应答号的协调&&& 每个参与TCP连接者都维持两个变量,一个序列号和一个应答号。在任何给定时刻,在任何主机的序列号是最后包发送的序列号。另外,在任何给定时刻,在任何主机的应答号是下一个预期包的应答号。通过三次握手的分步,初始的序列号和应答号被建立,如下:&&& 1.在客户端发送SYN包后,&&&&& 客户端的 seq#(序列号):P,ack#(应答号):N/A&&&&& 服务端的 seq#(序列号):N/A,ack#(应答号):N/A
&&& 2.在服务端接收到SYN包和发送SYN+ACK后,&&&&& 客户端的 seq#(序列号):P,ack#(应答号):N/A&&&&& 服务端的 seq#(序列号):Q,ack#(应答号):P+1
&&& 3.在客户端接收到SYN+ACK和发送ACK后,&&&&& 客户端的 seq#(序列号):P,ack#(应答号):Q+1&&&&& 服务端的 seq#(序列号):Q,ack#(应答号):P+1
&&& 4.在服务端接收到ACK后,&&&&& 客户端的 seq#(序列号):P,ack#(应答号):Q+1&&&&& 服务端的 seq#(序列号):Q,ack#(应答号):P+1
&&& 在三次握手最后的状态必须被我们的方案所复制到,即使两个端点假定为客户的角色。在每个方案的最后,各个端点的应答号必须是大于他们的伙伴的序列号。我们的方案完成这个协调。
5.3 低的TTL值确保&&& 我们的方案某些是依赖于设置一个TCP包的TTL值,因此包将离开端点的内部网络,但没到达伙伴的NAT。对不同的网络这个值将不同,因此它必须能被动态确定。&&& 为了确定伙伴距离有多远,一个端点可以使用典型的路由追踪方法。就是,发送从1开始而不断增加的TTL值的SYN包。当TTL失效时各个包将导致ICMP TTL过期包被发回到端点。通过分析返回的ICMP TTL过期包可以为连接中低的TTL值确定一个保险值。&&& 许多NAT不将ICMP TTL过期包发回内部主机,所以一个端点可以议定当一个ICMP TTL过期包没有被返回时,用一个TTL值来引发一个包离开内部网。&&& 同样地,在NAT返回ICMP TTL过期包,通过分析伙伴的NAT的消息,端点必须以发现的保险的TTL值为基础。如果伙伴的NAT产生一个RST包,则端点可以使用一个比所产生的RST包小1的TTL值。如果端点没有得到RST包但开始停止接收ICMP TTL过期包,则可以确定伙伴的NAT用了抛弃不请自来的消息而没有响应的保险行为。事实上,这种情况和端点的NAT没有返回ICMP TTL过期包是一样的。&&& 这个保险TTL值的确定不需要任何其它端点的参与。因此,它可以在保险低的TTL值被用于连接之前就被确定。
5.4 情况1:&可预测的,可预测的,LSR&A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------1a-----&|&------1b------||&------2a------|-------2b-----&||-------2b------|--------------&||&--------------|-------3a------||-------4a-----&|&------4b------|&&&& 图2:情况1&&& 我们使用符号“NA:4000→NB:5000,选项/负荷”来表示在英特网上从NA到NB所传送的包内容。这符号意味着包有一个NA的IP源地址,源端口4000,目的地址NB的IP地址,和目的端口5000。此外,在目的端口后是其它的任何重要选项或负荷值。选项包含LSR:X、SYN:P、ACK:Q和SYN+ACK:R,S。LSR:X表明包将可松散源路由到X。SYN:P,ACK:Q表明跟随的序列号或者应答号的TCP包的类型。SYN+ACK:P,Q+1表明包是一个序列号为P和应答号为Q+1的TCP SYN+ACK包。首先我们展示情况1&可预测的,可预测的,LSR&,其中所使用的事件序号在图2中能找得到。&&& 1.A和B个发送一个可松散源路由的SYN包穿过协助者X到对方&&&&& (a)NA:4000→NB:5000,LSR:X,SYN:P&&&&& (b)NB:5000→NA:4000,LSR:X,SYN:Q&&&&& 这两个SYN包由TCP的connect()函数调用产生。SYN在NAT NA和NB上都创建了预期的映射。在NA上的映射将允许后面被转播向A而来自NB:5000的通信并签准。&&& 2.X缓存两个包并向A和B各自发了对方所用的ISN&&&&& (a)X:1234→NA:3999,B刚用的ISN Q&&&&& (b)X:1235→NB:4999,A刚用的ISN P&&&&& 各个端点都需要他们的伙伴的ISN,这样他们才能构造出一个合法的SYN+ACK包。&&& 3.A和B各向对方发送一个SYN+ACK包&&&&& (a)NB:5000→NA:4000,LSR:X,SYN+ACK:Q,P+1&&&&& (b)NA:4000→NB:5000,LSR:X,SYN+ACK:P,Q+1&&&&& 这两个SYN+ACK包是由运行于各个端点的独立线程所产生的。A和B重新使用了原来的序列号P和Q作为在SYN+ACK中的序列号,并保证了所复制的序列号和应答号的最后状态和5.2节讨论的真实的TCP连接一样。&&& 4.A和B各向对方发送一个ACK包&&&&& (a)NA:4000→NB:5000,LSR:X,ACK:Q+1&&&&& (b)NB:5000→NA:4000,LSR:X,ACK:P+1&&&&& 一旦欺骗的SYN+ACK包被接收到,TCP堆栈将自动地为我们做这一步。&&& 5.X抛弃两个到达的ACK包,因为没有任何一个端点期望接收到这个ACK。
&&& 图2假定了A和B知道他们的伙伴将使用哪个端口来工作;由于各个端点和它的伙伴都必须提前知道对方的信息,所以这一假设是合理的。首先第一步,X必须完成对A和B的端口预测,因此X能预测到NAT设备选择的端口。A必须知道NB工作于5000端口,同时B必须知道NA工作于4000端口。为简单化,可以假定X自己没有在NAT后面,但唯一的假定前提是X必须预先直接连接到A和B。&&& 情况1存在一种变种的方案。X可以发送在第2和第3步所需的SYN+ACK欺骗包,这似乎好于发送信息到A和B以使他们自己能够伪造SYN+ACK包。我们选择目前的方法是因为如果X发送SYN+ACK欺骗包,他们将被路由器抛弃的总比通过的多。此外,发送从X到A和B的SYN+ACK伪造包需要超级用户权限。而A和B为了其它的目的必须且已经运行于超级用户权限。&&& 在我们的技术中,从步骤2到5是这样考虑的,我们将申明函数Case1(integer extPortA, integer extPortB)作为执行步骤2到5,把参数extPortA和extPortB各自取代外部端口。
5.5 情况2:&可预测的,可预测的,no LSR&A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------2a-----&|&------2b------||-------3a-----&|&------3b------||&------4a------|-------4b-----&||-------5b------|--------------&||&--------------|-------5a------||-------6a-----&|&------6b------|&&&& 图3:情况2&&& 情况1依靠于可用的松散源路由。许多路由器目前设置了预防松散源路由,同时将具有代表性地抛弃请求服务的包。同样地,依靠于松散源路由的技术在实际中将有很高的概率会失败。如果松散源路由不可利用,SYN序列号可以利用一个外出通道(他们预先连接到X的连接)和X通信,而不是物理性地让X看到包。注意图2的步骤2,X知道TCP序列号P和Q,因为X正确地接收到两个SYN包。没了LSR就不是这种情况了。&&& 为了初始连接,每端主机发送一个初始的SYN包到他们的伙伴,虽然他们知道将不能到达目的地。他们这时嗅探包离开网络,记录序列号,并报告这个信息给X。X需要这些包的TCP序列号,如此它将能够转播这些信息回到A和B,那样他们就能够产生SYN+ACK包。两条路线所发的包都不会到达他们所标明地址的目的地。&&& 更简单的方案是每个端点各发送一个不被考虑的SYN到他们伙伴。在接收端适当的设置NAT和防火墙,他们将由于没有映射存在而不会向前发送这些包到内部网络主机。一些NAT和一些防火墙将发送TCP重置包(RST)到这个不请自来的包的源地址。如果NAT产生RST包,A和B不能简单的像图2里步骤1的建议一样发送一个SYN包到对方,因为在接受到RST,NA和NB将终止所建立的洞。如果NAT没有产生RST包,打开的TCP连接将不会突然终止。&&& 另一种确保SYN包将不会到达它的目的网络的方法是发送带有低于伙伴的NAT路径长度的TTL值的SYN包。这包将会在去目的地的路上被明确地抛弃,并且TCP RST包将不会被任何发送者看到。更确切地说,一个ICMP过期包将被看到,并且产生一个问题,因为ICMP过期包突然地终止一个TCP连接。然而,如果使用者能够设置他们本地的防火墙抛弃ICMP包或者如果NAT不会发送ICMP消息包到它的内部网络,TCP连接的尝试将不会突然终止。&&& 一个方案不能包括简单的欺骗源地址的SYN包,使发送者不会接收到ICMP包或者RST包。这样做会在中间件创建一个残废的映射。中间件在看到一个SYN包时,将创建一个从内部IP地址和端口到外部IP和端口的映射。然而,由于一个欺骗的SYN包有一个错误的源IP地址,映射将不会对应到内部网络的主机。此外,一个方案不能包括把TTL设置低到连中间件都看不到SYN包,因为这样做不会创建我们需要的允许外部后面发到内网的通信的映射。&&& 假定一个&可预测的,可预测的,no LSR&环境,这种连接就像我们现在在图3所描述的。&&& 1.X做了关于5.1节描述的端口预测。X预测到NA的下一端口是4000并预测到NB的下一端口是5000,并经由已经存在的连接告知A和B。&&& 2.A和B各自发送一个SYN包到对方,他们知道这个包将会被对方的NAT抛弃或者由于TTL过期而被抛弃。&&&&& (a)NA:4000→NB:5000,SYN:P&&&&& (b)NB:5000→NA:4000,SYN:Q&&&&& 这一点是在各个端点的真实TCP的connect()函数调用所产生的。SYN包由TCP堆栈产生。这在NAT上创建了允许后面的来自伙伴IP地址和端口的通信通过并到达端点的映射。&&& 3.A和B各自发送他们自己所留意的ISN(P和Q)到X。&&&&& (a)NA:3999→X:1234,刚使用的ISN号P&&&&& (b)NB:4999→X:1235,刚使用的ISN号Q&&&&& 各个端点都需要它的伙伴的ISN,如此他们才能够构造合法的SYN+ACK包从而发到他们的伙伴。&&& 4.X发送A和B的对方各自所留意的ISN到A和B&&&&& (a)X:1234→NA:3999,B刚使用的ISN号Q&&&&& (b)X:1235→NB:4999,A刚使用的ISN号P&&& 5.A和B各自发送一个SYN+ACK包到对方&&&&& (a)NB:5000→NA:4000,SYN+ACK:Q,P+1&&&&& (b)NA:4000→NB:5000,SYN+ACK:P,Q+1&&&&& 这是三次握手的第二部分。此外,A和B重用了他们原来的序列号P和Q作为在SYN+ACK中的序列号,并保证了所复制的序列号和应答号的最后状态和5.2节讨论的真实的TCP连接一样。&&& 6.A和B各自发送一个ACK包到对方,他们知道这包将会被对方的NAT抛弃或者由于TTL过期而被抛弃。&&&&& (a)NA:4000→NB:5000,ACK:Q+1&&&&& (b)NB:5000→NA:4000,ACK:P+1&&&&& TCP堆栈将自动地为我们发送这些ACK包来完成三次握手。我们不想ACK包到达他们的目的地,由于没有任何一方在等待ACK包。
&&& 作为步骤4到5而和情况1很相似的另一种方法,是X可以欺骗A和B所需的SYN+ACK包。然而,我们为了某些类似在情况1中的原因选择了目前的方法。&&& 由于步骤2到6在我们的技术中是可重复利用的,所以我们做了函数Case2(integer extPortA, integer extPortB)作为执行步骤2到6,用参数extPortA和extPortB分别替代了外部端口。
5.6 情况3:&随机的,可预测的,LSR&A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------2a-----&|&&&&&&&&&&&&&& ||&&&&&&&&&&&&&& |-------2b-----&||&&&&&&&&&&&&&& |&------2c------||&&&&&&&&& Case1|(m,5000)&&&&&& |&&&& 图4:情况3&&& 情况3&随机的,可预测的,LSR&类似于图2所描述的情况1。然而,X不能够预测到两个NAT中的一个的端口,比方说NA。A首先不得不发送它的SYN包来允许X查看NA所选的端口。X将报告这一信息给B,因此B能够发送它的SYN包到正确的目标IP地址和端口。这个情况1的修改版在图4中描述并解释如下。&&& 1.X做了关于5.1节描述的端口预测。X不能预测到NA的下一端口,但能够预测到NB的下一端口是5000,并经由已经存在的连接告知A和B。&&& 2.A和B同步经由X&&&&& (a)NA:m→NB:5000,LSR:X,SYN:P&&&&& (b)X让B知道NA工作于端口m&&&&& (c)NB:5000→NA:m,LSR:X,SYN:Q&&&&& 这两个SYN包是由TCP的connect()函数调用所产生。&&&&& 这两个SYN在NAT的NA和NB上各自创建了预期的映射。&&& 3.调用Case1(m,5000)
5.7 情况4:&随机的,可预测的,no LSR&A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------2a-----&|&&&&&&&&&&&&&& ||--------------&|&&&&&&&&&&&&&& ||--------------&|&&&&&&&&&&&&&& ||┆&&&&&&&&&&&& |&&&&&&&&&&&&&& ||--------------&|-------3------&||&--------------|-------4-------||&--------------|---------------||&--------------|---------------||&&&&&&&&&&&&&& |┆&&&&&&&&&&&& ||&--------------|---------------||-------5------&|&&&&&&&&&&&&&& ||&&&&&&&&&&&&&& |-------6------&||&&&&&&&&& Case2|(m,5000)&&&&&& |&&&& 图5:情况4&&& 情况4的环境是&随机的,可预测的,no LSR&。我们已经为这个依靠于随机的且不拒绝一个带了残废的且对应于在NAT后主机在前面的初始连接的ACK或者校验和域的TCP包的NAT环境开发了一个方案。这方案被呈现在图5中并解释如下。&&& 1.X做了关于5.1节描述的端口预测。X不能预测到NA的下一端口,但能预测到NB的下一端口是5000,并经由已经存在的连接告知A和B。&&& 2.A发送T个SYN包到B,这些包不是被对方的NAT所抛弃就是由于TTL过期而被抛弃。&&&&& i = 0&&&&& While i & T&&&&&&&&& NA:rand →NB:5000, SYN:anything&&&&&&&&& i = i+1&&&&& End While&&&&& 这会在NAT NA上创建T个映射,B将最后用SYN+ACK猜到的就是其中一个。&&& 3.X通知B开始发送SYN+ACK包到NA&&& 4.B发送许多SYN+ACK包到NA直到有一个到达A&&&&& i = 1024&&&&& While A 还没报告成功&&&&&&&&& NB:5000 →NA:i,&&&&&&&&& SYN+ACK:,anything,anything, Payload:i&&&&&&&&& i = i+1&&&&& End While&&& 5.A报告穿过NAT的包负荷。&&&&& NA:3999→X:1234,工作于端口m&&&&& A通过监听来自NB的任何SYN+ACK包的数据报,将可看到这个残废的SYN+ACK包。&&& 6.X告诉B连接到A的端口m&&&&& B现在知道SYN包可以发向哪里。&&& 7.调用Case2(m,5000)
&&& 在步骤2中A所发送的T个SYN包是独立于任何TCP的connect()函数调用。他们仅仅是使用在NAT上创建了T个映射的libnet库所产生的包。另一方面,Case2调用的步骤2所产生的SYN包是由A和B的TCP的connect()函数调用所产生的。这情况4环境的方案依靠于随机生成端口的NAT的行为。这方案依靠于拒绝带有错误的如序列号或者校验和域的TCP包的中间件。&&& T值能够被选择,像B在生成T个SYN+ACK到随机目的端口号后有95%的机会猜到一个正确的外部端口。其实,A的NAT随机地选择T的数目(它的外部端口数),这时B必须一直维持猜测直到在A的NAT可选集中B选择到了一个。我们能够使用一个概率分析来构造一个高效的且最小工作量被A和B所预算的设想。设PrG是B猜到在T个实验中最少一个是正确的概率。假设A的NAT已经在[]的范围中选择了T个不同的端口号,如果B选择T个不同的端口号,在A的NAT可选集中B不能选择到一个号的可能性是&&& Pr_G =n-T/n * n-1-T/n-1 * n-2-T/n-2 * . . . * n-(T -1)-T/n-(T -1)其中n是可能选择的端口数(n==64511)。&&&&&&&& T-1&&& Pr_G =∏n-i-T/n-i&&&&&&&& i=0反之,在T个实验中猜到一个是正确的可能性是&&& PrG = 1-Pr_G像之前的规定,T可能被选择如&&& PrG & 95%&&&&& T-1&&& 1-∏n-i-T/n-i& 95%&&&&& i=0计算T的量为T=439的这个乘积。&&&&& 439-1&&& 1-∏64511-i-439/64511-i=0.9506& 95%&&&&& i=0这结果说明如果A发送439个使在A的NAT外部端口得到不同的随机的映射的SYN包,并且B发送许多不同的随机的到目的端口的SYN+ACK包,B在它发送第440个AYN+ACK包之前就有大于95%的机会正确地猜测到439个外部端口映射的其中一个。&&& 仅仅发送T个SYN包的原因是这至少要使用两个资源,第一个是网络带宽的使用量,第二是在NAT上创建映射的数量。
5.8 情况5:&随机的,随机的,LSR&┌─────┐&& ┌─────┐│NA端口了解|&&& │NB端口了解|└─────┘&& └─────┘&&& │&&&&& ↑& ↑&&&& │&&& │&&&&&& \& /&&&&& │&&& │&&&&&&& \/&&&&&& │&&& │&&&&&&& /\&&&&&& │&&& ↓&&&&&& /& \&&&&& ↓┌─────┐&& ┌─────┐│&&& A&&&& │&& │&&& B&&&& │└─────┘&& └─────┘&图6:资源图表死锁A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------2a-----&|&------2b------||&------2c------|-------2c-----&||-------3a-----&|&------3b------||&&&&&&&&& Case1|(m,n)&&&&&&&&& |&&&& 图7:情况5&&& 在情况5中的环境是&随机的,随机的,LSR&。为了允许X同步到A和B,B必须要知道NA预先发送它的SYN包时所选的端口号。为了确定NA选择的端口,X不得不看A的SYN包。A的SYN包不能被发送直到X确定NB所选的端口号为止。这个死锁被制成图6的插图。A控制NA端口资源以致不外发SYN包,有效的预防了X知道NA所选的端口号。同样的,B也控制NB端口资源。在他们能够释放所控制资源之前,每端都需要对方的端口。我们让A和B各发送两个SYN包可松散源路由穿过X且不连接到TCP connect()调用的方案来预防这个死锁。这两个SYN包在各自的NAT上创建了所需的映射并允许X获得两个资源,同时等同于情况1和2的类似方式连接。我们情况5的方案展示在图7中并解释如下。&&& 1.X做了关于5.1节描述的端口预测。X不能预测到NA或者NB的下一端口并经由已经存在的连接告知A和B。&&& 2.A和B都发送一个SYN包松散源路由穿过X&&&& (a)NA:m→NB:anything SYN:anything,LSR:X&&&& (b)NB:n→NA:anything SYN:anything,LSR:X&&&& (c)X报告m给B并报告n给A。&&&&& 这两个SYN将在各自的NAT上创建所需的映射。&&& 3.A和B发送一个SYN到对方松散源路由穿过X&&&&& (a)NA:m→NB:n,LSR:X,SYN:P&&&&& (b)NB:n→NA:m,LSR:X,SYN:Q&&&&& 因为一致转换,即使目标端口和之前的步骤有所不同,NAT仍然为这个包利用所使用的相同映射(因此相同的外部端口号)。&&& 4.调用Case1(m,n)
&&& 注意,SYN包发送步骤2不是关联到任何TCP的connect()函数调用,而更合适的,步骤3的SYN包发送应归于一个TCP的connect()函数调用。同理,Case1的调用中SYN+ACK包发送步骤3不绑定到TCP的accept()函数子程序。
5.9 情况6:&随机的,随机的,no LSR&A&&&&&&&&&&&&&& X&&&&&&&&&&&&&& B|-------2------&|&------2-------||--------------&|&--------------||--------------&|&--------------||┆&&&&&&&&&&&& |┆&&&&&&&&&&&& ||--------------&|&--------------||-------3-------|--------------&||&--------------|-------3-------||---------------|--------------&||&--------------|---------------||---------------|--------------&||&--------------|---------------||┆&&&&&&&&&&&& |┆&&&&&&&&&&&& ||---------------|--------------&||&--------------|---------------||-------4------&|&------4-------||&------5-------|-------5------&||&&&&&&&&& Case2|(m,n)&&&&&&&&& |&&&& 图8:情况6&&& 情况6的环境是&随机的,随机的,no LSR&。回顾图6的资源图表死锁,A和B从包不可松散源路由保存端口的资源信息。这情况的方案被画成图8并解释如下。&&& 1.X做了关于5.1节述的端口预测。X不能预测到NA或者NB的下一端口并经由已经存在的连接告知A和B。&&& 2.A发送T个SYN包到B同时B发送T个SYN包到A,这些包将被在另一端的NAT抛弃或者由于TTL到期而被抛弃。&&&&& i=0&&&&& While i&T&&&&&&&&& NA:rand→NB:rand,SYN:anything&&&&&&&&& NB:rand→NA:rand,SYN:anything&&&&&&&&& i=i+1&&&&& End While&&& 这些SYN包在两边的NAT上各创建了T个映射。&&& 3.B和A发送许多SYN+ACK包到他们的伙伴的NAT直到有一个到达他们的伙伴那里。&&&&& i=1024&&&&& While A 还没报告成功&&&&&&&&& NB:rand→NA:i&&&&&&&&& SYN+ACK:,anything,anything,Payload:i&&&&&&&&& NA:rand→NB:i&&&&&&&&& SYN+ACK:,anything,anything,Payload:i&&&&&&&&& i=i+1&&&&& End While&&& 4.A和B报告通过NAT的包负荷。&&&&& NA:3999→X:1234,工作于端口m&&&&& NB:4999→X:1235,工作于端口n&&& 5.X告诉B连接到A的端口m并告诉A连接到B的端口n。&&&&& A和B现在知道他们的伙伴的外部端口号。&&& 6.调用Case2(m,n)
&&& 情况6远比情况4困难,因为各个端点必须在对方的NAT上正确地猜到一个完整的映射〈源端口,目的端口〉。在情况4中,在非随机的NAT后的端点能够正确地猜到目的端口。当其中一个NAT是可预测时,源端口就被固定了。情况6的搜索空间是情况4的平方,替代64511种可能的是种结合需要猜测。//------Translated by weljin.QQ:.MSN:.G-mail:weljin..E-mail:.Q-mail:.------////------第一次修改,以后修改将加入测试代码,以上内容由weljin翻译,更新将放在或,转载请保持来源的完整性------//
6. 实现&&& 我们已经在LINUX工作站,通过调用libnet和libpcap使用C实现了第2种和第4种情况。第1、3、5、6种情况没有实现。&&& 协助者和端点都连接到由单独功能组成的库。协助者程序natblaster_server()只需提供其协助者所要监听的端口号。端点连接程序需要提供7个参数:(1)协助者的IP地址和(2)端口号,(3)本地端点外部IP地址,(4)内部IP地址,和(5)端口号,(6)伙伴外部IP地址,和(7)端口号。本地端点和伙伴的端口号必须由协助者帮助为试图的连接建立一个唯一标志符。三元组&本地外部IP,伙伴内部IP,伙伴内部端口&被用于在协助者上的唯一标志。库试图提供一个指定端口的套接字,然而,所返回的套接字不被保证是所指定的端口号。假设natblaster_connect()工作,库返回一个有效的套接字句柄。&&& 为了测试我们的实现,我们在分离的网络上运行两个端点,每个都位于不同的且有效的NAT后面。第三部分的程序被运行于不在NAT之后的第三部计算机上。我们在英特网上做了比本地网络更多的测试,来确保测试更真实。&&& 为了创建不会到达伙伴那里并不返回错误消息的包,我们设置了TTL值使其低到不会到达伙伴那里。设置低的TTL值由调用IP_TTL选项的setsockopt()系统调用完成。这选项也需要一个TTL值。这个值必须低于到伙伴的跳跃数,但必须要大于到外部最远的NAT的跳跃数。这套接字选项对于套接字的整个生存期来说必须不是持久不变的。例如,在三次握手成功之后,setsockopt()应该被再一次调用来提高TTL值,这样后面的数据才确保能到达端点。依靠的是一个低的TTL只工作于是否一个ICMP TTL过期包不被端点的TCP堆栈看到,因为这过期包会导致在端点的套接字失败。我们所测试的NAT都不向前发送ICMP TTL过期包到内部网络。另一种方法是将发送普通包并希望伙伴的NAT默默地丢弃它们,然而,一些NAT可能发送RST包来响应那些未请自来的数据。这行为是详细的执行过程。我们没使用5.3节所描述的TTL决定技术;而是我们选择了我们知道是合适的并且低而普通的TTL值。&&& 我们为连接前诊断实现了连续的端口分配方法,但没有实现一致转换。我们的实现没有使用一致转换。&&& 我们的情况2和情况4的实现都非常成功并且能打开直接的TCP连接。情况2真实的打开了连接,而情况4有很高的几率是成功的(就是上面所讨论的,成功率取决于在预测相位的端口发送SYN和SYNACK的数量)。&&& 由于5.9节最后所给的原因,我们没有实现情况6。我们没实现情况1,3和5是因为LSR在英特网上不是典型地可用的并且我们相信这在实践中会有较低的成功率。&&& 如前面所论述的,我们使用了增加系统调用所需的标准的Berkelet网络实现。例如,当我们发送一个SYN包但需要知道序列号时,这个SYN包由使用标准的connect()调用所发送的,之后首先开始一个线程来为所发的SYN包观测数据报。这线程能报告所使用的序列号。&&& 情况2和情况4必须有root的执行权,因为这是libnet和libpcap所要求的。由于无需欺骗或者探嗅,第三方可以以一般用户的权限运行。
7. 总结&&& 我们已经证明了如何在两个不同的典型的NAT后面的主机之间建立直接的TCP连接,这些解决方案都没有以任何方式改变TCP/IP栈,而是为这些主机建立连接起到了杠杆作用。我们的方案可以为很多的程序所应用,从点对点的通信到即时消息通信。对于这个问题已经存在解决方法包括代理都没有有效地利用网络资源并且伸缩性不好。&&& 随着IPv6的到来,NAT也许就不再是个网站的组成了,但是,这些情况包括可预测NAT也可以被应用到使用状态的防火墙后面的主机。跟NAT相似,“状态防火墙”有能力只允许从他们所包含的内部网络发起的连接。我们的解决方案双方都可以初始话一个这些防火墙都允许的TCP连接。我们的几种方案在配置有IDSes的场合是不可取的,因为在第四和第六种情况下,都使用了类似于端口扫描的技术。这种情况下最好关闭这样的网络监视设备。尽管如此,我们地解决方案对于大部分的网络来说一般是足够的,甚至对于那些可能都不存在的使用随机分配地址的NAT来说也是适用的。
8. 参考文献[1] Bryan Ford. NatCheck: Hosted by the MIDCOM-P2P&&& project on SourceForge.&&& .[2] Bryan Ford, Pyda Srisuresh, and Dan Kegel. Peer-to-Peer&&& Communication Across Network Address Translators. In&&& USENIX Annual Technical Conference, Anaheim, CA, April&&& 2005.[3] Groove Networks. .[4] Saikat Guha, Yutaka Takeday, and Paul Francis. NUTSS: A&&& SIP-based approach to UDP and TCP Network Connectivity.&&& In SIGCOMM 2004 Workshops, Aug 2004.[5] M. Holdrege and P. Srisuresh. Protocol Complications with&&& the IP Network Address Translator. RFC 3027, Internet&&& Engineering Task Force, January 2001.[6] Hopster: Bypass Firewall Bypass Proxy Software.&&& .[7] Information Sciences Institute. Transmission Control&&& Protocol (TCP). RFC 793, Internet Engineering Task Force,&&& September 1981.[8] Brad Karp, Sylvia Ratnasamy, Sean Rhea, and Scott&&& Shenker. Spurring Adoption of DHTs with OpenHash, a&&& Public DHT Service. In Proceedings of the 3rd International&&& Workshop on Peer-to-Peer Systems, Feb 2004.[9] Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot,&&& and E. Lear. Address Allocation for Private Internets. RFC&&& 1918, Internet Engineering Task Force, February 1996.[10] J. Rosenberg, J. Weinberger, C. Huitema, and R. Mahy.&&&& STUN - Simple Traversal of User Datagram Protocol (UDP).&&&& RFC 3489, Internet Engineering Task Force, September&&&& 2003.[11] P. Srisuresh and K. Egevang. Traditional IP Network&&&& Address Translator (Traditional NAT). RFC 3022, Internet&&&& Engineering Task Force, January 2001.[12] P. Srisuresh and M. Holdrege. IP Network Address&&&& Translator (NAT) Terminology and Considerations. RFC&&&& 2663, Internet Engineering Task Force, August 1999.[13] P. Srisuresh, J. Kuthan, J. Rosenberg, A. Molitor, and&&&& A. Rayhan. Middlebox communication architecture and&&&& framework. RFC 3303, Internet Engineering Task Force,&&&& August 2002.[14] Jason Thomas, Andrew Mickish, and Susheel Daswani. Push&&&& Proxy: Protocol Document 0.6, June 2003.[15] Michael Walfish, Jeremy Stribling, Maxwell Krohn, Hari&&&& Balakrishnan, Robert Morris, and Scott Shenker.&&&& Middleboxes No Longer Considered Harmful. In&&&& Proceedings of USENIX Symposium on Operating Systems&&&& Design and Implementation, December 2004.
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 linux局域网传文件 的文章

 

随机推荐