判断原理
两个 IP 是否同网段,做法是把它们各自与同一掩码按位与,结果相同就是同段。同段的两个主机在同一广播域内,通过 ARP 直接二层通信;不同段就必须经过网关。工程上这个判断决定了流量是否需要路由,也决定了防火墙策略在哪一层生效。
掩码不同时的陷阱
判断的前提是双方用的是同一个掩码。如果一端是 /24、另一端是 /25,双方对「同段」的理解不一致,会出现单向可通:/25 那端认为对端在不同网段,会把报文交给网关;/24 那端认为同段,直接 ARP 找对端。现象是 ping 单向通、TCP 建连偶发失败,这类问题在改动掩码后最常见。
工具与命令怎么看
Linux 上可以用 ip route get 目标地址来看内核的选择:如果结果显示经由本机某个接口(且不是默认路由),说明内核判定为直连;显示 via 网关则是不同网段。脚本里用 Python 的 in 运算符判断最简单,ip_address in ip_network 的布尔值就是答案。
基本信息
| 判断方法 | IP1 AND 掩码 == IP2 AND 掩码 |
|---|---|
| 前置条件 | 两端掩码必须相同 |
| 同段(例) | 192.168.1.10/25 与 192.168.1.60/25 都在 0/25 |
| 不同段(例) | 192.168.1.10/25 在 0/25,192.168.1.130/25 在 128/25 |
典型使用场景
- 确认主机与网关是否同段:不同段时主机根本不会把报文交给网关
- 排查单向可通:优先怀疑两端掩码不一致
- 规划 VLAN 与三层网关位置:同段才可二层直达
- 检查 DHCP 下发的掩码与网关是否配套
- 考试中判断两个地址能否直接通信
Python 与系统命令双验证
Python 与系统命令双验证
python -c "import ipaddress as ip; print(ip.ip_address('192.168.1.10') in ip.ip_network('192.168.1.0/25')) # True"
python -c "import ipaddress as ip; print(ip.ip_address('192.168.1.130') in ip.ip_network('192.168.1.0/25')) # False"
ip route get 192.168.1.130
# 192.168.1.130 dev eth0 src 192.168.1.10 ← 判定为直连(同段)同段判断实例
| 地址 A | 地址 B | 掩码 | 是否同段 |
|---|---|---|---|
| 192.168.1.10 | 192.168.1.60 | /25 | 是(都在 .0/25) |
| 192.168.1.10 | 192.168.1.130 | /25 | 否(分属两个 /25) |
| 10.0.1.1 | 10.0.2.1 | /16 | 是 |
| 10.0.1.1 | 10.0.2.1 | /24 | 否 |
| 172.16.1.5 | 172.16.1.200 | /24 | 是 |
/25 的边界在 .128:10 与 60 同段、10 与 130 不同段。判断前先确认掩码,而不是只看前三段是否相同,这是排障中最常见的误判来源。
在 VLSM 环境里,同一物理网络上的设备可能配了不同掩码:这属于配置错误而非设计。发现后应先统一掩码,再排查上层业务问题,否则会持续出现难以复现的偶发故障。