关于NAT网络地址转换

禁止转载,欢迎交流,如有错误请务必指正。

背景

所有设备要上网,要在网络上交换信息,必须要有IP地址,目前我们所用的IP地址大多还是IPv4,由32位的二进制数组成,也就是说IPv4只有2的32次方(40几亿)个IP地址。40多亿只是听起来多,目前世界上网民的数量已经突破了这个数字,再加上越来越多的设备需要连接上互联网,一个网民除了电脑还有手机,平板电脑,甚至现在的电器都有联网的需求。再加上部分地址被留作特殊用途,IPv4的IP地址早就成为稀缺资源。

如果可以让一个IP地址被重复利用,就可以一定程度上解决这个问题,于是就有了NAT。

解决方法

简单来说,NAT(Network Address Translation)使一些IP地址可以在内网被重复利用,并在内网的这些设备需要与外网通信的时候,通过地址转换把内网IP地址转换成公网IP地址。

这些可以重复利用的IP地址叫做内网IP。在所有IPv4地址中,部分地址被拿了出来当作内网IP,这些IP不会出现在外网。比如小型局域网中最常见的192.168开头的IP地址,就是内网IP,还有10开头的,172.16开头的。

局域网中DHCP服务器会给设备动态分配内网IP地址,比如你的手机是192.168.1.100,电脑是192.168.1.101,可能每个局域网中都有192.168.1.100这个IP地址,这样就达到了重用IP地址的目的。

NAT的作用(PAT)

显然这么多设备都用相同IP地址,不可能可以直接在外网上通信,这时NAT就发挥了作用。在这些使用内网IP的设备想要与外网通讯时,会经过地址转换,通常是在路由器上完成的。当与外网通讯的请求经过路由器时,路由器会把数据包中的源IP地址和端口转换成一个公网的IP地址和路由器上一个可用的端口

比如192.168.1.100这个设备在用5000端口访问139.180.202.154的80端口,路由器把这些数据记录进地址转换表,然后把192.160.1.100替换成自己拥有的公网IP和路由器上一个可用的端口,再发送到139.180.202.154。这里所谓可用的端口就是路由器上还没被地址转换表记录的端口,而端口的范围是1到65535,也就是一个路由器,一个公网IP就可以让六万多设备同时访问互联网。

NAT的其他方式

上面说的其实只是NAT的其中一种方式,叫PAT(Port address translation),端口地址转换,也是最常用的。除了PAT以外,NAT还有动态NAT和静态NAT两种方式。

动态NAT的用处非常小,它与PAT的不同指出在于它并不记录端口,也就是说一个内网个IP地址在同一时间内只能对应一个外网IP,并不能真正的实现多个设备用同一个公网IP上网。

静态NAT则是手工的将某个内网地址(和端口)与外网地址(和端口)进行匹配。上面所说的最常用的PAT实现的是内网设备访问外网,而静态NAT通过手动匹配则可以实现外网设备访问内网。比如192.168.1.105是一台Web服务器,那么可以把他和自己拥有的公网IP的80端口绑定在一起,那么外网设备访问这个IP的80端口的时候,路由器就会把这个请求转发给192.168.1.105,这也叫端口映射。

关于DHCP服务

禁止转载,欢迎交流,如有错误请务必指正。

DHCP(Dynamic Host Configuration Protocol) 服务是局域网中为用户动态分配ip地址的服务。端口号67/68。

为什么要有DHCP服务?

如果没有为用户动态分配ip地址这样一项服务,那意味着每一台上网设备需要自己设置ip地址,这个ip地址不能有冲突,也要与局域网网段一致。那当这个设备到了另一个局域网,物理上位置移动了,这个ip必然又需要重新手动设置,非常不现实。所以我们需要一项为用户动态分配ip,管理局域网中的ip地址池的服务。并且DHCP的租期参数能保证ip不被长时间占用,根据不同地方的网络需求作出合适的配置。

DHCP做了什么

DHCP存有所在局域网中能用的代码池,设备的ip分配情况。当把ip分配给主机时,DHCP把ip地址,子网掩码,网关,DNS和租期一起发送给主机,有了这些参数主机就可以上网了,DHCP还会纪录此时的时间,以便租期到后回收这个ip地址。

租期是服务启用时设置好的时间参数,代表了这个ip地址将会分配给这个主机的时长,在租期之内即使主机下线,这个ip地址也不会被回收。

用户与DHCP的交互过程

用户连接到局域网的时候并不知道上网所需要的参数,这个时候用户会发出第一个数据包,广播寻找DHCP服务器(discover)。

收到discover包的DHCP服务器会从地址池中为用户提供一个可用的ip地址,连同其他信息发送给用户(offer)。这个过程(似乎)大多是广播,windows系统的服务器中可以设置为单播。

用户收到offer包后,广播一个数据包,表示正式请求使用这个ip(request)。如果收到的offer包多于一个,则采用第一个。

最后DHCP服务器回复一个确认数据包(ack),告知用户是否成功分配。

这个过程中如果用户没有找到DHCP服务器或者DHCP服务器地址池没有可用的ip,同时用户又没有填写静态ip,用户的ip就会自动设置为169.254.xxx.xxx,当然也无法上网。

相关安全问题

上面提到用户可能会收到多个offer包,说明DHCP服务器不止一个,那么其中可能有伪装的DHCP服务器,提供的ip也无法另用户正常上网。而由于客户端只会采取第一个收到的包,所以如果有伪装的DHCP服务器,而它发送的offer又恰好是客户端收到的第一个,客户端也会采用,并没有办法分辨。但是这种情况我们可以分辨,因为这时的ip地址不是169.254开头。

除了可能有伪装的DHCP服务器,正常的DHCP服务器也可以遭受攻击,只要被恶意请求获取完地址池所有ip,正常用户再连接就无法上网。