NAT STURN,ICE

NAT原理与NAT穿越

最近在看东西的时候发现很多网络程序中都需要NAT穿越,特意在此总结一下。

先做一个约定:

内网A中有:A1(192.168.0.8A2(192.168.0.9两用户

网关X1(一个NAT设备)有公网IP 1.2.3.4

内网B中有:B1(192.168.1.8B2(192.168.1.9两用户,

网关Y1(一个NAT设备)有公网IP 1.2.3.5

公网服务器:C (6.7.8.9) D (6.7.8.10)

  • NAT原理

网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术。下面介绍两类不同方式实现的NAT:

  1. NAT(Network Address Translators):称为基本的NAT

在客户机时      192.168.0.8:4000——6.7.8.9:8000

在网关时         1.2.3.4:4000——6.7.8.9:8000

服务器C          6.7.8.9:8000

其核心是替换IP地址而不是端口,这会导致192.168.0.8使用4000端口后,192.168.0.9如何处理?具体参考RFC 1631

基本上这种类型的NAT设备已经很少了。或许根本我们就没机会见到。

2.   NAPT(Network Address/Port Translators):其实这种才是我们常说的 NAT

NAPT的特点是在网关时,会使用网关的 IP,但端口会选择一个和临时会话对应的临时端口。如下图:

在客户机时           192.168.0.8:4000——6.7.8.9:8000

在网关时              1.2.3.4:62000——6.7.8.9:8000

服务器C               6.7.8.9:8000

网关上建立保持了一个1.2.3.4:62000的会话,用于192.168.0.8:4000与6.7.8.9:8000之间的通讯。

对于NAPT,又分了两个大的类型,差别在于,当两个内网用户同时与8000端口通信的处理方式不同:

         2.1、Symmetric NAT型 (对称型)

在客户机时              192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000

在网关时,两个不同session但端口号不同      1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62001——6.7.8.10:8000

服务器C      6.7.8.9:8000

服务器 D     6.7.8.10:8000

这种形式会让很多p2p软件失灵。

2.2、Cone NAT型(圆锥型)

在客户机时              192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000

在网关时,两个不同session但端口号相同      1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62000——6.7.8.10:8000

服务器C           6.7.8.9:8000

服务器D           6.7.8.10:8000

目前绝大多数属于这种。Cone NAT又分了3种类型:

  • a)Full Cone NAT(完全圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000 ,192.168.0.8可以收到任意外部主机发到1.2.3.4:62000的数据报。
  • b)Address Restricted Cone NAT (地址限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先给服务器C 6.7.8.9发送一个数据报后,192.168.0.8才能收到6.7.8.9发送到1.2.3.4:62000的数据报。
  • c)Port Restricted Cone NAT(端口限制圆锥型):从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000,只有当内部主机192.168.0.8先向外部主机地址端口6.7.8.9:8000发送一个数据报后,192.168.0.8才能收到6.7.8.9:8000发送到1.2.3.4:62000的数据报。   
  • 穿越NAT的实现

A1在客户机时                192.168.0.8:4000——6.7.8.9:8000

X1在网关时                   1.2.3.4:62000——6.7.8.9:8000

服务器C                       6.7.8.9:8000

B1在客户机时                192.168.1.8:4000——6.7.8.9:8000

Y1在网关时                   1.2.3.5:31000——6.7.8.9:8000

两内网用户要实现通过各自网关的直接呼叫,需要以下过程:

1、 客户机A1、B1顺利通过格子网关访问服务器C ,均没有问题(类似于登录)

2、 服务器C保存了 A1、B1各自在其网关的信息(1.2.3.4:62000、1.2.3.5:31000)没有问题。并可将该信息告知A1、B2。

3、 此时A1发送给B1网关的1.2.3.5:31000是否会被B1收到?答案是基本上不行(除非Y1设置为完全圆锥型,但这种设置非常少),因为Y1上检测到其存活的会话中没有一个的目的IP或端口于1.2.3.4:62000有关而将数据包全部丢弃!

4、 此时要实现A1、B1通过X1、Y1来互访,需要服务器C告诉它们各自在自己的网关上建立“UDP隧道”,即命令A1发送一个 192.168.0.8:4000——1.2.3.5:31000的数据报,B1发送一个192.168.1.8:4000——1.2.3.4:62000的数据报,UDP形式,这样X1、Y1上均存在了IP端口相同的两个不同会话(很显然,这要求网关为Cone NAT,否则,对称型Symmetric NAT设置网关将导致对不同会话开启了不同端口,而该端口无法为服务器和对方所知,也就没有意义)。

5、 此时A1发给Y1,或者B1发给X1的数据报将不会被丢弃且正确的被对方收到.

综合P2P可实现的条件需要:

1、 中间服务器保存信息、并能发出建立UDP隧道的命令

2、 网关均要求为Cone NAT类型。Symmetric NAT不适合。

3、 完全圆锥型网关可以无需建立udp隧道,但这种情况非常少,要求双方均为这种类型网关的更少。

4、 假如X1网关为Symmetric NAT, Y1为Address Restricted Cone NAT 或Full Cone NAT型网关,各自建立隧道后,A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别),但B2发送给X1的将会被丢弃(因为发送来的数据报中端口与X1上存在会话的端口不一致,虽然IP地址一致),所以同样没有什么意义。

5、 假如双方均为Symmetric NAT的情形,新开了端口,对方可以在不知道的情况下尝试猜解,也可以达到目的,但这种情形成功率很低,且带来额外的系统开支,不是个好的解决办法。

6、 不同网关型设置的差异在于,对内会采用替换IP的方式、使用不同端口不同会话的方式,使用相同端口不同会话的方式;对外会采用什么都不限制、限制IP地址、限制IP地址及端口。

7、 这里还没有考虑同一内网不同用户同时访问同一服务器的情形,如果此时网关采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能导致不同用户客户端可收到别人的数据包,这显然是不合适的。

一些现在常用的技术:

ALG(应用层网关):它可以是一个设备或插件,用于支持SIP协议,主要类似与在网关上专门开辟一个通道,用于建立内网与外网的连接,也就是说,这是一种定制的网关。更多只适用于使用他们的应用群体内部之间。

UpnP:它是让网关设备在进行工作时寻找一个全球共享的可路由IP来作为通道,这样避免端口造成的影响。要求设备支持且开启upnp功能,但大部分时候,这些功能处于安全考虑,是被关闭的。即时开启,实际应用效果还没经过测试。

STUN(Simple Traversalof UDP Through Network):这种方式即是类似于我们上面举例中服务器C的处理方式。也是目前普遍采用的方式。但具体实现要比我们描述的复杂许多,光是做网关Nat类型判断就由许多工作,RFC3489中详细描述了。

TURN(Traveral Using Relay NAT)该方式是将所有的数据交换都经由服务器来完成,这样NAT将没有障碍,但服务器的负载、丢包、延迟性就是很大的问题。目前很多游戏均采用该方式避开NAT的问题。这种方式不叫p2p。

ICE(Interactive Connectivity Establishment)是对上述各种技术的综合,但明显带来了复杂性。

时间: 2024-10-08 03:39:33

NAT STURN,ICE的相关文章

PJNATH介绍 -- 开源的用于NAT穿透的ICE, STUN和TURN

原文地址:http://blog.pjsip.org/2007/04/06/introducing-pjnath-open-source-ice-stun-and-turn/ ICE是什么? 对于那些不熟悉ICE的人而言,ICE可能是一种最全面的用于穿透NAT和多媒体通信的方法.它提供了一种找到两个终端之间最好路径的方法,它还解决了NAT所带来的各种各样的问题,比如两个终端处在同一个NAT后面(and no hairpin is available),两个终端都处在对称NAT后面(在这种情况下,

NAT转换,NAPA转换(详细步骤描述)

利用GNs3模拟实验 NAT转换(p1能ping通) 一.pc配置 Int fa1/0 (config-if)#ip add 192.168.10.1 255.255.255.0 (config-if)#exit (config)#no ip routing(关闭路由功能 ) (config)#end 二,R1配置 R1(config)#int f1/1 R1(config-if)#no shutdown R1(config-if)#ip add 192.168.10.254 255.255.2

NAT hairpin,端口回流,回环NAT

常有QQ群友提出这样一个问题: 企业内网里发布了一台web服务器,在内网的用户需要通过域名访问web服务,该如何设置路由? 从H3C的技术文档看,该需求为典型的C-S模式的NAT hairpin应用.不同路由器厂家有不同的叫法,有说"端口回流","回环NAT"等,也许实现的技术不一样,但都可以解决这个问题. H3C的配置可以参考: http://www.h3c.com/cn/d_201405/828697_30005_0.htm#_Toc387662360 当然,此

关于Juniper虚拟路由器---服务器流量不从NAT出入,从指定的IP从指定的IP做流量出入

项目需求:公司有juniper防火墙一台,分别配置了两个zone, trust用于内网,untrust用于公网,5个同一网段公网IP地址----(IP1,IP2,IP3,IP4,IP5), 其中IP1用于全公司NAT上网,并且在IP1上做了端口映射用于Internet侧访问内部服务器,目前有一需求,希望用一个专门的地址IP2来做端口映射,并且邮件服务器出口也希望是IP2, 因为Juniper上可以增加虚拟IP2来做端口映射,外部访问内部没有问题的,但是邮件服务器发送邮件会使用默认出口IP1的地址

虚拟机网络连接NAT模式,本地用Xshell连接

当虚拟机centos6网络连接使用NAT模式时,因为共用宿主机ip所以当使用Xshell时直接填写虚拟机的ip地址和22端口是无法连接虚拟机的. 这样就需要配置端口映射关系! 1. 打开虚拟网络编辑器 2. 点击更改设置 选择VMnet8点击NAT设置 3.点击添加 4. 主机端口号设在1024~65535之间,我选在2345端口,虚拟机地址就是虚拟机centos的IPv4地址,虚拟机的ssh默认端口是22 5. 一路点击确定直到退出设置页面 6. 有时需要设置本地Internet连接共享 控制

asa的nat配置,所有的情况都在这里了

NAT 1 将内部所有地址段转化为外部地址段的某一段IP nat (inside) 1 0 0 glob (outside) 1 172.16.0.150-172.16.0.160 shxlate查看NAT转换项 sh conn 查看不同区域的IP连接项 sh glob (sh running-config global) 查看glob地址池配置 clear nat清除NAT配置 clear glob 清除lob地址池配置 clear xlate清除现有NAT转换项 NAT 2 将内部网段转化为

vmware 虚机NAT模式,局域网可访问

本地VMware虚拟机,网络模式为NAT,现在需要局域网其他电脑通过ssh连接这台VMware虚拟机 宿主机地址:192.168.3.26 VMware虚拟机地址:192.168.239.137 局域网其他机器地址:192.168.3.204 编辑-虚拟网络编辑器 1.选择VMnet8 ,点“NAT设置” 2.添加 “端口映射”,如图,映射物理机8889到虚机22(ssh端口) 这里需要将宿主机192.168.3.26的防火墙关闭或者放行8889端口 在192.168.3.204上通过xshel

虚拟机(VMWare)NAT 模式,配置静态IP上网的问题

问题描述: 感觉问题解决了回过头来想就很简单,但是没解决就怎么也找不到问题,知识储备捉襟见肘.针对这个问题我好长时间才弄好,各种找资料,也证明本人筛选有用博客的能力比较低,先让我哭会去…… 在虚拟的实验,特别是分布式集群环境中,我们需要配置静态IP地址,我们又想上网,往往我们是二者不可兼得,但是这个很明显有解决的办法,但是我们就是找不到,下面我从网上找的博客设置成功,特别感谢! 设置 1.windows.首先看一下,windows下有没有多出个VMware1(hostonly使用).VMware

CentOS 7 部署LVS集群(DR模式、NAT模式,LVS+keepalived)

1.简介 1.1LVS linux虚拟服务器,是一个虚拟的服务器集群系统,可以在Unix和linux平台下实现负载均衡集群的功能. 1.2LVS与nginx的对比 1)工作在网络模型的7层,可以针对http应用做一些分流的策略,nginx单凭这点可利用的场合远多于LVS.   2)最新版的nginx也支持4层TCP负载,这曾是LVS的优势.   3)nginx对网络稳定性的依赖小,相反LVS对网络稳定性依赖大.   4)nginx安装和配置比较简单,测试起来比较方便,基本上能把错误用日志打印出来