segunda-feira, 30 de outubro de 2017

Substituindo ifconfig por ip Debian 8 e 9


jack-ip-1
Se você esteve no Linux por tempo suficiente, você sabe que as ferramentas vão e vem. Este foi considerado o caso em torno de 2009, quando a lista de discussão debian-devel anunciou planos de depreciação do pacote de ferramentas líquidas devido à falta de manutenção. Agora é 2015 e as ferramentas de rede ainda estão por aí. Na verdade, a partir do Ubuntu 14.10, você ainda pode emitir o comando ifconfig para gerenciar sua configuração de rede.
No entanto, em alguns casos (por exemplo, o recipiente Ubuntu Docker ), o conjunto de ferramentas de rede não está instalado por padrão. Isso significa que o comando ifconfig não está disponível. Embora você possa instalar net-tools com o comando
  sudo apt-get install net-tools 
é mais frequente recomendar avançar com o comando que substituiu ifconfig. Esse comando é ip, e faz um ótimo trabalho para entrar no ifconfig desatualizado.
A coisa é, ip não é uma substituição drop-in para ifconfig. Existem diferenças na estrutura dos comandos. Mesmo com essas diferenças, ambos os comandos são usados ​​para fins semelhantes.Na verdade, ip pode fazer o seguinte:
  • Descubra quais interfaces são configuradas em um sistema
  • Consulta o status de uma interface de rede
  • Configure as interfaces de rede (incluindo loopback local e Ethernet)
  • Traga uma interface para cima ou para baixo
  • Gerencie o roteamento padrão e estático
  • Configurar o túnel sobre IP
  • Configurar a entrada de cache ARP ou NDISC
Com tudo isso dito, vamos embarcar em substituir ifconfig por ip. Vou oferecer alguns exemplos de como o comando de substituição é usado. Compreenda que este comando exige privilégios de administrador (então você terá que su para criar ou fazer uso de sudo - dependendo da sua distribuição). Como esses comandos podem fazer alterações nas informações de rede da sua máquina, use-as com cautela.
NOTA: Todos os endereços usados ​​neste procedimento são exemplos. Os endereços que você usará serão ditados pela sua rede e seu hardware.
Agora, com o how-to.

Juntando informações

A primeira coisa que a maioria das pessoas aprende com o comando ifconfig é como descobrir qual endereço IP foi atribuído a uma interface. Isso geralmente é feito com o comando ifconfig e sem sinalizadores ou argumentos. Para fazer o mesmo com o comando ip, ele é executado como tal:
  ip a 
Este comando irá listar todas as interfaces com as informações associadas (Figura 1 acima).
Digamos que você só deseja ver as informações IPv4 (para maior clareza). Para fazer isso, emita o comando:
  ip -4 a 
Ou, se você quiser apenas ver informações IPv6:
  ip -6 a 
E se você quiser apenas ver informações sobre uma interface específica? Você pode listar informações para uma conexão sem fio com o comando:
 ip um show wlan0 
Você pode até se tornar mais específico com este comando. Se você quiser apenas ver IPv4 na interface wlan0, emita o comando:
  ip -4 um show wlan0 
Você pode até listar apenas a interface executando usando:
  ip link ls up 

Modificando uma interface

Agora entramos no coração do comando ... usando-o para modificar uma interface. Suponha que você quisesse atribuir um endereço específico à primeira interface ethernet, eth0. Com o comando ifconfig, isso pareceria:
  ifconfig eth0 192.168.1.101 
Com o comando ip, isso agora parece:
  ip a add 192.168.1.101/255.255.255.0 dev eth0 
Você poderia encurtar um pouco com:
  ip a add 192.168.1.101/24 dev eth0 
Claramente, você precisará saber a máscara de sub-rede do endereço que você está atribuindo.
E sobre como excluir um endereço de uma interface? Com o comando ip, você também pode fazer isso. Por exemplo, para excluir o endereço apenas atribuído ao eth0, emita o seguinte comando:
  ip a del 192.168.1.101/24 dev eth0 
E se você quiser simplesmente liberar todos os endereços de todas as interfaces? O comando ip tem coberto com este comando:
  ip -s -saf to 192.168.1.0/24 
Outro aspecto crucial do comando ip é a capacidade de abrir / desligar uma interface. Para reduzir o eth0, emita:
  ip link set dev eth0 down 
Para fazer backup do eth0, use:
  conjunto de links IP dev eth0 up 
Com o comando ip, você também pode adicionar e excluir gateways padrão. Isso é assim:
  ip route add default via 192.168.1.254 
Se você quiser se detalhar sobre suas interfaces, você pode editar a fila de transmissão. Você pode configurar a fila de transmissão para um valor baixo para interfaces mais lentas e um valor maior para interfaces mais rápidas. Para fazer isso, o comando pareceria:
  ip link set txqueuelen 10000 dev eth0 
O comando acima configuraria uma fila de transmissão elevada. Você pode brincar com esse valor para encontrar o que funciona melhor para o seu hardware.
Você também pode definir a unidade de transmissão máxima (MTU) da sua interface de rede com o comando:
  ip link set mtu 9000 dev eth0 
Depois de ter feito as alterações, use ip uma lista eth0 para verificar se as mudanças entraram em vigor.

Gerenciando a tabela de roteamento

Com o comando ip você também pode gerenciar as tabelas de roteamento do sistema. Este é um elemento muito poderoso do comando ip, e você deve usá-lo com cautela.
Suponha que você deseja visualizar todas as tabelas de roteamento. Para fazer isso, você emitiria o comando:
  ip r 
A saída deste comando será semelhante à mostrada na Figura 2.
jack-ip-2-crop
Agora, diga que deseja encaminhar todo o tráfego através do gateway 192.168.1.254 conectado via interface de rede eth0: Para fazer isso, emita o comando:
  ip route add 192.168.1.0/24 dev eth0 
Para excluir a mesma rota, emita:
  ip route del 192.168.1.0/24 dev eth0 
Este artigo deve servir como apenas uma introdução ao comando ip. Isso, é claro, não significa que você deve pular imediatamente do ifconfig. Como a desaprovação do ifconfig foi tão lenta, o comando ainda existe em várias distribuições. Mas, por ocasião de que o falecimento finalmente desapareça da visão, você estará pronto para fazer a transição com facilidade. Para obter informações mais detalhadas sobre o comando ip, dê uma olhada na página ip man emitindo o comando man ip a partir de uma janela de terminal.

sábado, 28 de outubro de 2017

Nomes de interface de rede previsível nova nomenclatura


Começando com o v197 systemd / udev atribuirá automaticamente nomes de interface de rede estáveis ​​e estáveis ​​para todas as interfaces Ethernet, WLAN e WWAN locais. Esta é uma partida do esquema de nomeação da interface tradicional ("eth0", "eth1", "wlan0", ...), mas deve consertar problemas reais.

Por quê?

O esquema de nomeação clássico para interfaces de rede aplicado pelo kernel é simplesmente atribuir nomes que começam com "eth0", "eth1", ... para todas as interfaces à medida que são testadas pelos drivers. Como a sondagem do driver geralmente não é previsível para a tecnologia moderna, isso significa que, assim que as várias interfaces de rede estiverem disponíveis, a atribuição dos nomes "eth0", "eth1" e assim por diante geralmente não é corrigida e pode muito bem acontecer que " eth0 "em uma inicialização acaba sendo" eth1 "no próximo. Isso pode ter sérias implicações de segurança, por exemplo em regras de firewall que são codificadas para determinados esquemas de nomeação e, portanto, muito sensíveis a nomes de mudanças imprevisíveis.
Para resolver este problema, foram propostas e implementadas várias soluções. Durante mais tempo, o udev enviou suporte para atribuir nomes "ethX" permanentes a certas interfaces com base em seus endereços MAC. Isso resultou em uma grande quantidade de problemas, entre eles: isso exigiu um diretório raiz gravável que geralmente não está disponível; a apatridia do sistema é perdida quando a inicialização de uma imagem do sistema operacional em um sistema resultará na alteração da configuração da imagem; em muitos sistemas, os endereços MAC não são realmente corrigidos, como em muitos hardware incorporado e particularmente em todos os tipos de soluções de virtualização. O maior de todos, no entanto, é que os componentes do espaço de usuários que tentam atribuir o nome da interface correu contra o kernel atribuindo novos nomes do mesmo espaço de nomes "ethX", uma condição de corrida com todos os tipos de efeitos estranhos, entre eles que a atribuição de nomes às vezes falhou. Como resultado, o suporte para isso foi removido do systemd / udev há algum tempo.
Outra solução que foi implementada é "biosdevname" que tenta encontrar informações de topologia de slot fixas em certas interfaces de firmware e as usa para atribuir nomes fixos a interfaces que incorporam sua localização física na placa-mãe. De certa forma, esse esquema de nomeação é semelhante ao que já foi feito nativamente em udev para vários nós de dispositivos via / dev / * / by-path / links simbólicos. Em muitos casos, o biosdevname parte dos esquemas de identificação de dispositivo de núcleo de baixo nível que a udev geralmente usa para esses links simbólicos e, em vez disso, inventa seus próprios esquemas de enumeração.
Finalmente, muitas distribuições suportam interfaces de renomeação para nomes escolhidos pelo usuário (pense: "internet0", "dmz0", ...) bloquearam seus endereços MAC ou locais físicos como parte de seus scripts de rede. Esta é uma escolha muito boa, mas tem o problema de que isso implica que o usuário está disposto e capaz de escolher e atribuir esses nomes.
Acreditamos que é uma boa escolha padrão para generalizar o esquema iniciado pelo "biosdevname". A atribuição de nomes fixos com base em informações de firmware / topologia / localização tem a grande vantagem de os nomes serem totalmente automáticos, totalmente previsíveis, que eles permaneçam fixos, mesmo que o hardware seja adicionado ou removido (ou seja, não há reenenção) e que o hardware quebrado pode ser substituído perfeitamente. Dito isto, eles são, às vezes, mais difíceis de ler do que o "eth0" ou "wlan0", todos estão acostumados. Exemplo: "enp5s0"

O que mudou exatamente em v197?

Com o sistema 197, adicionamos suporte nativo para uma série de diferentes políticas de nomeação no sistema / udevd propriamente dito e criamos um esquema semelhante aos sistemas de identificação de dispositivos internos do biosdevname (mas geralmente mais poderosos e mais próximos do kernel) padrão. Os seguintes diferentes esquemas de nomeação para interfaces de rede agora são suportados pela udev nativamente:
  1. Os nomes que incorporam o Firmware / BIOS forneceram números de índice para dispositivos de bordo (exemplo: eno1 )
  2. Os nomes que incorporam o firmware / BIOS fornecem números de índice de slot de hotplug PCI Express (exemplo: ens1 )
  3. Nomes que incorporam a localização física / geográfica do conector do hardware (exemplo: enp2s0 )
  4. Nomes que incorporam o endereço MAC das interfaces (exemplo: enx78e7d1ea46da )
  5. Clássico, imprevisível kernel-native ethX nomeação (exemplo: eth0 )
Por padrão, o sistema v197 agora nomeará as interfaces após a política 1) se essas informações do firmware forem aplicáveis ​​e disponíveis, retornando para 2) se essa informação do firmware for aplicável e disponível, voltando para 3) se aplicável, caindo de volta para 5) em todos os outros casos. Política 4) não é usada por padrão, mas está disponível se o usuário assim o optar.
Esta política combinada só é aplicada em último recurso. Isso significa que, se o sistema tiver o biosdevname instalado, prevalecerá. Se o usuário tiver adicionado regras udev que alterem o nome dos dispositivos kernel, isso também terá precedência. Além disso, todos os esquemas de nomenclatura específicos da distribuição geralmente têm precedência.

Venha novamente, o que isso faz?

Com este novo esquema, você agora obtém:
  • Nomes de interface estáveis ​​em reinicializações
  • Nomes de interface estáveis ​​mesmo quando o hardware é adicionado ou removido, ou seja, não existe uma nova enumeração (para o nível que o firmware permite)
  • Nomes de interface estáveis ​​quando kernels ou drivers são atualizados / alterados
  • Nomes de interface estáveis ​​mesmo se você tiver que substituir cartões de ethernet quebrados por novos
  • Os nomes são determinados automaticamente sem a configuração do usuário, eles apenas funcionam
  • Os nomes das interfaces são totalmente previsíveis, ou seja, apenas olhando para lspci, você pode descobrir o que a interface será chamada
  • Operação totalmente apátrida, alterar a configuração de hardware não resultará em mudanças em / etc
  • Compatibilidade com a raiz somente leitura
  • A nomeação da interface de rede agora segue mais de perto o esquema usado para aliasing nodos de dispositivo de bloco e outros nós de dispositivo em / dev via links simbólicos
  • Aplicabilidade às máquinas x86 e não x86
  • O mesmo em todas as distribuições que adotaram systemd / udev
  • É fácil cancelar o esquema (veja abaixo)
Isso tem alguma desvantagem? Sim. Anteriormente, estava praticamente garantido que os hosts equipados com uma única placa ethernet possuíam uma única interface "eth0". Com este novo esquema no lugar, um administrador agora tem que verificar primeiro o nome da interface local antes que ele possa invocar comandos sobre ele onde anteriormente ele tinha uma boa chance de que "eth0" fosse o nome certo.

Eu não gosto disso, como desativar isso?

Você basicamente tem três opções:
  1. Você desabilita a atribuição de nomes fixos, de modo que os nomes de kernel imprevisíveis sejam usados ​​novamente. Para isso, simplesmente mascara o arquivo .link da udev para a política padrão: ln -s /dev/null /etc/systemd/network/99-default.link
  2. Você cria seu próprio esquema de nomeação manual, por exemplo, nomeando suas interfaces "internet0", "dmz0" ou "lan0". Para isso, crie seus próprios arquivos .link em / etc / systemd / network /, que escolha um nome explícito ou um esquema de nomeação melhor para um, alguns ou todas as suas interfaces. Consulte systemd.link (5) para obter mais informações.
  3. Você passa a net.ifnames = 0 na linha de comando do kernel

Como o novo esquema de nomeação se parece, precisamente?

Isso está documentado em detalhes em um comentário, bloqueando as origens do net_id incorporado . Por favor, consulte isso caso você esteja se perguntando como decodificar os novos nomes de interface.

Original: https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/