Você está na página 1de 7

O comando “ip”

Publicado em abril 28, 2011 por Ronaldo Afonso Este é meu primeiro artigo para o meu blog “Linux e rede de computadores”. Como primeiro assunto, resolvi falar de maneira bem geral sobre o comando “ip“. Há algum tempo atrás comecei a usar o comando “ip” em vez do “ifconfig” para configurar endereços IP no Linux. Depois de algum tempo resolvi ler o “man ip” e, para minha surpressa, descobri que esse comando pode ser usado para muitas outras coisas. A partir de então abandonei o “ifconfig”. Vou contar agora o porquê. Estamos acostumados a usar os comandos “arp”, “ifconfig” e “route” para configurar ou analisar os diversos parâmetros de rede no Linux. Essas ferramentas são muito úteis, porém a partir da versão 2.2 do kernel do Linux, um novo subsistema de rede foi desenvolvido e essas ferramentas, apesar de ainda funcionarem bem, não conseguem tirar o máximo proveito das funcionalidades que o novo subsistema nos oferece. Com o próposito de aproveitar ao máximo esse novo subsistema de rede, uma nova ferramenta foi desenvolvida, “o comando ip”. A principal diferença desse comando é que além de reunir todas as funções dos comandos “arp”, “ifconfig” e “route”, ele ainda nos oferece muitas outras. Veja como são normalmente executados os comandos “arp”, “ifconfig” e “route”: arp -n ifconfig -a route -n Agora veja o comando “ip”: ip neigh show ip addr show ip route show Bem mais intuitivo, não acha? Se ficou curioso em relação às saídas desses comandos, execute eles aí no seu Linux e veja a diferença. Nós podemos também simplesmente listar quais interfaces de rede estão presentes no sistema sem nos preocupar se elas têm ou não um endereço IP associado. Este é um novo conceito trazido pelo comando “ip”, ou seja, a separação do protocolo da camada de rede, como por exemplo o IPv4 e o IPv6, da interface de rede. Exemplo:
1 2 3 4 5 root@linux:~# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:19:5b:69:5d:d7 brd ff:ff:ff:ff:ff:ff

168. Inclusive endereços em uma mesma rede IP. Veja a execução destes três comandos: root@linux:~# ip rule show 0: from all lookup 02 local 32766: from all lookup 03 main 01 .16.16.168. Eu irei detalhar melhor a função “route” do comando “ip” em um próximo artigo. outra com o endereço 10.0. Veja como fica configurada uma interface de rede após a execução dos quatro comandos anteriores: 1 2 3 4 5 6 7 root@linux:~# ip addr show dev eth0 1: eth0: mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:19:5b:69:5d:d7 brd ff:ff:ff:ff:ff:ff inet 192. mas podemos criar muitas outras. “IP Aliasing”.16. e esses com o mesmo peso.0. Dois exemplos de utilização dessa funcionalidade é quando temos um roteador conectado a dois links de Internet. nós podemos definir uma terceira tabela de rotas que tem como rota “default” os dois links.0.0. não saia pelo link 2.22.0. nós teríamos uma interface de rede com endereço 192. Outra utilização é para fazermos “Load Balancing” de links.168. Exemplo: root@linux:~# dev eth0 root@linux:~# 2 dev eth0 root@linux:~# 3 eth0 root@linux:~# 4 eth0 1 ip addr add 192.0. por exemplo.1/16 scope global eth0 inet 10.0.1/16 ip addr add 10. Com as mesmas duas tabelas do exemplo de dois links.2/8 dev Se fôssemos usar o comando ifconfig.1/8 dev ip addr add 10. ou melhor.0. Outro conceito que morre com o comando “ip” é o de interface virtual.0. Desta forma nós evitamos que um pacote que entre em nossa rede pelo link 1.1/24 scope global eth0 inet 172.1 e por último uma interface com o endereço 10. Com o comando “ip” nós podemos atribuir vários endereços IP a uma mesma interface de rede.1 e teríamos que criar mais três interfaces virtuais.1.0. Devemos usar uma tabela de rotas para cada um desses links. Você já se perguntou quantas tabelas de rotas existem em um sistema operacional Linux? Por padrão três.Este comando só nos mostra quais interfaces de rede nós temos e não nos mostra informação de protocolo da camada de rede.1/8 scope global eth0 inet 10.0.0.2/8 scope global secondary eth0 Outra vantagem do comando “ip” é que é possível criar mais de uma tabela de rotas e definir políticas para quais tabelas serão usadas. uma com o endereço 172.22.22.1/24 ip addr add 172.0.2.0.0.

1 169.0/24 dev eth0 proto kernel scope link src 192.0.151 metric 1 192.0. mas podemos dizer qual tabela queremos que seja mostrada da seguinte forma: 1 2 3 4 5 6 7 root@linux:~# ip route show table main 192.168.0. como por exemplo o IPv4 e o IPv6.0.120.0. Quando nós executamos o comando “ip route show” ele nos mostra a tabela “main”.0/8 dev eth0 proto kernel scope link src 10. hoje irei falar sobre o “ip addr”. Com o comando “ip route add table”número da tabela”.168.16.0.0. O comando “ip addr” é utilizado no Linux para configurar parâmetros relacionados com os protocolos da camada de rede.254.16. .0/21 dev wlan1 proto kernel scope link src 192.168.168.04 05 06 07 32767: from all lookup default root@linux:~# ip rule add table 5 root@linux:~# ip rule show 0: from all lookup 09 local 32765: from all 10 lookup 5 32766: from all lookup 11 main 32767: from all lookup 12 default 08 É assim que criamos uma nova tabela de rotas.1 default via 192. 2011 por Ronaldo Afonso Seguindo com a sequência de artigos sobre o comando “ip”.123.168.248 metric 2 172.0/16 dev eth0 proto kernel scope link src 172.1 dev eth0 proto static Estas são somente algumas das vantagens e funcionalidades do comando “ip”.0/16 dev eth0 scope link metric 1000 10.22.0.0. Alguns exemplos são: • • • Criação de interfaces do tipo túnel (ip tunnel) Monitoramento do estado de uma interface (ip monitor) Configuração do tipo de enfileiramento dos pacotes de uma interface (ip link) O comando “ip addr” Publicado em maio 5. Existem muito mais coisas que podemos fazer com essa ferramenta.

0.UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:19:5b:69:5d:d7 brd ff:ff:ff:ff:ff:ff inet 192. Se você quiser listar todas as interfaces disponíveis no seu sistema.168. para o IPv4. a interface “loopback”. para o IPv6. Veja o exemplo: root@linux:~# ip addr show dev eth0 2: eth0: MULTICAST. Vamos esquecer por um momento a linha iniciada por “link/ether”. e “inet6″. Essa interface é a segunda interface reconhecida pelo sistema Linux onde eu executei o comando “ip addr show dev eth0″. vou adicionar um endereço IPv6 a interface “eth0″. atribuídos à interface “eth0″. Neste momento o que é importante perceber são os valores para o endereço IP. A primeira função que iremos ver e a mais simples do comando “ip addr” é a de listar quais endereços IP estão configurados em uma interface de rede. Veja o exemplo: root@linux:~# ip addr add 2001:0db8:0:f101::1/64 dev eth0 E novamente listando os endereços: root@linux:~# ip addr show dev eth0 2: eth0: MULTICAST. uma grande diferença entre o comando “ip addr” e o “ifconfig” é que com o “ip addr” não precisamos mais da funcionalidade de “IP Aliasing”. um IPv4 e outro IPv6.Como eu já mencionei no artigo anterior “O comando ip”. ou seja.168. . Para os exemplos a seguir eu irei utilizar uma interface do tipo Ethernet que no Linux é geralmente representada pelo nome “eth0″. eu irei explicá-la em um próximo artigo. Agora para exemplificar a configuração de um endereço IP.Normalmente a primeira interface ativa no sistema é a interface “lo”. o comando “ip addr show” nos mostra para qual versão um determinado endereço foi configurado através dos nomes “inet”. IPv4 ou IPv6. e neste caso IPv4. Isso está indicado logo no começo da listagem pelo número “2:”.UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:19:5b:69:5d:d7 brd ff:ff:ff:ff:ff:ff inet 192. execute o comando “ip addr show” sem o parâmetro “dev” da seguinte forma: ip addr show Para cada versão do protocolo IP.1/24 scope global eth0 Alguns dos valores mostrados eu irei explicar em um próximo artigo.0.1/24 scope global eth0 inet6 2001:db8:0:f101::1/64 scope global tentative valid_lft forever preferred_lft forever Agora nossa interface tem dois endereços IP configurados.

mesmo entre placas de um mesmo fabricante. O comando “ip neigh” Publicado em junho 1.UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:19:5b:69:5d:d7 brd ff:ff:ff:ff:ff:ff Estas são as formas mais básicas de uso do comando “ip addr”. ou seja. Esse processo de descobrimento deve acontecer sempre antes que um pacote de camada de rede. um outro tipo de endereço é necessário. Antes de enviar um pacote IP o subsistema de “neighboring” do Linux descobre qual é o endereço MAC associado ao endereço IP da máquina para qual se quer enviar esse pacote. O que é um “neighbor”? . seja enviado. Cada endereço MAC é único. é o nome de um subsistema do kernel do Linux responsável por descobrir quais máquinas estão diretamente conectadas à máquina onde este Linux está sendo executado. O funcionamento desses protocolos é tema para um próximo artigo. Esse endereço é conhecido como “MAC Address“. como por exemplo o IPv4 ou o IPv6. mas basicamente o descobrimento de um “neighbor” é feito através de uma requisição e uma resposta. Em redes locais.Podemos remover todos os endereços de uma só vez usando a função “flush” da seguinte forma: root@linux:~# ip addr flush dev eth0 E então a interface ficará sem endereços IP: root@linux:~# ip addr show dev eth0 2: eth0: MULTICAST. Essa descoberta é feita através de dois protocolos: para endereços IPv4 o Linux usa o protocolo ARP (“Address Resolution Protocol”) e para endereços IPv6 o Linux usa o protocolo ND (“Neighbor Discovery”). Um simples endereço IP não é suficiente para que um pacote seja entregue à máquina de destino. Estes assuntos ficarão para um próximo artigo. não existem duas placas de rede com o mesmo endereço MAC. na mesma rede local e como o comando “ip neigh” é usado nesse cenário. ou seja. do inglês vizinhança. ou “Media Access Control Address”. Existem algumas outras funções que não mencionei ainda pois gostaria de falar antes sobre outros comandos como o “ip neigh” e o “ip route”. Conceitos de “neighboring” “Neighboring”. 2011 por Ronaldo Afonso Neste artigo irei falar um pouco sobre como o Linux se comunica com máquinas que estão próximas a ele.

REACHABLE – Uma solicitação de endereço MAC foi enviada e a resposta já foi recebida.168. • . Veja um exemplo do comando “ip neigh”: root@linux:~# ip neigh show 192. se essas máquinas forem capazes de se comunicar sem a utilização de um roteador. um “switch” ou até mesmo um link PPP. uma tentativa de ping ou uma mudança de endereço IP são exemplos de situações que causam mudança de status NUD em uma tabela de “neighbors”. ou seja.1 dev wlan0 lladdr 00:11:22:33:44:55 STALE 192. ainda não foi configurado em nenhum “neighbor”. PERMANENT – Nesse estado o relacionamento de um endereço MAC com um endereço IP foi definido estaticamente.168.1. adicionar ou remover entradas na tabela de “neighbors”.168. um “hub“. Exemplos: máquinas conectadas através de um cabo cruzado. Aliás.1. se essas duas máquinas estiverem diretamente conectadas em uma mesma rede e se também estiverem em uma mesma rede IP. pois. O subsistema de “neighboring” do Linux constantemente verifica o status dos “neighbors” e atualiza essa tabela. Eu vou evitar o termo “tabela ARP”. o protocolo ARP irá morrer um dia junto com o IPv4. ou “Neighbor Unrechability Detection”. ou vizinhas. para endereços IPv6 o protocolo ARP não é usado. como já foi dito. Estes são alguns dos status que uma entrada da tabela pode ter: • • • INCOMPLETE – Uma solicitação de endereço MAC foi enviada. E o comando “ip neigh”? O comando “ip neigh” é usado para listar. um administrador de redes simplesmente o definiu. Outra informação mostrada é o “NUD”. O desligamento de um “neighbor”.O Linux considera duas máquinas como sendo “neighbors”. uma “bridge“.168. mas nenhuma resposta foi recebida ainda. aparentemente. FAILED – Uma solicitação de endereço MAC foi enviada mas nenhuma resposta foi recebida.10.1. não foi o subsistema de “neighboring” do Linux que descobriu esse relacionamento.1 e o endereço IPv4 192. ou seja. ou tabela de associação entre endereços MAC e endereços IP.10 dev wlan0 INCOMPLETE Neste exemplo vemos que um “neighbor” que tem endereço MAC 00:11:22:33:44:55 foi configurado com o endereço IPv4 192.1. Isso indica que não existe um neighbor configurado com o endereço IP solicitado. Duas ou mais máquinas estão diretamente conectadas se elas estiverem em um mesmo domínio de broadcast. Cada entrada da tabela de “neighbors” tem um status que vai se modificando conforme acontecem modificações na rede e conforme o Linux vai tentando se comunicar com seus “neighbors”.

20 dev wlan0 lladdr 11:22:33:44:55:66 PERMANENT 192.1 dev wlan0 lladdr 00:11:22:33:44:55 STALE Neste caso indicamos o NUD status como “permanent” e essa entrada nunca sairá da tabela de “neighbors”. Pretendo falar sobre “Proxy ARP” em um próximo artigo. consulte o man ip(8).168.Veja agora um exemplo de como adicionar uma entrada permanente na tabela de neighbors: root@linux:~# ip neigh add 192.1. Para mais informações.1. Pelo menos não até um próximo reboot. Então esperem mais detalhes sobre o comando “ip neigh” e o subsistema de “neighboring” do Linux.1.168.168. Isto é apenas um pouco do que podemos fazer com o comando “ip neigh”. Até a próxima! Ronaldo Afonso .20 lladdr 11:22:33:44:55:66 nud permanent dev wlan0 root@linux:~# ip neigh show 192.