NAT部分知识整理
Posted 初来码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NAT部分知识整理相关的知识,希望对你有一定的参考价值。
NAT
全称Network Address Translation,网络地址转换。
基本上家用路由器都支持这功能
工作原理
假如家里分到了一个公网IP地址 20.20.20.20
,对应配到了你家自带NAT功能的家用路由器上,你家里需要上网的设备有很多,比如你的手机,电脑都需要上网,他们构成了一个局域网,用的都是私有IP,比如192.168.xx
。其中你在电脑上执行ifconfig
命令,发现家里的电脑IP是192.168.30.5
。你要访问的公网IP地址是30.30.30.30
。
内网IP访问公网IP
当你准备发送数据包的时候,你的电脑内核协议栈就会构造一个IP数据包。这个IP数据包报头里的发送端IP地址填的就是192.168.30.5
,接收端IP地址就是30.30.30.30
。将数据包发到NAT路由器中。
此时NAT路由器会将IP数据包里的源IP地址修改一下,私有IP地址192.168.30.5
改写为公网IP地址20.20.20.20
,这叫SNAT(Source Network Address Translation,源地址转换)。并且还会在NAT路由器内部留下一条 192.168.30.5 -> 20.20.20.20
的映射记录,这个信息会在后面用到。之后IP数据包经过公网里各个路由器的转发,发到了接收端30.30.30.30
,到这里发送流程结束。
SNAT
SNAT
(Source Network Address Translation,源地址转换)
DNAT
(Destination Network Address Translation,目的地址转换)
NAPT
NAPT(Network Address Port Transfer , 网络地址端口转换 )
如果接收端处理完数据了,需要发一个响应给你的电脑,那就需要将发送端IP地址填上自己的30.30.30.30
,将接收端地址填为你的公网IP地址20.20.20.20
,发往NAT路由器。NAT路由器收到公网来的消息之后,会检查下自己之前留下的映射信息,发现之前留下了这么一条 192.168.30.5 -> 20.20.20.20
记录,就会将这个数据包的目的IP地址修改一下,变成内网IP地址192.168.30.5
, 这也叫DNAT
(Destination Network Address Translation,目的地址转换)。之后将其转发给你的电脑上。
DNAT
NAPT的原理
局域网里并不只有一台机器,局域网内 每台机器都在NAT下留下的映射信息都会是 192.168.xx.xx -> 20.20.20.20
,发送消息是没啥事,但接收消息的时候就不知道该回给谁了。
NAT的问题
实际上大部分时候不会使用普通的NAT
假设,发送端IP地址填的就是192.168.30.5
,接收端IP地址就是30.30.30.30
。
将数据包发到NAT路由器中。
此时NAT路由器会将IP数据包里的源IP地址和端口号修改一下,从192.168.30.5:5000
改写成20.20.20.20:6000
。并且还会在NAT路由器内部留下一条 192.168.30.5:5000 -> 20.20.20.20:6000
的映射记录。之后数据包经过公网里各个路由器的转发,发到了接收端30.30.30.30:3000
,到这里发送流程结束。
NAPT发送数据
接收端响应时,就会在数据包里填入发送端地址是30.30.30.30:3000
,将接收端是20.20.20.20:6000
,发往NAT路由器。NAT路由器发现下自己之前留下过这么一条 192.168.30.5:5000 -> 20.20.20.20:6000
的记录,就会将这个数据包的目的IP地址和端口修改一下,变回原来的192.168.30.5:5000
。之后将其转发给你的电脑上。
NAPT接收数据
如果局域网内有多个设备,他们就会映射到不同的公网端口上,毕竟端口最大可达65535,完全够用。这样大家都可以相安无事。
像这种同时转换IP和端口的技术,就是NAPT(Network Address Port Transfer , 网络地址端口转换 )。
内网穿透
使用了NAT上网的话,前提得内网机器主动请求公网IP,这样NAT才能将内网的IP端口转成外网IP端口。
反过来公网的机器想主动请求内网机器,就会被拦在NAT路由器上,此时由于NAT路由器并没有任何相关的IP端口的映射记录,因此也就不会转发数据给内网里的任何一台机器。
有没有办法让外网机器访问到内网的服务?
“没有什么是加中间层不能解决的,如果有,那就再加一层”
说到底,因为NAT的存在,我们只能从内网主动发起连接,否则NAT设备不会记录相应的映射关系,没有映射关系也就不能转发数据。
所以我们就在公网上加一台服务器x,并暴露一个访问域名,再让内网的服务主动连接服务器x,这样NAT路由器上就有对应的映射关系。接着,所有人都去访问服务器x,服务器x将数据转发给内网机器,再原路返回响应,这样数据就都通了。这就是所谓的内网穿透。
内网穿透
为什么我在公司里访问不了家里的电脑?
那是因为家里的电脑在局域网内,局域网和广域网之间有个NAT路由器。由于NAT路由器的存在,外网服务无法主动连通局域网内的电脑。
- 两个内网的聊天软件如何建立通讯
我家机子是在我们小区的局域网里,班花家的机子也是在她们小区的局域网里。都在局域网里,且NAT只能从内网连到外网,那我电脑上登录的QQ是怎么和班花电脑里的QQ连上的呢?
聊天软件会主动与公网服务器建立连接
也就是说,两个在内网的客户端登录qq时都会主动向公网的聊天服务器建立连接,这时两方的NAT路由器中都会记录有相应的映射关系。当在其中一个qq上发送消息时,数据会先到服务器,再通过服务器转发到另外一个客户端上。反过来也一样,通过这个方式让两台内网的机子进行数据传输。
- 两个内网的应用如何直接建立连接
假设还是A和B两个局域网内的机子,A内网对应的NAT设备叫NAT_A
,B内网里的NAT设备叫NAT_B
,和一个第三方服务器server
。
流程如下。
step1和2: A主动去连server,此时A对应的NAT_A
就会留下A的内网地址和外网地址的映射关系,server也拿到了A对应的外网IP地址和端口。
step3和4: B的操作和A一样,主动连第三方server,NAT_B
内留下B的内网地址和外网地址的映射关系,然后server也拿到了B对应的外网IP地址和端口。
step5和step6以及step7: 重点来了。此时server发消息给A,让A主动发UDP
消息到B的外网IP地址和端口。此时NAT_B收到这个A的UDP数据包时,这时候根据NAT_B的设置不同,导致这时候有可能NAT_B能直接转发数据到B,那此时A和B就通了。但也有可能不通,直接丢包,不过丢包没关系,这个操作的目的是给NAT_A上留下有关B的映射关系。
step8和step9以及step10: 跟step5一样熟悉的配方,此时server再发消息给B,让B主动发UDP
消息到A的外网IP地址和端口。NAT_B上也留下了关于A到映射关系,这时候由于之前NAT_A上有过关于B的映射关系,此时NAT_A就能正常接受B的数据包,并将其转发给A。到这里A和B就能正常进行数据通信了。这就是所谓的NAT打洞。
step11: 注意,之前我们都是用的UDP数据包,目的只是为了在两个局域网的NAT上打个洞出来,实际上大部分应用用的都是TCP连接,所以,这时候我们还需要在A主动向B发起TCP连接。到此,我们就完成了两端之间的通信。
NAT打洞
端口已经被udp用过了,TCP再用,那岂不是端口重复占用(address already in use)?
其实并不会,端口重复占用的报错常见于两个TCP连接在不使用SO_REUSEADDR
的情况下,重复使用了某个IP端口。而UDP和TCP之间却不会报这个错。之所以会有这个错,主要是因为在一个linux内核中,内核收到网络数据时,会通过五元组(传输协议,源IP,目的IP,源端口,目的端口
)去唯一确定数据接受者。当五元组都一模一样的时候,内核就不知道该把数据发给谁。而UDP和TCP之间"传输协议"不同,因此五元组也不同,所以也就不会有上面的问题。
IP地址NAT子网划分与子网掩码CIDR等网络层相关知识整理
1. 连接在Internet中的每台主机(或路由器)都分配一个32bit的全球唯一的标识符,即IP地址。
IP地址的编码方法有三种:分类的IP地址、子网的划分和CIDR。
传统的IP地址是分类的地址,分为A、B、C、D、E五类。无论哪类IP地址,都由网络号和主机号两部分组成。其中,网络号代表主机所连接到的网络,主机号代表该主机或路由器在网络中的地址。
A类地址:0+网络地址(7位) + 主机地址(24位)
B类地址:10+网络地址(14位)+主机地址(16位)
C类地址:110+网络地址(21位)+主机地址(8位)
D类地址:1110 + 多目的广播地址(28位)
E类地址:11110 + 保留用于实验室和将来使用
注意:在各类IP地址中,有一些IP地址用于表示特殊用途,不用于作主机IP地址:
主机号全为0表示网络本身;
主机号全为1表示本网络的广播地址;
127.0.0.1网络保留作为环路自测地址,此地址表示任意主机本身;
32bit全为0,即0.0.0.0表示整个TCP/IP网络;
32bit全为1,即255.255.255.255表示整个TCP/IP网络的广播地址。
2. 网络地址转换(NAT)是通过将专用网络地址(如企业内部网Intranet)转换为公用地址(如互联网Internet),从而对外隐藏了内部管理的IP地址。这样,通过在内部使用非注册的IP地址,并将它们转换为一小部分外部注册的IP地址,从而减少了IP地址注册的费用以及节省了目前越来越缺乏的地址空间(IPv4)。
此外,划出了部分IP地址为私有IP地址。私有IP地址值用于LAN,不用于WLAN连接。因此私有的IP地址不能直接用于Internet,必须通过网关利用NAT把私有IP地址转换为Internet中合法的全球IP地址后才能用于Internet。私有IP地址有效解决了IP地址不足的问题。私有IP地址网段如下:10.0.0.0~10.255.255.255、172.16.0.0~172.31.255.255、192.168.0.0~192.168.255.255
在因特网中的所有路由器,对目的地址是私有地址的数据报一律不进行转发。使用NAT时,需要在专用网连接到因特网的路由器上安装NAT软件,NAT路由器至少有一个有效的外部全球地址。普通路由器在转发数据报时不改变其源IP地址和目的IP地址,且路由器工作在网络层,而NAT路由器在转发IP数据报时,一定要更换其IP地址(按路由器中的地址转换表转换源IP地址或目的IP地址)。NAT路由器转发数据报时需要查看和转换传输层的端口,其操作没有严格的层次关系。
3. 各类地址的默认子网掩码:
A类:255.0.0.0;
B类:255.255.0.0;
C类:255.255.255.0。
使用子网划分时的地址格式:
A类网络:8位+子网X位+主机24-X位
B类网络:16位+子网X位+主机16-X位
C类网络:24位+子网X位+主机8-X位
4. 无分类编址CIDR
CIDR是在使用变长度子网掩码的基础上提出的一种消除传统A、B、C类网络划分,并且可以在软件的支持下实现超网构造的一种IP地址的网络划分方法。这样可以大幅度提高IP地址空间的利用率,并减小路由表大小,提高路由器的路由转发能力。CIDR的主要特点如下:
(1)消除了传统的A、B、C类地址以及子网的概念,因而可以更加有效地分配IPv4的地址空间。CIDR使用“网络前缀”概念代替子网络概念。这样IP地址分为两部分:网络前缀、主机号。
CIDR使用斜线记法,即IP地址/网络前缀所占比特数。其中,网络前缀所占比特数对应于网络号的部分,等效于子网掩码中连续1的部分。
(2)将网络前缀都想通的连续IP地址组成“CIDR地址块”。一个CIDR地址块可以包括多个A、B、C类地址,这种地址的聚合称为路由聚合,或称为构成超网。路由聚合使得路由表中的一个项目可以表示很多个原来传统分类地址的路由,有利于减少路由之间的路由选择信息的交换,从而提高网络性能。
以上是关于NAT部分知识整理的主要内容,如果未能解决你的问题,请参考以下文章