Resposta curta, os RFCs SNMP não exigem persistência ifIndex entre a reinicialização do gerenciador de rede. O net-snmp não fornece nenhum recurso especial para fornecer essa funcionalidade.
A partir do 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.
O takeaway é que as entradas ifIndex são explicitamente permitidas para serem usadas em qualquer interface quando o sistema é reinicializado (isto é, reinicializado).
Do kernel do 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;
}
}
A alocação ifindex dentro do kernel usa um algoritmo de incremento simples. Isso é relevante porque no 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 */
}
Essa função acaba sendo chamada para preencher o ifindex e simplesmente usa a interface IOCTL para recuperar o valor SIOCGIFINDEX do kernel do Linux.
Quando me deparei com um problema dessa natureza com um sistema de monitoramento baseado em SNMP, acabei usando um meio alternativo para fazer referência às interfaces de rede. Em particular, usei o nome da interface em vez do número do índice da interface (por exemplo, "eth0", "eth1", "vlan150", etc.).