Linux ECM子网掩码常见问题排查
1 前言
本文主要描述模组ECM数据拨号方式下常见子网掩码相关问题定位排查方法。
2 ECM拨号简介
ECM (Ethernet Networking Control Model 以太网控制模型) 用于在设备和主机之间传输以太网数据包。在操作系统看来,CDC ECM设备就是一个虚拟以太网卡,包含标准网卡需要的MAC地址和IP地址。CDC ECM设备通常是一个以太网卡,用于连接LAN或者是WLAN。当客户主机发起ECM拨号的请求时,模块相当于一个路由器,模块内部会调用相应的服务实现WWAN拨号。在拨号成功后,模块内部会启动DHCP server等功能。客户端应用系统 通过DHCP client 服务,获取模块DHCP server分配的IP 。客户主机调用DHCP等脚本实现把模块从网络侧获取到的IP和DNS配置到本机,实现上网。
2.1 ECM拨号基本业务模型
模组内部WAN口提供无线上网服务,LAN口用于接入host数据。LAN口可以是USB口,以太网口或WLAN口。这些LAN口挂住同一个网桥下面,位于同一局域网之内。基于网桥会对应启动一个DHCP服务器,为与LAN口连接的上位机自动分配IP地址。该网桥下的数据的默认路由配置为经过对应的WAN口,这样访问外网的数据会从WAN口出去。
上位机在ECM拨号完成后启动dhcp client程序获取IP地址,子网掩码,网关等信息,使用这些信息配置对应的网口,默认路由,dns server。
2.2 子网掩码
子网掩码是一个32位地址,是与IP地址结合使用的一种技术。它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。
IP地址,子网掩码,该子网对应的网络地址及广播地址的关系如下:假设IP地址为ip,子网掩码为mask, 则该子网的网络地址为(ip & mask),该子网对应的广播地址为(ip & mask) | (~mask),该子网对应的主机地址范围为(网络地址+1,广播地址-1)。Linux系统如果接收到一个IP数据包,目的IP地址为本机,但源IP地址为本机网口对应子网的网络地址或广播地址,不会将该IP数据包送给上层的应用程序。因此如果多个设备或模块之间要支持互通,并且这些设备规划成是在同一个局域网下,则他们的子网掩码应该配置成一样,并且保证设备的IP地址不是这个子网的网络地址或广播地址。
2.2.1 模块WAN口子网掩码自动计算
ECM拨号完成后,模组会将WAN口rmnet_data0 up起来,配置IP地址、子网掩码,并且配置默认路由。rmnet_data0配置的ip地址是数据拨号完成后网络侧分配的IP地址。子网掩码及网关默认情况下是根据IP地址自动计算出来的。
子网掩码的计算规则如下:
/*------------------------------------------------------------------------
If LSB is 1, then skip all 1's till 0 to generate netmask.
For Example:
IP = 10.0.0.3 ( 0000 1010 0000 0000 0000 0000 0000 0011 )
netmask = 255.255.255.248 ( 1111 1111 1111 1111 1111 1111 1111 1000 )
If LSB is 0, then skip all 0's till 1 to genrate netmask.
For Example:
IP = 10.0.0.8 ( 0000 1010 0000 0000 0000 0000 0000 1000 )
netmask = 255.255.255.240 ( 1111 1111 1111 1111 1111 1111 1111 0000 )
------------------------------------------------------------------------*/
网关的计算规则是IP地址+1后的地址如果为该子网的广播地址则将IP地址-1作为网关地址,否则将IP地址+1作为网关地址,具体如下:
/*------------------------------------------------------------------------
Generate Server IP by adding 1 to IP address.
If by adding 1 the host address becomes broadcast address
then subtract 1 to generate server address.
For Example (Subtract):
IP = 10.0.0.10 (0000 1010 0000 0000 0000 0000 0000 1010)
netmask = 255.255.255.252 (1111 1111 1111 1111 1111 1111 1111 1100)
Server = 10.0.0.9 (0000 1010 0000 0000 0000 0000 0000 1001)
For Example (Addition):
IP = 10.0.0.11 (0000 1010 0000 0000 0000 0000 0000 1011)
netmask = 255.255.255.248 (1111 1111 1111 1111 1111 1111 1111 1000)
Server = 10.0.0.12 (0000 1010 0000 0000 0000 0000 0000 1100)
------------------------------------------------------------------------*/
2.2.2 模块WAN口子网掩码人工配置
根据IP地址自动计算子网掩码能满足正常的模块上网需求。但在专网应用场景,多个模块之间要求互通,自动计算子网掩码会导致这些模块不在同一个子网内,影响模块之间的互通。这种情况下需要将这些模块统一配置成相同的子网掩码,保证这些模块在同一个子网范围内。
可以使用AT指令配置模块WAN口的子网掩码。
2.2.3 上位机网口的子网掩码配置
正常情况下上位机网口的子网掩码是采用dhcp方式从模块获取的。
3 常见子网掩码问题定位
3.1 专网环境下模组之间无法通信
问题现象:专网环境下多个模块之间存在某2个模块之间无法ping通,例如A可以ping通C,B可以ping通C,但A无法ping通B
问题排查:这种情况下需要检查模块A和B的IP地址和子网掩码配置。检查A的IP对于B来说是否是B所在子网的正常的主机地址,同时检查B的IP对于A来说是否是A所在子网的正常的主机地址。如果不是对应子网的主机地址,就存在ping不通的现象。
例如,对于192.168.200.72及192.168.200.73,对应的网络地址、广播地址如下:
由于192.168.200.72对于192.168.200.73来说是网络地址,而不是主机地址,192.168.200.73设备接收到来自192.168.200.72设备的数据包后,不会将数据包送给上层的应用程序,从而出现ping不通的现象。
问题解决方案:对于专网允许设备之间互相访问这种应用场景,需要取消模块wan口自动计算子网掩码,根据网络实际情况使用命令AT命令固定配置模块wan口的子网掩码。
3.2 上位机网口的子网掩码配置问题
问题现象:非IPPASS模式下上位机无法ping通模块内部bridge0的IP地址。
问题排查:检查上位机网口的IP地址和子网掩码配置,是否与模块内部bridge0的IP地址配置和子网掩码配置一致,确认上位机网口与模块内部bridge0是否处于同一个子网下。
问题解决方案:如果出现不一致的情况,可以使用命令AT命令配置dhcp广播的子网掩码,修改成一致。