通过SNMP脚本获取路由器互联网流量是否可靠?MIB节点指向疑问
关于通过SNMP获取路由器互联网流量的可靠性及MIB对象指向问题
一、你的Bash脚本可靠性分析
你的脚本核心逻辑是通过默认路由定位路由器IP,再借助默认路由对应的接口索引获取流量统计,但存在几个影响可靠性的问题:
- 语法错误:
BYTES_IN和BYTES_OUT的赋值未用反引号或$()包裹执行命令,会导致变量值仅为字符串而非命令执行结果,正确写法应为:BYTES_IN=$(snmpget -c public -v2c $ROUTER_IP IF-MIB::ifInOctets.${WAN_PORT_INDEX}) BYTES_OUT=$(snmpget -c public -v2c $ROUTER_IP IF-MIB::ifOutOctets.${WAN_PORT_INDEX}) - 默认路由获取的不确定性:
ip route | grep default | awk '{print $3}'仅取第一个默认路由,若系统存在多默认路由(如多WAN场景),会直接出错或取到错误的路由器IP。 - 硬编码IP问题:后续SNMP请求用了固定的
192.168.51.1,应复用前面获取的$ROUTER_IP变量,否则当默认路由网关IP变化时会失效。 - SNMP配置依赖:依赖路由器SNMPv2c社区字符串为
public、允许你的主机访问,且路由器已加载对应MIB(RFC1213-MIB、IF-MIB)。
修正上述问题后,在单WAN、默认路由稳定的场景下,这个方法是可靠的;但多WAN或复杂路由环境下,需要调整逻辑适配。
二、RFC1213-MIB::ipRouteIfIndex.0.0.0.0指向WAN接口的原因
这不是偶然现象,是标准设计的结果:
- 在RFC1213定义的
ipRouteTable中,ipRouteDest为0.0.0.0的条目就是默认路由,ipRouteIfIndex表示该路由对应的出站接口索引。 - 默认路由的作用是转发所有非本地路由的流量到互联网,其对应的出站接口自然就是WAN口(路由器连接互联网的接口)。
- Mikrotik、Cisco等主流厂商的SNMP实现均遵循RFC1213标准,因此默认路由对应的
ipRouteIfIndex都会指向WAN接口,这是符合协议设计的统一行为。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

