网关与NAT

网关与NAT

MAC 头和 IP 头

一旦配置了 IP 地址和网关,往往就能够指定目标地址进行访问了。而在跨网关访问的时候,牵扯到 MAC 地址和 IP 地址的变化。

网关与NAT_第1张图片

net8

在 MAC 头里面,先是目标 MAC 地址,然后是源 MAC 地址,然后有一个协议类型,用来说明里面是 IP 协议。IP 头里面的版本号,目前主流的还是 IPv4,除此以外有服务类型 TOS,TTL,8 位标识协议(标识下一层是TCP还是UDP),还有最重要的就是源 IP 和目标 IP。

在任何一台机器上,当要访问另一个 IP 地址的时候,都会先判断,这个目标 IP 地址,和当前机器的 IP 地址,是否在同一个网段。怎么判断同一个网段呢?这需要 CIDR 和子网掩码。将IP与子网掩码按位与,可获得网络号。 CIDR确定网络号长度,如192.168.0.1/24,24表示网络号是24位,意味着子网掩码应该为255.255.255.0 即前三个字节全1,最后字节全0。与IP做与操作,就可以去掉主机号,得到网络号。

如果是同一个网段,那就没网关什么事情,直接将源地址和目标地址放入 IP 头中,然后通过 ARP 获得 MAC 地址,将源 MAC 和目的 MAC 放入 MAC 头中,发出去就可以了。

如果不是同一网段,该怎么办?这就需要发往默认网关 Gateway。Gateway 的地址一定是和源 IP 地址是一个网段的。往往不是第一个,就是第二个。例如 192.168.1.0/24 这个网段,Gateway 往往会是 192.168.1.1/24 或者 192.168.1.2/24。

如何发往默认网关呢?网关不是和源 IP 地址是一个网段的么?这个过程就和发往同一个网段的其他机器是一样的:将源地址和目标 IP 地址放入 IP 头中,通过 ARP 获得网关的 MAC 地址,将源 MAC 和网关的 MAC 放入 MAC 头中,发送出去。网关所在的端口,例如 192.168.1.1/24 将网络包收进来,然后接下来怎么做,就完全看网关的了。

很多情况下,人们把网关就叫做路由器。其实不完全准确,而另一种说法更加恰当:路由器是一台设备,它有五个网口或者网卡,分别连着五个局域网,每个网口都是一个网关。任何一个想发往其他局域网的包,都会到达其中一个网关,被拿进来,拿下 MAC 头和 IP 头,然后根据自己的路由算法,选择另一个网口,加上 IP 头和 MAC 头,然后发出去。

静态路由

静态路由,其实就是在路由器上,配置一条一条规则。这些规则包括:想访问 BBS 站(它肯定有个网段),从 2 号口出去,下一跳是 IP2;想访问教学视频站(它也有个自己的网段),从 3 号口出去,下一跳是 IP3,然后保存在路由器里。

每当要选择从哪个网关抛出去的时候,就一条一条的匹配规则,找到符合的规则,就按规则中设置的那样,从某个口抛出去,找下一跳 IPX。

转发网关和NAT 网关

数据包经过的网关,MAC 地址只要过网关,就必定会改变(源MAC变为当前网关的MAC,目标MAC变为下一跳网关的MAC),而IP地址可能改变可能不改变。不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关(局域网IP转换成公网IP),我们称为NAT 网关。

更具体的讲,当要访问外网时候ip数据包的变化和寻路过程,有两种情况,ip经过统一的分配没有冲突,这样源ip,目的ip不用变,变得是目的mac(因为需要不断地寻路跳转到中间网关)这种网关也叫转发网关。第二种就是比较现实的情况,有ip冲突不同网段,那么就需要在公网上有一个通用认可的身份,这个身份可以转换成私有身份,类比普通护照和国内身份证。而NAT就做这个身份的转换。

NAT 和 NAPT

除了NAT(支持一对一转换,即一个内网ip与一个外网ip),还有NAPT(支持一个外网ip对应多个内网ip,协议会维护一张映射表 内网ip:port–>外网ip:空闲port)

对于基本 NAT (只进行 IP 地址的转写)来说,你可以说它是运行在第三层上的机制,但是由于基本 NAT 并没有缓解 IP 地址紧张的问题,一般来说我们使用的都是基于端口映射的 NAPT。由于 NAPT 同时对 IP 地址和传输层端口进行改写,这时候再说 NAT 路由器充当的是三层设备就不合适了。

对于 NAPT,我们应该区分传出(客户端)和传入(服务器)两种情况。对于传出 NAT 路由器的数据包,NAT 根据源 IP 地址和传输层端口号在尽可能保留源端口号的情况下将其转写为 NAT 可用 IP 地址池里的 IP 地址和可用的 NAT 端口,并用 Session(TCP)或者活跃计时器(UDP)的方法来记忆”源IP地址+传输层端口号 <=> NAT IP 地址 + NAT 端口号“的映射。这样,当相应的回复数据包返回 NAT 路由器时,我们可以根据记录信息将 IP 地址和端口号转写回去。

而对于位于 NAT 路由器后面的服务器,它需要通过监听端口来向互联网提供服务,由于服务器并不主动向 NAT 外部建立连接,NAT 也就无从根据传出包建立端口映射,那该怎么办呢?此时,NAT 路由器需要书写好端口转发或者端口映射规则,从而将传入 NAT 路由器某一个端口的数据段转发给内部网络某一台主机。

你可能感兴趣的:(TCP/IP,udp,tcp/ip,linux)