Altera o endereço MAC da interface de rede no nível inferior

2

Sei que posso alterar o endereço MAC de uma interface de rede desativando a interface, usando um comando como ifconfig eth0 hw ether 00:11:22:33:44:55 ou ip link set eth0 address 00:11:22:33:44:55 e, em seguida, reativando a interface. Um comando como ip link show eth0 confirma então que a alteração foi bem sucedida.

Mas recentemente descobri os arquivos em /sys/class/net (originalmente da esta resposta ): cada um deles é um link simbólico para um diretório contendo arquivos com informações sobre a interface conforme documentado aqui Por exemplo, na minha máquina, a interface ethernet é enp3s0 (não tenho idéia do porque tem um nome tão estranho), e /sys/class/net/enp3s0 links para /sys/devices/pci0000:00/0000:00:1c.2/0000:03:00.0/net/enp3s0 .

Nesse diretório, encontrei o arquivo address , que é apenas um arquivo de texto contendo o endereço MAC da interface. Mas quando tento alterar o endereço usando um dos comandos acima, o arquivo address permanece o mesmo, então, aparentemente, os comandos não alteram o endereço MAC no nível mais baixo. Também não é possível alterar este arquivo de qualquer maneira, nem mesmo o superusuário tem permissão para fazer isso.

Então, agora, apenas por curiosidade: é possível alterar o endereço MAC de uma interface de rede neste nível?

    
por sigalor 01.07.2016 / 21:24

2 respostas

5

Antecedentes

Os sistemas de arquivos

/proc e /sys são apenas uma visão das estruturas do kernel, ambos os sistemas de arquivos residem na memória. Embora ambos os sistemas de arquivos sejam graváveis (bem, alguns dos arquivos existentes nele são graváveis), não é sensato assumir que eles se comportam da mesma maneira que um sistema de arquivos real.

Operações que permitem escrever em um arquivo dentro de /proc ou /sys end como ganchos e depois como chamadas de função. Por exemplo:

# echo 3 > /proc/sys/vm/drop_caches

Não grava realmente nesse arquivo, ele chama uma função de kernel do espaço de usuário.

Se uma função não estiver definida para uma determinada gravação, você terá:

write error: Input/output error

Isso porque não faz sentido escrever nesse arquivo. Não é tão diferente de escrever para o dispositivo de caracteres de um dispositivo USB que não tem nenhum driver associado. O kernel não sabe o que fazer.

Não há nenhuma função definida para gravações em relação a /sys/class/net/enp3s0/address , portanto, essa não é uma rota viável para alterar o endereço MAC dessa interface.

Posso alterar o endereço MAC sem chamar ifconfig ou ip link set ?

Sim, você pode.

Se você olhar o código para iproute2 , encontrará muitas análises de argumentos e uma chamada para rtnl_talk . Parece da seguinte forma (isso é do arquivo ip/iplink.c ):

/* lot of argument parsing and 'req' setting */

if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
        exit(2);

return 0;

req.n em que o endereço MAC está sendo passado para rnetlink function rtnl_talk ( man rnetlink é relevante aqui). Se você escrever um programa que execute esta chamada, ele disparará uma chamada do sistema e atualizará o endereço MAC. No entanto, você estará fazendo exatamente o mesmo que ip link set faz.

    
por 01.07.2016 / 22:28
2

Ao alterar seu endereço MAC em um nível mais alto, por exemplo, usando o Network Manager, você não está alterando o endereço MAC físico. Você está "falsificando" o sistema, vinculando o MAC físico ao que você inseriu. O endereço MAC físico é gravado na NIC quando é produzido e não pode ser alterado sem alterar o hardware.

    
por 01.07.2016 / 22:00