网络地址翻译@没文化的酒鬼
防火墙和NAT
NAT路由器是安装了NAT软件的路由器,拥有至少一个全球通用的外部IP。
在计算机网络中,NAT最直接的作用是IP映射:将内网终端A的IP和端口号经过NAT映射后,转成公网服务器B的IP和新端口号;当B接收到目的地终端C返回到B的应答之后,B将查找Translate Table,把C的应答转回给A。
防火墙的直接作用是数据包的过滤,拒绝一切主动请求与内网终端进行通信的未知IP。
但NAT不是单纯的翻译翻译IP和端口号就完事儿,它也会考虑任一C、D、E、F……送上门来的这个数据包,到底是不是B应该接收的,对于不该接收的,它会拒绝。NAT似乎包揽了部分的数据包过滤功能。
防火墙
防火墙隔断内网和外网。分为两种:
- Packet-filtering :是否拒绝接收信息,取决信息来源的于IP地址、端口号,这属于IP/TCP/UDP的管辖范围;
- application-level :双向考虑,外网想进内网来的内容有没有问题;内网想送出去的内容该不该送出去。于是设立了应用层的大门。Telnet举例,想通过Telnet通信的ClientA必须通过ALG审核。路由器会阻断所有未经ALG,擅自想出去/进来的数据包。整个过程归应用层管。
默认的防火墙功能:1.当某外网终端送来内容,且与外网的通信建立是由内网发起的,那么内容被接收;2.一切未经内网发起的外来通信请求将被阻断。
这两种防火墙的整体弊端:
- 防不住IP假冒。路由器并不知道数据包是否真的来源于数据包自己宣称的地址;
- 需求繁琐。用户为了自证身份,必须要知道怎么跟ALG(Apllication Gateway)通信,于是产生了对IP地址代理商的需求;同时存在多个APP需要多扇ALG的复杂问题。
NAT
NAT最基础的意义在于,把路由器右边的10.0.0.X和左边的138.76.29来回翻译。从右边往左翻译,是为了让内网的信息有资格在外网中传播;从左往右翻译,是为了外网送进来的内容能到达指定的的终端,具体是:X的值是多少。但是既然需要这样费时费力地来回翻译,NAT的存在有什么特别的意义?
考虑几个场景。
- IPV4濒临枯竭的情况下,要确保每一台终端都分配到一个类似138.76.29的IP,需要花费多少IP。
- 如果要不打扰所有内网10.0.0.X地把138.76.29给换掉。
- 如果要不打扰外网(不进行广播)地把10.0.0.2给换掉。
NAT, bingo>
NAT分四种: Full Cone Address Restricted Cone、Port Restricted Cone、Symmetric。
——前三种为什么叫锥形?
NAT是一种地址映射协议。锥形的意义在于同一公网IP和端口(锥形顶点)可能与多个外部终端(锥形底面)建立通信。一个内部IP地址和端口来的所有请求,都映射到相同的公网IP地址和端口,并且,能否与外部终端进行通信,取决于选取的NAT种类是哪种,PORT RESTRICTED是最严格的,要求IP、PORT NUMBER全都固定;FULL CONE最宽松,NAT为A打开一个口以后,只要建立了内部网络的IP地址和端口与公网IP地址和端口的映射关系,所有的Internet上的主机都可以通过该端口访问A。
——锥形和非锥形的根本区别在哪里?
锥形有一个顶点,即经过Translate table后唯一的IP和端口号,无论一个内网终端A进行通信的外部设备有几台,A仅具有独一的IP和端口号。
在NAT已分配端口号给终端A的情况下,如果终端A继续用内网12345端口与另一外网服务器通讯,锥型NAT还会继续用原来62000公网端口,即所分配的端口号不变。而对于对称型NAT,NAT将会分配另一端口号(如62001)给终端A的1235端口。也就是说,同一内网主机同一端口号,对于锥型NAT,无论与哪一外网主机通讯,都不改变所分配的端口号;而对于对称型NAT,同一内网主机同一端口号,每一次与不同的外网主机通讯,就重新分配另一个端口号。
——既然有NAT Router为内部终端翻译地址从而能够进行内外网的自由通信,那内部终端为什么还要打听自己的公网IP?
一个内网终端A主动往外网终端B发包后,B所属的局域网的防火墙会把A阻拦,所以接下来A、B想进行通信,B需要再向A发包,这时因为A已经主动建立过与B的通信,所以A不会拒绝B。A、B相互发送的数据包的源IP,都必须是公网IP和端口号,子网IP的数据包是不会被正确追踪和传送的。NAT Router只负责映射出一个表格,不负责动态、自动地给每个想与外部建立连接的A终端分配并修改数据包上的Src IP,所以从A发出的数据包,A必须自己负责确定卸载数据包上的Src IP是多少,这就要求,在发出之前,搞清楚自己的公网IP和端口号。
怎样让内网的应用程序知道自己的公网IP和端口号,这个问题叫做NAT的穿透。有四种解决NAT穿透问题的办法,前三种是向NAT外部设备发出询问,第四种是向NAT本身发出询问。
- STUN(Simple Traversal of UDP Through NATs) 通过与外部的STUN服务器建立UDP连接,继而询问公网IP和端口号。如果STUN服务器仅一台,那么不同的应用程序被反馈的端口号是唯一的,因此这种方法的弊端在于不支持对称NAT。除此,STUN无法进行TCP连接。
- TURN(Traversal Using Relay NAT)TURN允许多媒体数据包直接传向TURN服务器,从而适用在对称型NAT,但带来了其他一系列复杂问题,现在SIP用户很少支持TURN。
- ICE(Interactive Connectivity Establishment)最理想的穿透方式,能够保证:除非在用户接起电话的一瞬间数据是连通的,否则用户的电话铃就不会响起。对NAT种类没有要求。
- UPnP(Universal Plug and Play)一次性询问NAT大门:我是谁,我在哪。获得NAT Gateway 提供的IP、端口号。但考虑某种网络:NAT大门串联存在的网络,这时UPnP一定不能起效。另一个弊端:每当新的应用程序出现,Application Layer Gateway 需要获得更新,这将UPnP的使用限制在大型企业。至今没有商用的SIP ALGs。