计算机网络常见概念介绍 路由 NAT

路由器

路由器(router)是互联网的枢纽,是连接英特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送数据。作用在OSI模型的第三层,提供了路由与转发两种重要机制。

路由器就是完成路由过程的设备,从构成上看,它是一个完整的计算机系统,包括硬件,操作系统和应用软件算法,与通用计算机系统的不同之处就在于,路由器硬件以通讯处理为主要设计目标,特别是 I/O部分。

  • 那么路由器是如何进行包的转发的呢?就像一个人如果在去某个地方,一定要在他的脑海里有一张地图,在每个路由器的内部也有一张地图,这张地图就是路由表
  • 在这个路由表中包含有该路由器掌握的所有目地网络地址,以及通过此路由器到达这些网络中最佳路径,这个最佳路径指的是路由器的某个接口或下一条路由器的地址
  • 这是由于路由表的存在,路由器才可以依据路由表进行包的转发,把数据包转发到路由器的指定网口
  • 路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组,也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地,把该分组从路由器的某个合适的输出端口转发给下一跳的路由器。下一跳的路由器也按照这种方法处理分组,直到该分组到达终点为止

路由器功能

  • 路由:收集网络拓扑信息并动态形成路由表
  • 转发:根据转发表(FIB)转发IP数据包
  • 子网间速率适配
  • 隔离子网
  • 隔离广播域
  • 指定访问规则
  • 不同类型的网络互联:路由器经常会收到以某种类型的数据链路帧封装的数据包,当转发这种数据包时,路由器可能需要将其封装为另一种类型的数据链路帧。数据链路封装取决于路由器接口的类型及其连接的介质类型

路由表

  • 路由表是在路由器中维护的路由条目的集合,路由表为路由做出最佳路径选择提供依据
  • 需要通过静态路由或者动态路由添加路由规则到路由器

实际中由于路由器开发厂商的不同,路由表中的信息也不尽相同,但是几乎都包含五项基本信息:

  • 目标网络的IP地址:32位,这里在上文提到,是目标网络的IP地址而非目标计算机的IP地址
  • 目标网络的子网掩码:32位,即子网掩码,没什么好解释
  • 下一跳IP地址:32位,如果目标网络需经过多个路由器,下一跳即使下一个路由器的IP地址
  • 出接口名字:路由器会提供多个接口,每个接口通向不同的网段,所以表项中需要提供该项,即使确定IP分组从哪一个接口发出去,出接口只是标识本路由器的信息
  • 度量:从该路由器到达目标网络的代价,这个属性反映这一路径的优劣,由于路由协议的不同,该项具体数据形式也不同,常见的有跳数(途径路由器的数量),当前往返时间,最窄链路带宽等等

路由表简单示例:

IP或网段 mask 接口 距离 下一跳IP
1.0 255.255.255.0 E0 1 173…
2.0 255.255.255.0 S0 2 173…

注意:
数据包经过路由器,源IP与目标IP是不改变的,除非做了NAT。不过mac地址是变化的,因为发送端开始不知道目的主机的mac地址,所以每经过一个路由器mac地址是变化的。MAC通过ARP协议获得

NAT

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”。NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。

分类

NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)

静态NAT

通过手动设置,使 Internet 客户进行的通信能够映射到某个特定的私有网络地址和端口.在静态NAT方式中,内部的IP地址与公有IP地址是一种一一对应的映射关系,所以,采用这种方式的前提是,机构能够申请到足够多的全局IP地址

动态NAT

当数据包进出内网时,具有NAT功能的设备对IP数据包的处理与静态NAT的一样,只是NAT table表中的记录是动态的,若内网主机在一定时间内没有和外部网络通信,有关它的IP地址映射关系将会被删除,并且会把该全局IP地址分配给新的IP数据包使用,形成新的NAT table映射记录

网络地址端口转换NAPT

网络地址端口转换NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个IP地址的不同端口上。

有两种类型:

  • 源NAT(Source NAT,SNAT):修改数据包的源地址
  • 目的NAT(Destination NAT,DNAT):修改数据包的目的地址

NAT原理

  • 地址转换
  • 连接跟踪,通过TrackTable
  • 端口转换,通过TrackTable

主要应用

  • 数据包伪装
  • 端口转发
  • 负载均衡

缺陷

  • 不能处理嵌入IP地址端口
  • 有一些应用程序A端口是命令端口,B端口是数据端口,NAT不知道B要映射B端口
  • P2P,需要P2P NAT穿透技术

网络图

NAT网络图

序列图

NAT序列图

扩展

反向链接

有Client与Server两台服务器,Client服务器同时启动一个服务端程序,客户端发送IP端口信息通知Server我启动了一个服务端程序你可以连接过来发送消息,这种一般要同网段才能使用,不同网段需要做路由转发一般都是只做Client到Server的路由转发,这样反过来(Server→Client)也得做一套而且Client可能非常多需要配置的转发会非常多。

7547端口被IANA分配用于CPE广域网控制协议,CPE可以在该端口监听接收请求,收到请求就连接网管URL。反向链接使用,就是网管连接基站7547端口,基站断开连接,主动通过TR069与网管通过inform建立链接。 ConnectionRequestURL 参数指定CPE本机ACS URL

利用UDP打洞

TCP和UDP在打洞上却有点不同。这是因为伯克利socket(标准socket规范)的API造成的。UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许。
利用UDP打洞后,客户端与服务端可以使用短连接。当服务端需要与客户端进行通信的时候,通过UDP通知客户端通过TCP连接服务端,连接上服务端后服务端就可以通过TCP下发信息给客户端了。

在TR069协议中应用:CPE定时发送请求保持STUN NAT绑定,STUN的绑定让CPE与STUN服务器存在一条网络链路,ACS然后发送UDP connection Request(走UDP协议,应用层协议用HTTP1.1)源IP端口使用STUN服务器的IP地址,发送到STUN服务器关联的CPE设备,进而CPE发起tr069规范中定义的6 connection request事件(TCP连接成功)。具体详细描述在TR111协议中也包含在TR069协议的附录中了,协议中具体描述了整个流程,比如通过比较MAPPED-ADDRESS判断CPE与STUN服务器之间是否经过NAT转换等。(消息可以通过打洞后通过STUNServer进行转发,也可以通过打洞后通过NAT网关直接转发)

UDP打洞过程:

  1. 双方都通过UDP与服务器通讯后,网关默认就是做了一个外网IP和端口号 与你内网IP与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网IP
  2. 用户A先通过服务器知道用户B的外网地址与端口
  3. 用户A向用户B的外网地址与端口发送消息,
  4. 在这一次发送中,用户B的网关会拒收这条消息,因为它的映射中并没有这条规则。
  5. 但是用户A的网关就会增加了一条允许规则,允许接收从B发送过来的消息
  6. 服务器要求用户B发送一个消息到用户A的外网IP与端口号
  7. 用户B发送一条消息,这时用户A就可以接收到B的消息,而且网关B也增加了允许规则
  8. 之后,由于网关A与网关B都增加了允许规则,所以A与B都可以向对方的外网IP和端口号发送消息。

跳板机外网ssh到内网服务器

在授权的IP服务器上搭建VPN作为跳板是一种解决方案。

机器上执行命令,建立SSH反向隧道。

不要在linux上启用net.ipv4.tcp_tw_recycle参数

net.ipv4.tcp_tw_recycle 这个参数是默认关闭的,打开这个参数开启后,可以使TCP连接中TIME-WAIT sockets的快速回收,但是在NAT网络下,导致大量的TCP连接建立错误、所以在公司内部有时候能访问,有时候访问不上。这个参数会对同一个请求 IP 按照时间戳增续处理, 凡是小于上次时间戳的链接请求, 都被认为是重传包而丢弃.

原来是 net.ipv4.tcp_timestamps 设置了为 1 ,即启用时间戳,经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。

1
netstat -s | grep timestamp # 查看拒绝连接的情况

先确定参数:

1
2
cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_timestamps

在/etc/sysctl.conf配置文件添加如下内容:

1
2
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0

执行如下命令,使配置生效:

1
sysctl -p

同时开启timestamp(时间戳)和tw_recycle(快速回收),会导致在一个MSL时间内只响应timestamp递增的请求,对于时间戳较小的请求都抛弃了(不响应ack)。

MSL扩展: RFC793中规定MSL为2分钟,也就是说2分钟内同一个ip的请求的时间戳要求递增,不是递增的话服务器不予响应。

参考