Linux ifIndex persistence para SNMP

5

Estamos usando o OpManager para dispositivos de interface montior em caixas de linux remotas. Essas caixas têm VLANs que usamos para coletar informações sobre as redes que estão sendo enviadas para as caixas. Por exemplo, temos eth0.2, eth0.3, eth0.12, eth0.13, eth0.22, eth0.23 (correspondente às vlans 2,3,12,13,22,23, respectivamente).

Estamos usando o SNMP em um endereço IP de gerenciamento para verificar se as interfaces estão ativas. No entanto, nos deparamos com um problema com os índices de interface mudando se tivermos que reiniciar o serviço de rede. Receberemos mensagens de erro como:

A interface 'eth0.23 - eth0.23' está desligada. A descrição da interface é 'eth0.23' e o índice é 11. A identificação do circuito não está configurada.

Mesmo que a interface esteja funcionando.

Como podemos alterar os valores do índice para serem persistentes por meio de reinicializações. Já vimos isso se mudarmos uma interface de IP estático para dinâmico também.

    
por jinanwow 05.08.2010 / 21:01

2 respostas

6

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.).

    
por 06.08.2010 / 06:18
1

Você pode pensar em usar if_indextoname (index_val, index_name). Onde index_val é do tipo int não assinado e index_name é do tipo char *.

Passe o index_val e o kernel linux irá mapeá-lo para corrigir index_name, o qual você pode usar em seu código, pois index_name é o mesmo através de reinicializações.

    
por 25.09.2015 / 07:15