脚本内附带一个计算 IPv4 网段的函数,避免因不同版本 Linux 系统需要统一引用 ipcalc 组件但该组件在不同 Linux 发行版下版本不一(点草 Redhat 旧版本 yum 软件库太老),功能不同,造成的网段区间无法顺利计算的问题,该函数后面有用,划重点,要考的;
修正计算 IPv4 网段函数由于子网掩码(1~32 简略 prefix 后缀格式)输入的值到达极限(30~32 区段)出现的溢出,导致计算结果首个 IP 后缀比最后一个 IP 后缀还大的颠倒问题;
在坛友向我反馈的一个案例中,他的机器来自 https://ligahosting.ro/ 这个荷兰 oneman 小商家,该商家配置 IPv4 有一个重大错误,举个例子,该机器公网 IPv4 为 5.45.78.XX,用 ip route default 命令查询它出网时默认(default via)首跳(hop)路由(5.45.72.1),竟然跟它的网关(5.45.76.1)不是一个 IP 且不属于同一个 IP 段,该情况在我的认知中尚属首例,99.99% 情况下,我们机器出网的首跳路由,和机器网关的 IP 应当是完全一致的,比如你我熟悉的家庭内网路由器(网关)为 192.168.0.1,甲骨文腾讯云阿里云等大厂机器网关为 10.0.0.1 等。为了应对这个情况,我获得到两个值,一个就是首跳路由,即 5.45.72.1,然后用 arp (地址解析协议)命令,显示该 IP 在链路缓存中对应的硬件网关 mac 地址,另一个是通过查询该机器 Linux 内核显示的网关经由(仅显示 5.45.76.0/22 这个粗略范围,里面理论上总共有 1000 多个 IP),用以上提到的函数,计算出该范围段的首个 IP 地址(5.45.76.1),然后提取出该 IP 地址的 A、B、C 类字段(5.45.76),将这个字段和刚才得到的硬件网关的 mac 地址,一同放到 arp 里,查询到真正的网关应当就是 5.45.76.1,注意,该案例里,真实网关 5.45.76.1 和我计算 5.45.76.0/22 网段首个 IP 地址得到的 5.45.76.1 仅仅是巧合,如果网管配置的网关为 5.45.76.90,我的按条件查询方法依旧有效。事后开 tickets 跟客服(老板本人)交流,发现这个问题属于典型的配置错误,这个问题他说会修复,实际上在这个案例里,首跳 IP 5.45.72.1 和网关 5.45.76.1 同属一个路由器进行管理的(它们的 mac 地址相同),正常情况下,机器出网首跳路由和网关 IP 地址就应当是一样的,不应该是不一样的;