我们在管理IP地址上使用SNMP来检查并确保接口已启动.但是,如果我们必须重新启动网络服务,我们就会遇到接口索引发生变化的问题.我们会收到如下错误消息:
接口’eth0.23 – eth0.23’已关闭.接口描述为’eth0.23′,索引为11.电路ID未配置.
即使界面已启动并正在运行.
如何通过重新启动将索引值更改为持久性.如果我们将接口从静态IP更改为动态,我们已经看到了这一点.
解决方法
来自RFC 2863:
The requirement for constancy (between
re-initializations) of an interface’s
ifIndex value is met by requiring that
after an interface is dynamically
removed,its ifIndex value is not
re-used by a different dynamically
added interface until after the
following re-initialization of the
network management system.
需要注意的是,当系统重新初始化(即重新启动)时,明确允许ifIndex条目用于任何接口.
从Linux内核(net / core / dev.c):
static int dev_new_index(struct net *net) { static int ifindex; for (;;) { if (++ifindex <= 0) ifindex = 1; if (!__dev_get_by_index(net,ifindex)) return ifindex; } }
内核中的ifindex分配使用简单的递增算法.这是相关的,因为在net-snmp(agent / mibgroup / if-mib / data_access / interface_ioctl.c)中:
oid netsnmp_access_interface_ioctl_ifindex_get(int fd,const char *name) { #ifndef SIOCGIFINDEX return 0; #else struct ifreq ifrq; int rc = 0; DEBUGMSGTL(("access:interface:ioctl","ifindex_get\n")); rc = _ioctl_get(fd,SIOCGIFINDEX,&ifrq,name); if (rc < 0) { DEBUGMSGTL(("access:interface:ioctl","ifindex_get error on inerface '%s'\n",name)); return 0; } return ifrq.ifr_ifindex; #endif /* SIOCGIFINDEX */ }
该函数最终被调用以填充ifindex,它只是使用IOCTL接口从Linux内核中检索SIOCGIFINDEX值.
当我使用基于SNMP的监控系统遇到这种性质的问题时,我最终使用另一种方法来引用网络接口.特别是,我使用接口名称而不是接口索引号(即“eth0”,“eth1”,“vlan150”等).