O ifconfig
comando em sistemas operacionais como FreeBSD e OpenBSD foi atualizado de acordo com o restante do sistema operacional. Atualmente, ele pode definir todos os tipos de configurações de interface de rede nesses sistemas operacionais e lidar com uma variedade de protocolos de rede. Os BSDs fornecem ioctl()
suporte para essas coisas.
Isso não aconteceu no mundo Linux. Hoje existem três ifconfig
comandos:
ifconfig
de inetutils GNUjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Encap do link: Loopback local
endereço inet: 127.0.0.1 Bcast: 0.0.0.0 Máscara: 255.0.0.0
UP LOOPBACK EM FUNCIONAMENTO MTU: 65536 Métrico: 1
Pacotes RX: 9087 erros: 0 eliminados: 0 excedentes: 0 quadro: 0
Pacotes TX: 9087 erros: 0 eliminados: 0 excedentes: 0 transportadora: 0
colisões: 0 txqueuelen: 1000
Bytes RX: 51214341 Bytes TX: 51214341
jdebp%
-
ifconfig
das ferramentas de rede NET-3 jdebp% ifconfig -l
ifconfig: option --help 'fornece informações de uso.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de rede 255.0.0.0
inet6 :: 1 prefixo 128 escopo 0x10 <host>
inet6 :: 2 prefixo 128 escopo 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 escopo 0x20 <link>
loop txqueuelen 1000 (loopback local)
Pacotes RX 9087 bytes 51214341 (48,8 MiB)
Erros de RX 0 eliminados 0 excedem 0 quadros 0
Pacotes TX 9087 bytes 51214341 (48,8 MiB)
Erros de TX 0 eliminados 0 excedentes 0 transportadora 0 colisões 0
jdebp%
-
ifconfig
(versão 1.40 de) o conjunto de ferramentas nosh jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
eis
vincular a execução de loopback
endereço de link 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
endereço inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1
endereço inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
inet6 address :: 2 scope 0 prefixlen 128
endereço inet6 fe80 :: prefixo 1 do escopo 1 10
endereço inet6 :: 1 escopo 0 prefixo 128
jdebp% sudo ifconfig para o alet do inet4 127.1.0.2
jdebp% sudo ifconfig para o inet6 :: 3/128 alias
jdebp% ifconfig lo
eis
vincular a execução de loopback
endereço de link 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
endereço inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1
endereço inet4 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2
endereço inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
inet6 address :: 3 scope 0 prefixlen 128
inet6 address :: 2 scope 0 prefixlen 128
endereço inet6 fe80 :: prefixo 1 do escopo 1 10
endereço inet6 :: 1 escopo 0 prefixo 128
jdebp%
Como você pode ver, os inetutils GNU e as ferramentas de rede NET-3 ifconfig
têm algumas deficiências marcadas, com relação ao IPv6, com relação a interfaces que possuem vários endereços e com relação a funcionalidades como -l
.
O problema do IPv6 é em parte algum código ausente nas próprias ferramentas. Mas, em geral, isso é causado pelo fato de o Linux não (como outros sistemas operacionais) fornecer funcionalidade IPv6 através da ioctl()
interface. Ele só permite que os programas vejam e manipulem endereços IPv4 através da rede ioctl()
.
O Linux fornece essa funcionalidade por meio de uma interface diferente send()
e recv()
em uma família de soquetes especial e um tanto estranha AF_NETLINK
.
O GNU e o NET-3 ifconfig
s poderiam ter sido ajustados para usar esta nova API. O argumento contra a fazê-lo foi que não era portável para outros sistemas operacionais, mas estes programas foram, na prática já não portátil de qualquer maneira para que não era muito de um argumento.
Mas eles não foram ajustados e permanecem como mostrados até hoje. (Algumas pessoas trabalharam neles em vários pontos ao longo dos anos, mas é triste dizer que as melhorias nunca foram incluídas nos programas. Por exemplo: Bernd Eckenfels nunca aceitou um patch que adicionava algum recurso da API de netlink às ferramentas de rede NET-3 ifconfig
, 4 anos após o patch ter sido escrito.)
Em vez disso, algumas pessoas reinventaram completamente o conjunto de ferramentas como um ip
comando, que usava a nova API do Linux, tinha uma sintaxe diferente e combinou várias outras funções por trás de uma interface no estilo da moda .command subcommand
Eu precisava de um ifconfig
que tivesse a sintaxe da linha de comando e o estilo de saída do FreeBSD ifconfig
(que nem o GNU nem o NET-3 ifconfig
possuem e que ip
certamente não possui). Então eu escrevi um. Como prova de que alguém pode escrever um ifconfig
que use a API netlink no Linux, ele usa.
Portanto, a sabedoria recebida sobre ifconfig
, como o que você cita, não é mais verdadeira. Agora é falso dizer que " ifconfig
não usa o netlink". O cobertor que cobria dois não cobre três.
Ele sempre foi falso dizer que "netlink é mais eficiente". Para as tarefas com as quais se realiza ifconfig
, não há muito em termos de eficiência entre a API netlink e a ioctl()
API. Um faz praticamente o mesmo número de chamadas de API para qualquer tarefa.
De fato, cada chamada de API é composta por duas chamadas de sistema no caso netlink, em oposição a uma no ioctl()
sistema. E, sem dúvida, a API netlink tem a desvantagem de que, em um sistema muito usado, incorpora explicitamente a possibilidade de a ferramenta nunca receber uma mensagem de confirmação informando o resultado da chamada da API.
É, além disso, falso dizer que ip
é "mais versátil" que o GNU e NET-3 ifconfig
s , porque ele usa netlink . É mais versátil porque realiza mais tarefas, fazendo coisas em um grande programa que se faria com programas separados que não ifconfig
. Não é mais versátil simplesmente por meio da API que ela usa internamente para executar essas tarefas extras. Não há nada inerente à API sobre isso. Pode-se escrever uma ferramenta tudo-em-um que usou o FreeBSD ioctl()
API, por exemplo, e igualmente bem estado que é "mais versátil" do que os individuais ifconfig
, route
, arp
, e ndp
comandos.
Pode-se escrever route
, arp
e ndp
comandos para Linux que utilizaram o API netlink, também.
Leitura adicional
ip
mais versátil, porque todos os tipos de recursos interessantes são simplesmente impossíveis de se usar usando ioctls no Linux (porque os ioctls não estão lá e provavelmente nunca estarão).