Informática Numaboa - Linux

Dicionário do iproute2

Sab

14

Abr

2007


08:35

  • Imprimir
(19 votos, média 4.37 de 5) 


Nível avançado Este documento contém a descrição do utilitário ip do pacote iproute2. Não é um tutorial ou manual - é apenas um dicionário destinado a auxiliar na tarefa de configurar redes IP e IPv6 no Linux.

Este dicionário foi criado por Alexey N. Kuznetsov, do Instituto para Pesquisa Nuclear de Moscou, em 1999. De acordo com as minhas próprias necessidades fui traduzindo algumas partes e resolvi disponibilizá-las para outros interessados no assunto. Quem sabe, um dia, eu consiga terminar a tradução smile

Índice


ip - sintaxe do comando

A forma genérica de um comando ip é:

ip [ OPÇÕES ] OBJETO [ COMANDO [ ARGUMENTOS ]]

onde OPÇÕES é um conjunto de modificadores opcionais que alteram o comportamento geral do utilitário ip ou modificam sua saída (output). Todas as opções começam com o caracter "-" e podem ser usadas tanto na forma completa, quanto na reduzida. Atualmente estão disponíveis as seguintes opções:

  • -V, -Version: imprime a versão do utilitário ip e sai.
  • -s, -stats, -statistics: dá mais informação. Se a opção aparecer duas ou mais vezes, o volume de informação aumenta. Como regra, as informações são estatísticas ou alguns valores de tempo.
  • -f, -family, seguido por um identificador de família de protocolo (inet, inet6 ou link): força o uso da família de protocolo. Se a opção não estiver presente, a família de protocolo é inferida a partir de outros argumentos. Se o resto da linha de comando não fornecer informação suficiente para inferir a família, o ip volta para o padrão, geralmente inet. "link" é um identificador de família especial indicando que nenhum protocolo de rede está envolvido.
  • -4: atalho para -family inet
  • -6: atalho para -family inet6
  • -0: atalho para -family link
  • -o, -oneline: coloca cada registro numa única linha substituindo os avanços de linha pelo caracter "\". Isto é conveniente quando se quer contar os registros com wc ou fazer um grep da saída. O script rtpr transforma a saída em texto legível.
  • -r, -resolve: usa o tradutor de nomes do sistema para mostrar nomes DNS ao invés de endereços de host.
    info Não use esta opção quando informar bugs ou pedir ajuda.
    info O ip nunca usa o DNS para transformar nomes em endereços.

OBJETO é o objeto que será manipulado ou sobre o qual se quer informações. Os tipos de objeto que atualmente são aceitos pelo ip são:

  • link -- dispositivo de rede
  • address -- endereço do protocolo (IP ou IPv6) de um dispositivo
  • neighbour -- referência no cache ARP ou NDISC
  • route -- referência na tabela de roteamento
  • rule -- regra na base de dados da política de roteamento
  • maddress -- endereço multicast
  • mroute -- referência no cache de roteamento multicast
  • tunnel -- tunnel sobre IP

Novamente os nomes de todos os objetos podem ser escritos na forma completa ou reduzida - por exemplo, address pode ser abreviado para addr ou apenas a.

COMANDO especifica a ação aplicada ao objeto. O conjunto de ações possíveis depende do tipo do objeto. Como regra, é possível adicionar, deletar e mostrar (ou listar) objetos, mas alguns deles não permitem todas estas operações ou possuem alguns comandos adicionais. O comando help está disponível para todos os objetos. Ele devolve uma lista dos comandos disponíveis e convenções de sintaxe dos argumentos.

Se nenhum comando for especificado, algum comando default é assumido. Geralmente é list ou, se os objetos desta classe não puderem ser listados, help.

ARGUMENTOS é uma lista de argumentos para o comando. Os argumentos dependem do comando e do objeto. Existem dois tipos de argumentos: flags, que são uma palavra chave única, e parâmetros, palavras chave seguidas de um valor. Para facilitar, cada comando tem alguns parâmetros default que podem ser omitidos. Por exemplo, o parâmetro dev é o default para o comando ip link. Desta forma, ip link ls eth0 é equivalente a ip link ls dev eth0. Na descrição dos comandos a seguir, estes parâmetros são destacados com o marcador "(default)".

Praticamente todas as palavras chave podem ser abreviadas com as primeiras letras (ou até mesmo com a primeira letra). Os atalhos são convenientes quando o ip é usado de forma interativa, mas não são recomendados em scripts.


ip link show

ABREVIAÇÕES: show, list, lst, sh, ls, l

ARGUMENTOS:
dev NOME (default): NOME especifica o dispositivo de rede que deve ser mostrado.
                    Se este argumento for omitido, todos os dispositivos serão listados.

up                : Mostra apenas as interfaces ativas

FORMATO DA SAÍDA:
kuznet@alisa:~ $ ip link ls eth0
3: eth0:  mtu 1500 qdisc cbq qlen 100
    link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
kuznet@alisa:~ $ ip link ls sit0
5: sit0@NONE:  mtu 1480 qdisc noqueue
    link/sit 0.0.0.0 brd 0.0.0.0
kuznet@alisa:~ $ ip link ls dummy
2: dummy:  mtu 1500 qdisc noop
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
kuznet@alisa:~ $

O número antes dos dois pontos é um índice de intercafe ou ifindex. Este número é uma identificação exclusiva da interface. O número é seguido pelo nome da interface (eth0, sit0, etc). O nome da interface também é exclusivo, mas pode desaparecer da lista (por exemplo, quando o driver correspondente for desativado) e o mesmo nome pode ser dado a uma outra interface criada posteriormente. Além disto, o administrador pode alterar o nome de qualquer dispositivo com ip link set para tornar o nome mais inteligível.

O nome da interface pode ter outro nome ou NONE logo depois do sinal @. Isto significa que o dispositivo está ligado a algum outro dispositivo, isto é, os pacotes enviados por ele são encapsulados e enviados através do dispositivo "master". Se o nome for NONE, o master não é conhecido.

Depois aparece a mtu da interface (maximal transfer unit). A unidade de transferência máxima determina o tamanho máximo dos dados que podem ser enviados em cada pacote através desta interface.

qdisk (queuing discipline ou disciplina de fila) mostra o algoritmo de fila usado pela interface. Particularmente, noqueue significa que a interface não coloca nada na fila e noop significa que a interface está em modo "blackhole" (buraco negro), isto é, todos os pacotes que recebe são imediatamente descartados. qlen é o tamanho default da fila de transmissão do dispositivo medido em pacotes.

As flags da interface flags aparecem entre os colchetes.

  • UP -- o dispositivo está ligado. Está pronto para aceitar pacotes para transmissão e pode injetar no kernel pacotes recebidos de outros nós da rede.
  • BROADCAST -- o dispositivo pode enviar pacotes para todos os hosts compartilhando o mesmo link. Um exemplo típico é um link Ethernet.
  • POINTOPOINT -- o link tem apenas duas extremidades com um nó em cada ponta. Todos os pacotes enviados para este link alcançam o peer e todos os pacotes enviados vêm deste peer único.
    Se o LOOPBACK, ou o BROADCAST, ou o POINTOPOINT estiverem ativados, a interface é considerada como sendo NMBA (Non-Broadcast Multi-Access). Este é o tipo mais genérico de dispositivo e o mais complicado porque o host ligado a um link NBMA não tem como enviar pacotes sem informações adicionais.
  • MULTICAST -- é uma flag de aviso indicando que a interface está ocupada com multicasting, isto é, está enviando pacotes para algum subconjunto de nós vizinhos. Broadcasting é um tipo especial de multicasting onde o grupo multicast é composto por todos os nós do link. É importante enfatizar que o software não deve interpretar a ausência desta flag como uma impossibilidade desta interface usar multicasting. Qualquer link POINTOPOINT e BROADCAST é multicasting por definição porque temos acesso direto a todos os vizinhos e, como consequência, a qualquer parte deles. Transferências multicast de banda larga não são recomendadas em links broadcast-only porque são muito onerosas, mas não são proibidas.
  • PROMISC -- o dispositivo ouve e alimenta o kernel com todo tráfego do link, mesmo se não for destinado para nós, não for broadcast e não destinado para um grupo multicast do qual fazemos parte. Usualmente este modo existe apenas em links broadcast e é utilizado por bridges e para monitorar redes.
  • ALLMULTI -- o dispositivo recebe todos os pacotes multicast que perambulam pelo link. Este modo é usado por roteadores multicast.
  • NOARP -- esta flag é diferente das outras. Não tem um valor fixo e sua interpretação depende do protocolo de rede envolvido. Como regra, ela indica que o dispositivo não precisa de tradução de endereço e que o software ou o hardware sabe como entregar pacotes sem qualquer ajuda das pilhas de protocolo.
  • DYNAMIC -- é uma flag de aviso indicando que a interface é criada e destruída dinamicamente.
  • SLAVE -- esta interface depende de alguma outra interfaces para compartilhar capacidades de link.

info Existem outras flags, mas que são obsoletas (NOTRAILERS), ainda não foram implementadas (DEBUG) ou são específicas para alguns dispositivos (MASTER, AUTOMEDIA e PORTSEL). Estas flags não serão discutidas aqui.

info Os valores das flags PROMISC e ALLMULTI mostrados pelos utilitários ifconfig e ip são diferentes. ip link ls mostra o verdadeiro estado do dispositivo, ao passo que o ifconfig mostra o estado virtual que foi estabelecido pelo próprio ifconfig.

A segunda linha contém informação dos endereços da camada link associados ao dispositivo. A primeira palavra (ether, sit) define o tipo de hardware da interface. Este tipo determina o formato e a semântica dos endereços e faz parte do endereço. O formato default do endereço da estação e do endereço de broadcast (ou o endereço peer para links pointopoint) é uma sequência de bytes hexadecimais separados por dois pontos, mas alguns tipos de link podem ter seu formato de endereço natural, por exemplo, endereços de túneis sobre IP são mostrados como endereços IP de quatro números separados por pontos (conhecidos como dotted-quad).

info Links NBMA não possuem broadcast bem definido ou endereços peer. Entretanto, este campo pode conter informações úteis, por exemplo, sobre o endereço do relay de broadcast ou sobre endereços do servidor ARP.

info Endereços multicast não são mostrados por este comando. Veja ip maddr ls.

Com a opção -statistics, o ip também fornece informações estatísticas sobre a interface:

kuznet@alisa:~ $ ip -s link ls eth0
3: eth0:  mtu 1500 qdisc cbq qlen 100
    link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    2449949362 2786187  0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns 
    178558497  1783945  332     0       332     35172  
kuznet@alisa:~ $

As linhas RX: e TX: resumem estatísticas do receptor e do transmissor. Elas contém:

  • bytes -- o número total de bytes recebidos ou transmitidos pela interface. Este número é truncado quando o comprimento máximo do tipo de dado natural para a arquitetura é excedido. Por este motivo um monitoramento contínuo necessita de um daemon em nível de usuário que extraia os dados periodicamente.
  • packets -- o número total de pacotes recebidos ou transmitidos pela interface.
  • errors -- o número total de erros do receptor ou transmissor.
  • dropped -- o número total de pacotes descartados devido à falta de recurso.
  • overrun -- o número total de overruns do receptor que resultaram em pacotes descartados. Como regra, se a interface for atropelada (overrun), isto significa um problema sério no kernel ou que sua máquina é muito lenta para esta interface.
  • mcast -- o número total de pacotes multicast recebidos. Esta opção só é suportada por poucos dispositivos.
  • carrier -- o número total de falhas de meios físicos do link, por exemplo, perdas de transporte (carrier).
  • collsns -- o número total de colisões num meio tipo Ethernet. Este número pode ter um outro significado em outros tipos de link.
  • compressed -- o número total de pacotes compactados. Isto só está disponível para links que usem compressão VJ header.

Se a opção -s aparecer duas ou mais vezes, o ip fornece estatísticas mais detalhadas sobre os erros do receptor e do transmissor.

kuznet@alisa:~ $ ip -s -s link ls eth0
3: eth0:  mtu 1500 qdisc cbq qlen 100
    link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    2449949362 2786187  0       0       0       0      
    RX errors: length   crc     frame   fifo    missed
               0        0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns 
    178558497  1783945  332     0       332     35172  
    TX errors: aborted  fifo    window  heartbeat
               0        0       0       332    
kuznet@alisa:~ $

Estes nomes de erro são puro Ethernetismo. Outros dispositivos podem ter valores diferentes de zero nestes campos, mas podem ser interpretados de forma diferente.


ip link set

O iproute2 não só pode mostrar os links como também permite criar novos. Para isto existe o comando ip link set.

ABREVIAÇÕES: set, s

ARGUMENTOS:

dev NOME (default): NOME especifica o dispositivo de rede sobre o qual atuar.

up and down       : muda o estado do dispositivo para UP (ligado) ou DOWN (desligado).
arp on / arp off  : muda a flag NOARP no dispositivo.
                    Esta operação não é permitida se o estado do dispositivo for UP porque nem o utilitário ip
                    nem o kernel checam esta condição. Você pode ter resultados inesperados alterando esta flag
                    se o dispositivo estiver rodando.

multicast on
multicast off     : muda a flag de MULTICAST no dispositivo.

dynamic on
dynamic off       : muda a flag DYNAMIC no dispositivo.

name NOME         : muda o nome do dispositivo. Esta operação não é recomendada se o dispositivo estiver
                    rodando ou possuir alguns endereços já configurados.

txqueuelen NÚMERO
txqlen NÚMERO     : altera o comprimento da fila de trânsito do dispositivo.

mtu NÚMERO        : altera a MTU do dispositivo.

address LLADDRESS : altera o endereço da estação na interface.

broadcast LLADDRESS
brd LLADDRESS
peer LLADDRESS    : altera o endereço broadcast da camada link ou o endereço peer quando a interface
                    é POINTOPOINT.

                    OBS: para a maioria dos dispositivos (p/ex/ Ethernet), mudar o endereço broadcast
                    da camada de link quebra a rede. Não use este argumento se você não souber exatamente
                    o que esta operação realmente faz!

info O utilitário ip não altera as flags PROMISC ou ALLMULTI. Estas flags são consideradas obsoletas e não devem ser alteradas administrativamente.


ip address

ABREVIAÇÕES: address, addr, a

Objeto

O endereço é um enderço de protocolo (IP ou IPv6) anexado ao um dispositivo de rede. Cada dispositivo precisa ter pelo menos um endereço para usar o protocolo correspondente. É possível ter vários endereços diferentes associados a um dispositivo. Estes endereços não são discriminados, de modo que o termo alias não é muito apropriado e não será usado neste documento.

O comando ip addr mostra os endereços e suas propriedades, adiciona novos endereços e deleta os dispensáveis.

Comandos

add, delete, flush e show (ou list).


ip address add

ABREVIAÇÕES: add, a

Argumentos

  • dev NOME: o nome do dispositivo ao qual deve ser adicionado o endereço.
  • local ENDEREÇO (default): o endereço da interface. O formato do endereço depende do protocolo. São quatro números decimais separados por pontos para o IP e uma sequência de hexadecimais separados por dois pontos para o IPv6. O ENDEREÇO pode ser seguido por uma barra e um número decimal que codifica o comprimento do prefixo da rede.
  • peer ENDEREÇO: o endereço do ponto terminal remoto para interfaces ponto-a-ponto. Novamente, o ENDEREÇO pode ser seguido por uma barra e um número decimal que codifica o comprimento do prefixo da rede. Se o endereço do peer for especificado, o endereço local não pode ter um comprimento de prefixo. O prefixo da rede está associado ao peer, e não a um endereço local.
  • broadcast ENDEREÇO: o endereço de broadcast da interface.
    É possível usar os símbolos especiais "+" e "-" ao invés do endereço de broadcast. Neste caso, o endereço broadcast pode ser derivado definindo/redefinindo os bits do host do prefixo da interface.

    info Diferentemente do ifconfig, o utilitário ip não define nenhum endereço broadcast a não ser que seja especificamente solicitado.

  • label NOME: cada endereço pode ser identificado com uma string. Para preservar a compatibilidade com os aliases de rede do Linux 2.0, esta string precisa coincidir com o nome do dispositivo ou precisa receber um prefixo com o nome do dispositivo seguido por dois pontos.
  • scope VALOR_ESCOPO: o escopo é a área onde este endereço é válido. Os escopos disponíveis estão listados no arquivo /etc/iproute2/rt_scopes. Valores de escopo pré-definidos são:
    • global: o endereço globalmente válido.
    • site: (apenas IPv6) o endereço é um site local, isto é, só é válido dentro deste site.
    • link: o endereço é um link local, isto é, só é válido neste dispositivo.
    • host: o endereço só é válido para este host.

Exemplos

# ip addr add 127.0.0.1/8 dev lo brd + scope host

Adiciona o endereço loopback habitual no dispositivo loopback.

# ip addr add 10.0.0.1/24 brd + dev eth0 label eth0:Alias

Adiciona o endereço 10.0.0.1 com comprimento de prefixo 24 (isto é, máscara de rede 255.255.255.0),
broadcast padrão e label eth0:Alias para a interface eth0

ip address delete

ABREVIAÇÕES: delete, del, d

Os argumentos são os mesmos do ip addr add. O nome do dispositivo é um argumento obrigatório. O resto é opcional. Se não forem dados argumentos, o primeiro endereço é deletado.

Exemplos

# ip addr del 127.0.0.1/8 dev lo

Deleta o endereço loopback address do dispositivo loopback. É MELHOR NÃO TENTAR FAZER ISTO!

Desativar o IP na interface eth0:

  while ip -f inet addr del dev eth0; do
    : nothing
  done

Outro meio para desabilitar o IP numa interface é usar o ip addr flush.


ip address show

ABREVIAÇÕES: show, list, lst, sh, ls, l

Argumentos

  • dev NOME (default): o nome do dispositivo.
  • scope VAL_ESCOPO: apenas lista endereços com este escopo.
  • to PREFIXO: apenas lista endereços que casam com este prefixo.
  • label PADRÃO: apenas lista endereços com labels que casam com o PADRÃO. O PADRÂO é um padrão normal do estilo shell.
  • dynamic
    permanent
    : (apenas IPv6) lista apenas os endereços instalados devido a uma configuração stateless address ou lista apenas endereços permanentes (não dinâmicos).
  • tentative: (apenas IPv6) lista apenas endereços que não passaram na detecção de endereços duplicados.
  • deprecated: (apenas IPv6) lista apenas endereços descontinuados.
  • primary
    secondary
    : lista apenas endereços primários (ou secundários).

Formato da saída

kuznet@alisa:~ $ ip addr ls eth0
3: eth0:  mtu 1500 qdisc cbq qlen 100
    link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
    inet 193.233.7.90/24 brd 193.233.7.255 scope global eth0
    inet6 3ffe:2400:0:1:2a0:ccff:fe66:1878/64 scope global dynamic 
       valid_lft forever preferred_lft 604746sec
    inet6 fe80::2a0:ccff:fe66:1878/10 scope link 
kuznet@alisa:~ $

As primeiras duas linhas coincidem com a saída de ip link ls. É natural interpretar endereços da camada de link como sendo endereços da família de protocolo AF_PACKET.

Em seguida vem a lista de endereços IP e IPv6, acompanhada por atributos de endereço adicionais: valor do escopo, flags e o identificador (label) do endereço.

Flags de endereço são definidas pelo kernel e não podem ser alteradas administrativamente. No momento, estão definidas as seguintes flags:

  1. secondary: o endereço não é usado quando o endereço de origem default de pacotes que estão saindo é selecionado. Um endereço IP torna-se secundário se já existir outro endereço com os mesmos bits de prefixo. O primeiro endereço é primário, o líder do grupo de todos os endereços secundários. Quando o líder é deletado, todos os endereços secundários também são eliminados.
  2. dynamic: o endereço foi criado devido a uma configuração sem estado (stateless). Neste caso, a saída também mostra informações de tempos, quando o endereço ainda é válido. Depois que preferred_lft expirar, o endereço é colocado no estado deprecated. Depois que valid_lft expirar, o endereço finalmente é invalidado.
  3. deprecated: o endereço é desaprovado, isto é, ainda é válido, mas ão poderá ser usado por novas conexões.
  4. tentative: o endereço não é usado porque a detecção de endereços duplicados ainda não foi completada ou falhou.

ip address flush

Este comando elimina os endereços de protocolo selecionados por algum critério.

ABREVIAÇÕES: flush, f

Este comando possui os mesmos argumentos que o comando show. A diferença é que ele não responde sem argumentos.

atencao Este comando (e outros comandos flush) é bastante perigoso. Se você fizer um erro, ele não perdoa e elimina todos os endereços cruelmente.

Com a opção -statistics o comando se torna verboso. Ele mostra o número de endereços deletados e o número de rodadas feitas para limpar a lista de endereços. Se esta opção for usada duas vezes, ip addr flush também relaciona todos os endereços deletados no formato descrito no tópico ip addr show.

Exemplos

Deletar todos os endereços da rede privada 10.0.0.0/8:

netadm@amber:~ # ip -s -s a f to 10/8
2: dummy    inet 10.7.7.7/16 brd 10.7.255.255 scope global dummy
3: eth0    inet 10.10.7.7/16 brd 10.10.255.255 scope global eth0
4: eth1    inet 10.8.7.7/16 brd 10.8.255.255 scope global eth1

*** Round 1, deleting 3 addresses ***
*** Flush is complete after 1 round ***
netadm@amber:~ #

Outro bom exemplo é desabilitar o IP em todas placas Ethernets:

netadm@amber:~ # ip -4 addr flush label "eth*"

Este último examplo mostra como eliminar todos os endereços IPv6 adquiridos pelo host através da
autoconfiguração de endereços sem estado (stateless) depois que você habilitou o redespacho ou
desabilitou a autoconfiguração.

netadm@amber:~ # ip -6 addr flush dynamic

ip neighbour

Os objetos neighbour (vizinho) estabelecem ligações entre endereços de protocolo e endereços da camada de link para hosts que compartilham o mesmo link. Entradas neighbour ficam organizadas em tabelas. A tabela neighbour IPv4 é conhecida por um outro nome - tabela ARP.

Os comandos correspondentes mostram ligações neighbour e suas propriedades, adicionam novas entradas neighbour e deletam as dispensáveis.

ABREVIAÇÕES: neighbour, neighbor, neigh, n

Comandos

Os comandos são: add, change, replace, delete, flush e show (ou list).


ip neighbour add/change/replace

Estes comando criam novos registros neighbour ou atualizam registros existentes.

ABREVIAÇÕES: add, a; change, chg; replace, repl

Argumentos

  • to ENDEREÇO (default): o endereço de protocolo do vizinho (neighbour). É um endereço IPv4 ou IPv6.
  • dev NOME: a interface à qual o vizinho está anexado.
  • lladdr LLENDEREÇO: o endereço da camada de link do vizinho. LLENDEREÇO também pode ser um null.
  • nud ESTADO_NUD: o estado do registro neighbour. nud é a abreviação de "Neighbour Unreachability Detection" (detecção de não alcance de vizinho). O estado pode ter um dos seguintes valores:
    1. permanent: o registro neighbour é válido para sempre e só pode ser removido administrativamente.
    2. noarp: o registro neighbour é válido. Nenhuma tentativa para validar este registro será feita, mas ele pode ser removido quando seu tempo de vida expirar.
    3. reachable: o registro neighbour é válido até que se esgote o tempo em que pode ser alcançado.
    4. stale: o registro neighbour é válido, porém suspeito. Esta opção para o ip neigh não altera o estado vizinho se foi válido e o endereço não for mudado por este comando.

Exemplos

ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm

     Adiciona um registro ARP permanente para o vizinho 10.0.0.3 no dispositivo eth0.

ip neigh chg 10.0.0.3 dev eth0 nud reachable

     Altera seu estado para reachable (alcançável). 

ip neighbour delete

Este comando invalida um registro neighbour.

ABREVIAÇÕES: delete, del, d

Os argumentos são os mesmos do ip neigh add, só que lladdr e nud são ignorados.

Exemplo

ip neigh del 10.0.0.3 dev eth0

     Invalida o registro ARP para o vizinho 10.0.0.3 no dispositivo eth0.

info O registro eliminado não desaparece das tabelas imediatamente. Se estiver em uso, não pode ser deletado até que o último cliente o libere. Caso contrário, ele será destruído durante a próxima coleta de lixo (garbage collection).

atencao Tentativas de deletar ou alterar manualmente um registro noarp criado pelo kernel pode levar a comportamentos imprevisíveis, especialmente se o kernel tentar resolver este endereço (até mesmo numa interface NOARP) ou se o endereço for multicast ou broadcast.


ip neighbour show

Este comando mostra as tabelas de vizinhos (neighbour)

ABREVIAÇÕES: show, list, sh, ls

Argumentos

  • to ENDEREÇO (default): o prefixo que seleciona os vizinhos que devem ser listados.
  • dev NOME: listar apenas os vizinhos anexados a este dispositivo.
  • unused: listar apenas os vizinhos que não estejam em uso no momento.
  • nud ESTADO_NUD: listar apenas os registros de vizinhos neste estado. ESTADO_NUD pode ter diversos valores listados abaixo ou o valor especial all, que significa todos os estados. Esta opção pode ser repetida. Se a opção estiver ausente, o ip lista todas as entradas com exceção das none e noarp.

Formato da saída

kuznet@alisa:~ $ ip neigh ls
:: dev lo lladdr 00:00:00:00:00:00 nud noarp
fe80::200:cff:fe76:3f85 dev eth0 lladdr 00:00:0c:76:3f:85 router \
    nud stale
0.0.0.0 dev lo lladdr 00:00:00:00:00:00 nud noarp
193.233.7.254 dev eth0 lladdr 00:00:0c:76:3f:85 nud reachable
193.233.7.85 dev eth0 lladdr 00:e0:1e:63:39:00 nud stale
kuznet@alisa:~ $

A primeira palavra de cada linha é o endereço de protocolo do vizinho. Segue o nome do dispositivo. O restante da linha descreve o conteúdo do registro neighbour identificado pelo par dispositivo-endereço.

lladdr é o endereço da camada de link do vizinho.

nud é o estado "neighbour unreachability detection" da máquina para este registro. Veja a lista completa dos estados:

  1. none: o estado do vizinho é void.
  2. incomplete: o vizinho está no processo de resolução.
  3. reachable: o vizinho é válido e aparentemente alcançável.
  4. stale: o vizinho é válido, mas provavelmente não pode ser alcançado. O kernel vai tentar checá-lo na primeira transmissão.
  5. delay: o pacote foi enviado para o vizinho envelhecido (stale) e o kernel está aguardando uma confirmação.
  6. probe: o timer de retardo expirou, mas nenhuma confirmação foi recebida. O kernel começou a testar o vizinho com mensagens ARP/NDISC.
  7. failed: a resolução falhou.
  8. noarp: o vizinho é válido. Nenhuma tentativa para checar o registro será feita.
  9. permanent: é um registro noarp, mas apenas o administrador pode remover o registro da tabela de vizinhos.

O endereço da camada de link é válido em todos os estados, exceto nos estados none, failed e incomplete.

Vizinhos IPv6 podem ser marcados com a flag adicional router, o que significa que o vizinho se apresentou por conta própria como um roteador IPv6.


ip neighbour flush

Este comando limpa as tabelas de vizinhos selecionando registros de acordo com um critério.

ABREVIAÇÕES: flush, f

Este comando aceita os mesmos argumentos que show. A diferença é que ele não roda sem argumentos e que os estados default que devem ser depurados não incluem permanent e noarp.

Com a opção -statistic o comando se torna verboso. Mostra o número de vizinhos deletados e o número de rodadas feitas para limpar a tabela de vizinhos. Se a opção for usada duas vezes, ip neigh flush também mostra todos os vizinhos deletados no formato descrito em ip neighbour show.

Exemplo

netadm@alisa:~ # ip -s -s n f 193.233.7.254
193.233.7.254 dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 \
    nud reachable

*** Round 1, deleting 1 entries ***
*** Flush is complete after 1 round ***
netadm@alisa:~ #

ip route

ABREVIAÇÕES: route, ro, r

Objeto

Entradas de rotas (route) nas tabelas de roteamento do kernel contêm informações sobre caminhos (path) para outros nós da rede. Cada registro de rota possui uma chave constituída por um prefixo (isto é, um par contendo um endereço de rede a o comprimento da sua máscara) e, opcionalmente, o valor TOS (Type of Service). Um pacote IP combina com uma rota se os bits mais altos do seu endereço de destino forem iguais ao prefixo da rota, pelo menos até o comprimento do prefixo, e se o TOS da rota for zero ou igual ao TOS do pacote.

Se várias rotas combinam com o pacote, as seguintes regras são usadas para selecionar a melhor:

  1. O prefixo mais longo é escolhido. Todos os outros são descartados.
  2. Se o TOS de alguma rota com o prefixo mais longo for igual ao TOS do pacote, as rotas com TOS diferentes são descartadas.
    Se não for encontrado um TOS que combine e existirem rotas com TOS=0, o restante das rotas são eliminadas.
    Caso contrário, a procura da rota falha.
  3. Se diversas rotas ficarem disponíveis depois das etapas anteriores, então as rotas com os melhores valores de preferência são selecionadas.
  4. Se ainda existirem diversas rotas, então a primeira delas é selecionada.
    info Observe a ambiguidade da última etapa. Historicamente e infelizmente o Linux permite esta situação bizarra. O sentido da palavra "primeira" depende da ordem em que as rotas foram adicionadas e é praticamente impossível manter uma porção de tais rotas nesta ordem.
    Para simplificar vamos nos limitar ao caso onde uma situação deste tipo seja impossível e onde as rotas são identificadas pelo trio (prefixo, tos, preferência). No momento não é possível criar rotas únicas com comandos ip descritos nesta seção.
    Uma honrosa exceção a esta regra é a rota default em hosts que não fazem encaminhamento (non-forwarding). É "oficialmente" permitido ter diversas rotas de escape (fallback) quando houver vários roteadores em redes diretamente conectadas. Neste caso, o Linux 2.2 faz uma "detecção de gateway morto" (dead gateway detection) controlada por uma detecção de vizinhos que não podem ser alcançados e por avisos de protocolos de transporte para selecionar um roteador operante. Deste modo, a ordem dos roteadores não é essencial. Neste caso, no entanto, brincar com rotas default manualmente não é recomendável - use o protocolo Router Discovery.

Os passos descritos, com certeza, não são executados na sequência indicada. O que acontece é que a tabela de roteamento do kernel é mantida em alguma estrutura de dados para obter o resultado final a um custo mínimo. Entretanto, se não dependermos de um determinado algoritmo de roteamento implementado no kernel, podemos resumir as declarações acima em: uma rota é identificada pelo trio prefixo-tos-preferência e esta chave nos permite localizar a rota na tabela de roteamento.

Atributos

Cada uma das chaves de rota se refere a um registro de informação de rota que contém os dados necessários para entregar pacotes IP (por exemplo, dispositivo de saída e roteador do próximo salto) e alguns atributos opcionais (por exemplo, o caminho MTU ou o endereço de origem preferido para se comunicar com este destino). Estes atributos são descritos a seguir.

Tipos de rota

É importante saber que o conjunto de atributos requeridos e opcionais dependem do tipo da rota. O tipo mais importante de é a unicast. Ela descreve caminhos reais para outros hosts. Como regra, tabelas de roteamento comuns contêm apenas este tipo de rota. Existem, no entanto, outros tipos de rota com uma semântica diferente. A lista completa dos tipos aceitos pelo Linux 2.2 é:

  • unicast -- a entrada desta rota descreve caminhos reais para os destinos cobertos pelo prefixo da rota.
  • unreachable -- estes destinos não podem ser alcançados. Os pacotes são descartados e a mensagem ICMP de host unreachable (host não alcançável) é gerada. Os remetentes locais recebem o erro EHOSTUNREACH.
  • blackhole -- estes destinos não podem ser alcançados. Os pacotes são descartados em silêncio. Os remetentes locais recebem o erro EINVAL.
  • prohibit -- estes destinos não podem ser alcançados. Os pacotes são descartados e a mensagem ICMP communication administratively prohibited (comunicação administrativamente proibida) é gerada. Os remetentes locais recebem o erro EACCES.
  • local -- os destinos são atribuídos a este host. Os pacotes são devolvido e entregues localmente.
  • broadcast -- os destinos são endereços de broadcast. Os pacotes são enviados como broadcasts de link.
  • throw -- uma rota de controle especial usada conjuntamente com regras da política de regras. Se uma destas rotas for selecionada, a verificação desta tabela é interrompida dando a entender que nenhuma rota foi encontrada. A falta de uma política de roteament equivale à ausência da rota na tabela de roteamento. Os pacotes são descartados e uma mensagem ICMP net unreachable (rede não alcançável) é gerada. Os remetentes locais recebem o erro ENETUNREACH.
  • nat -- uma rota NAT especial. Os destinos cobertos pelo prefixo não são considerados endereços fictícios (dummy) ou externos que exigem uma tradução para endereços reais (ou internos) antes do re-envio. Os endereços que devem ser traduzidos são selecionados com o atributo via.
  • anycast -- (não implementado) os destinos são endereços anycast designados para este host. A grosso modo são equivalentes aos locais, com uma diferença: estes endereços são inválidos quando usados como endereços de origem de qualquer pacote.
  • multicast -- um tipo especial usado para roteamento multicast. Não está presente em tabelas de roteamento normais.

Tabelas de roteamento

O Linux 2.2 pode colocar rotas em diversas tabelas de roteamento identificadas por um número que vai de 1 a 255 ou por um nome que conste no arquivo /etc/iproute2/rt_tables. Como default, todas as rotas normais são colocadas na tabela principal (ID 254) e o kernel usa esta tabela apenas quando estiver calculando rotas.

No momento existe uma outra tabela, invisível mas mais importante. É a tabela local (ID 255). Esta tabela contém rotas para endereços locais e de broadcast. O kernel mantém esta tabela automaticamente e o administrador geralmente não precisa modificá-la ou tomar conhecimento de que ela existe.

As múltiplas tabelas de roteamento são acionadas quando a política de roteamento é utilizada. Neste caso, o identificador de tabela torna-se mais um parâmetro que precisa ser adicionado ao trio prefixo-tos-preferência para que identifique unicamente a rota.


ip route add, change, replace

ABREVIAÇÕES: add, a; change, chg; replace, repl

Argumentos

  • to PREFIXO
    to TIPO PREFIX
    (default): o prefixo do destino da rota. Se o TIPO for omitido, o ip assume o tipo unicast. O PREFIXO é um endereço IP ou IPv6, seguido opcionalmente por uma barra e o comprimento do prefixo. Se o comprimento do prefixo não for dado, o ip considera o comprimento total da rota do host. Também existe um PREFIXO especial - default - que é equivalente a IP 0/0 ou IPv6 ::/0.
  • tos TOS
    dsfield TOS
    : a chave do Tipo de Serviço (TOS). Esta chave não possui uma máscara associada e a combinação mais longa é entendida como: primeiro, compare o TOS da rota e do pacote; se não forem iguais, então o pacote ainda pode combinar com uma rota com um TOS zero. O TOS é um número hexadecimal de 8 bits ou um identificador presente no arquivo /etc/iproute2/rt_dsfield.
  • metric NÚMERO
    preference NÚMERO
    : o valor preferencial da rota. NÚMERO é qualquer número de 32 bits.
  • table IDTABELA: a tabela à qual a rota deve ser adicionada. IDTABELA pode ser um número ou uma string do arquivo /etc/iproute2/rt_tables. Se este parâmetro for omitido, o ip assume a tabela principal, exceto para rotas locais, broadcast e nat, que são colocadas na tabela local por default.
  • dev NOME: o nome do dispositivo de saída.
  • via ENDEREÇO: o endereço do roteador do próximo salto. Na verdade, o significado deste campo depende do tipo de rota. Para rotas de unicast normais, é o verdadeiro roteador do próximo salto ou, se for uma rota direta instalada no modo de compatibilidade BSD, pode ser um endereço local da interface. Para rotas NAT, é o primeiro endereço do bloco de destinos do IP traduzido.
  • src ENDEREÇO: o endereço de origem preferido para alcançar os destinos cobertos pelo prefixo da rota.
  • realm IDSETOR: o setor (realm) à qual pertence a rota. IDSETOR pode ser um número ou uma string do arquivo /etc/iproute2/rt_realms.
  • mtu MTU
    mtu lock MTU
    : a MTU juntamente com o caminho para o destino. Se o modificador lock não for usado, a MTU pode ser atualizada pelo kernel devido ao Path MTU Discovery. Se o modificador lock for usado, não será feita a tentativa de descobrir a MTU do caminho, todos os pacotes serão enviados sem o bit DF no IPv4 ou fragmentados na MTU no IPv6.
  • window NÚMERO: a janela (window) máxima para que o TCP informe estes destinos, medida em bytes. Ela limita o máximo de disparos de dados que nossos peers TCP podem nos enviar.
  • rtt NÚMERO: a estimativa inicial do RTT (Round Trip Time).
  • rttvar NÚMERO: (apenas 2.3.15+) a estimativa inicial da variância do RTT.
  • ssthresh NÚMEROM: (apenas 2.3.15+) uma estimativa para o limiar da partida lenta inicial.
  • cwnd NÚMERO: (apenas 2.3.15+) o limitador (clamp) para a janela de congestinamento. É ignorado se a flag lock não é usada.
  • advmss NÚMERO: (apenas 2.3.15+) o MSS (Maximal Segment Size- Tamanho Máximo do Segmento) informado a estes destinos quando forem estabelecidas conexões TCP. Se for omitido, o Linux usa um valor default calculado a partir da MTU do dispositivo do primeiro salto.
    info Se o caminho para este destino for assimétrico, esta estimativa pode estar errada.
  • reordering NÚMERO: (apenas 2.3.15+) reordenação máxima no caminho para este destino. Se for omitido, o Linux usa o valor selecionado com a variável sysctl de net/ipv4/tcp_reordering.
  • nexthop PRÓXIMOSALTO: o próximo salto de uma rota de múltiplos caminhos. PRÓXIMOSALTO é um valor complexo com sintaxe própria, semelhante à das listas de argumentos do nível mais alto (top level):
    • via ENDEREÇO: é o roteador do próximo salto.
    • dev NOME: é o dispositivo de saída.
    • weight NÚMERO: é um peso para este elemento de uma rota de caminhos múltiplos que reflete sua largura de banda ou qualidade.
  • scope SCOPE_VAL: o escopo dos destinos cobertos pelo prefixo da rota. SCOPE_VAL pode ser um número ou uma string do arquivo /etc/iproute2/rt_scopes. Se este parâmetro for omitido, o ip assume scope global para todos as rotas unicast com gateway, scope link para unicast direto e broadcast routes e scope host para rotas locais.
  • protocol RTPROTO: o identificador do protocolo de roteamento desta rota. RTPROTO pode ser um número ou uma string do arquivo /etc/iproute2/rt_protos. Se a ID do protocolo de roteamento for omitida, o ip assume protocol boot (isto é, assume que a rota doi adicionada por alguém que não sabe o que está fazendo). Vários valores de protocolo possuem uma interpretação fixa, ou seja:
    • redirect: a rota foi instalada devido ao um redirecionamento ICMP.
    • kernel: a rota foi instalada pelo kernel durante uma autoconfiguração.
    • boot: a rota foi instalada durante a sequência de bootup. Se um daemon de rotemaneto for iniciado, ele eliminará todas elas.
    • static: a rota foi instalada pelo administrador para se sobrepor ao roteamento dinâmico. O daemon de roteamento vai respeitar todas elas e, provavelmente, até as transmita para seus peers.
    • ra: a rota foi instalada pelo protocolo Router Discovery. O restante dos valores não são reservados e o administrador pode designar (ou não) tags de protocolo. No mínimo, os daemons de roteamento deveriam designar alguns valores de protocolo únicos, por exemplo, da mesma forma como estão designados em rtnetlink.h ou na base de dados rt_protos.
  • onlink: simular que o próximo salto está diretamente atrelado a este link, mesmo que não combine com qualquer prefixo de interface.
  • equalize: permitir randomização pacote a pacote em rotas de múltiplos caminhos. Sem este modificador, a rota ficará pendurada num próximo salto selecionado e um fracionamento de carga (load splitting) só ocorrerá por fluxo. (equalize só funciona se o kernel estiver com o patch adequado)

info Existem mais comando: prepend faz o mesmo que o clássico route add, isto é, adiciona uma rota mesmo se já existir outra para o mesmo destino. Seu oposto é append, que adiciona a rota no fim da lista. Estes comandos devem ser evitados.

info Mais notícias tristes: o IPv6 só entende o comando append. Todos os outros são transformados em comandos append. Isto certamente deve mudar no futuro.

Exemplos

Adicionar uma rota simples para a rede 10.0.0/24 via gateway 193.233.7.65

  ip route add 10.0.0/24 via 193.233.7.65

Alterá-la para uma rota direta via dispositivo dummy

  ip ro chg 10.0.0/24 dev dummy

Adicionar uma rota multi-caminho default fracionando a carga entre ppp0 e ppp1

  ip route add default scope global nexthop dev ppp0 nexthop dev ppp1

Observe o valor do escopo. Ele não é necessário, mas informa o kernel que esta rota não é direta,
sai pelo gateway. Na verdade, se você souber os endereços de pontos remotos seria melhor usar
o parâmetro via.

Avisar que o endereço 192.203.80.144 não é real, mas deve ser traduzido para
193.233.7.83 antes do envio

  ip route add nat 192.203.80.144 via 193.233.7.83

ip route delete

ABREVIAÇÕES: delete, del, d

ip route del aceita os mesmos argumentos que o ip route add, mas a semântica é um pouco diferente.

Os valores chave to, tos, preference e table selecionam a rota que vai ser deletada. Se estiverem presentes atributos opcionais, o ip verifica se eles coincidem com os atributos da rota que deve ser deletada. Se não existir uma rota com as chaves e os atributos dados, o del do ip falha.

info Dê uma olhada no ip route flush que faz algo semelhante mas tem mais recursos.

Deletar a rota multi-caminho criada pelo comando add no exemplo anterior:

  ip route del default scope global nexthop dev ppp0 nexthop dev ppp1

ip route show

Este comando mostra o conteúdo de tabelas de roteamento ou de rotas selecionadas de acordo com alguns critérios.

ABREVIAÇÕES: show, list, sh, ls, l

Argumentos

  • to SELETOR (default): apenas rotas selecionadas de uma série de destinos. O SELETOR consiste de um modificador opcional (root, match ou exact) e de um prefixo. O PREFIXO root seleciona rotas com prefixo que não seja mais curto que PREFIXO, por exemplo, root 0/0 seleciona toda a tabela de roteamento. O PREFIXO match seleciona rotas com prefixos que não sejam mais longos que PREFIXO, por exemplo, match 10.0/16 seleciona 10.0/16, 10/8 e 0/0, mas não seleciona 10.1/16 e 10.0.0/24. O PREFIXO exact (ou simplesmente PREFIXO) seleciona rotas com este exato prefixo. Se nenhuma destas opções estiver presente, ip assume root 0/0, isto é, ele lista toda a tabela.
  • tos TOS
    dsfield TOS
    : seleciona apenas as rotas com o referido TOS.
  • table IDTABELA: mostra as rotas desta(s) tabela(s). A configuração default é para mostrar a tabela principal. IDTABELA pode ser a ID de uma tabela real ou de uma com valores especiais:
    • all: lista todas as tabelas.
    • cache: faz um dump do cache de roteamento.

    info O IPv6 só tem uma tabela, mas o utilitário faz uma emulação e a quebra em principal, local e cache.

  • cloned
    cached
    : lista rotas clonadas, isto é, rotas que foram bifurcadas dinamicamente porque algum atributo da rota original (p/ex/ MTU) foi atualizado.
  • from SELETOR: a mesma sintaxe usada para to, mas associa a série de endereços de origem ao invés dos endereços de destino. Observação: a opção from só funciona com rotas clonadas.
  • protocol RTPROTO: lista apenas rotas deste protocolo.
  • scope SCOPE_VAL: lista apenas rotas deste escopo.
  • type TIPO: lista apenas rotas deste tipo.
  • dev NOME: lista apenas rotas que passam por este dispositivo.
  • via PREFIXO: lista apenas rotas que passam pelos roteadores do próximo salto selecionados por PREFIXO.
  • src PREFIXO: lista apenas rotas com os endereços de origem selecionados por PREFIXO.
  • realm IDSETOR
    realms DOSETOR/PARASETOR
    : lista apenas rotas com estes setores (realm).

Exemplos

Contar rotas do gated/bgp num roteador:

kuznet@amber:~ $ ip ro ls proto gated/bgp | wc
   1413    9891    79010
kuznet@amber:~ $

Para contar o tamanho do cache de roteamento é preciso usar a opção -o porque os atributos no cache
podem precisar de mais de uma linha de saída:

kuznet@amber:~ $ ip -o ro ls cloned | wc
   159    2543    18707
kuznet@amber:~ $

Formato da saída

A saída deste comando são registros de rotas separados por quebras de linha. Alguns registros, no entanto, podem ter mais de uma linha, especialmente se a rota for clonada ou se for solicitada uma estatística adicional. Se a opção -o for incluída, as quebras de linha que separam as linhas dentro do registro são substituídas por uma contra barra.

A saída tem a mesma sintaxe dos argumentos do ip route add, de modo que pode ser facilmente entendida. Por exemplo,

kuznet@amber:~ $ ip ro ls 193.233.7/24
193.233.7.0/24 dev eth0  proto gated/conn  scope link \
    src 193.233.7.65 realms inr.ac 
kuznet@amber:~ $

Se você listar entradas clonadas, a saída contém outros atributos que são avaliados durante o cálculo da rota e atualizados durante o tempo de vida da rota. Um exemplo de saída é:

kuznet@amber:~ $ ip ro ls 193.233.7.82 tab cache
193.233.7.82 from 193.233.7.82 dev eth0  src 193.233.7.65 \
  realms inr.ac/inr.ac 
    cache   mtu 1500 rtt 300 iif eth0
193.233.7.82 dev eth0  src 193.233.7.65 realms inr.ac 
    cache  mtu 1500 rtt 300
kuznet@amber:~ $

info A rota parece um pouco estranha, não é mesmo? Você percebeu que ela é um caminho de 193.233.7.82 para 193.233.82? Bem, você verá na tópico ip route get como isto aconteceu.

A segunda linha, que começa com a palavra cache, mostra atributos adicionais que as rotas normais não possuem. Flags em cache estão resumidas entre colchetes:

  • local: os pacotes são entregues localmente. Refere-se a rotas unicast de loopback, a rotas broadcast e a rotas multicast se este host for membro do grupo correspondente.
  • reject: o caminho é ruim. Qualquer tentativa de usar seus resultados dá erro.
  • mc: o destino é multicast.
  • brd: o destino é broadcast.
  • src-direct: a origem está numa interface conectada diretamente.
  • redirected: a rota foi criada por um ICMP Redirect.
  • redirect: os pacotes que passarem por esta rota vão disparar um ICMP redirect.
  • fastroute: a rota pode ser escolhida como rota rápida (fastroute).
  • equalize: faça uma randomização pacote a pacote neste caminho.
  • dst-nat: o endereço de destino precisa de tradução.
  • src-nat: o endereço de origem precisa de tradução.
  • masq: o enderço de origem precisa de máscara (não é mais necessário no linux-2.4).
  • notify: (não implementado) change/deletion desta rota aciona uma notificação RTNETLINK.

Alguns atributos opcionais são:

  • error: em rotas rejeitadas, é o código de erro mostrado para remetentes locais quando eles tentam usar esta rota. Estes códigos de erro são traduzidos para códigos de erro ICMP e enviados para remetentes remotos.
  • expires: esta entrada expira depois do tempo indicado.
  • iif: os pacotes para este caminho são esperados nesta interface.

Estatística

Com a opção -statistics, mais informação sobre a rota é mostrada:

  • users: o número de usuários nesta entrada.
  • age: mostra quando esta rota foi usada pela última vez.
  • used: o número de verificações desta rota desde que foi criada.

ip route flush

Este comando descarrega rotas selecionadas de acordo com um critério.

ABREVIAÇÕES: flush, f

Os argumentos possuem a mesma sintaxe e semântica que os argumentos do ip route show, só que as tabelas de roteamento não são listadas, são descarregadas. A única diferença é a ação default: show mostra toda a tabela principal de roteamento e flush mostra a página de ajuda porque a tabela é esvaziada.

Com a opção -statistics o comando se torna verboso: mostra o número de rotas deletadas e o número de etapas percorridas para esvaziar a tabela de roteamento. Se a opção for usada duas vezes, ip route flush também mostra todas as rotas deletadas no formato descrito no comando ip route delete.

Exemplos

O primeiro exemplo tira todas as rotas com gateway da tabela principal (por exemplo, depois que um daemon cai).

netadm@amber:~ # ip -4 ro flush scope global type unicast

Esta opção merece ser colocada num pequeno script routef. Esta opção foi descrita na página man do route, emprestada do BSD, mas nunca foi implementada no Linux.

O segundo exemplo descarrega todas as rotas IPv6 clonadas:

netadm@amber:~ # ip -6 -s -s ro flush cache
3ffe:2400::220:afff:fef4:c5d1 via 3ffe:2400::220:afff:fef4:c5d1 \
  dev eth0  metric 0 
    cache  used 2 age 12sec mtu 1500 rtt 300
3ffe:2400::280:adff:feb7:8034 via 3ffe:2400::280:adff:feb7:8034 \
  dev eth0  metric 0 
    cache  used 2 age 15sec mtu 1500 rtt 300
3ffe:2400::280:c8ff:fe59:5bcc via 3ffe:2400::280:c8ff:fe59:5bcc \
  dev eth0  metric 0 
    cache  users 1 used 1 age 23sec mtu 1500 rtt 300
3ffe:2400:0:1:2a0:ccff:fe66:1878 via 3ffe:2400:0:1:2a0:ccff:fe66:1878 \
  dev eth1  metric 0 
    cache  used 2 age 20sec mtu 1500 rtt 300
3ffe:2400:0:1:a00:20ff:fe71:fb30 via 3ffe:2400:0:1:a00:20ff:fe71:fb30 \
  dev eth1  metric 0 
    cache  used 2 age 33sec mtu 1500 rtt 300
ff02::1 via ff02::1 dev eth1  metric 0 
    cache  users 1 used 1 age 45sec mtu 1500 rtt 300

*** Round 1, deleting 6 entries ***
*** Flush is complete after 1 round ***
netadm@amber:~ # ip -6 -s -s ro flush cache
Nothing to flush.
netadm@amber:~ #

O terceiro exemplo tira tabelas de roteamento BGP depois de uma gated death:

netadm@amber:~ # ip ro ls proto gated/bgp | wc
   1408    9856    78730
netadm@amber:~ # ip -s ro f proto gated/bgp

*** Round 1, deleting 1408 entries ***
*** Flush is complete after 1 round ***
netadm@amber:~ # ip ro f proto gated/bgp
Nothing to flush.
netadm@amber:~ # ip ro ls proto gated/bgp
netadm@amber:~ #

ip route get

Este comando pega um rota única para um destino e mostra seu conteúdo exatamente como é visto pelo kernel.

ABREVIAÇÕES: get, g

Argumentos

  • to ENDEREÇO (default): o endereço de destino.
  • from ENDEREÇO: o endereço de origem.
  • tos TOS
    dsfield TOS
    : o Tipo de Serviço (Type Of Service).
  • iif NOME: o dispositivo do qual se espera o pacote.
  • oif NOME: força o dispositivo de saída através do qual o pacote será roteado.
  • connected: se não houver endereço de origem (opção from), reavaliar a rota com o endereço preferido obtido na primeira verificação da origem. Se estiver sendo usada uma política de roteamento, pode ser uma rota diferente.

Observe que esta operação não é equivalente a ip route show. O comando show mostra rotas existentes. Já o get resolve as rotas e cria novos clones se for necessário. Essencialmente, get equivale a enviar um pacote através deste caminho. Se o argumento iif não estiver presente, o kernel cria uma rota de saída para os pacotes na direção do destino requisitado. Isto equivale a fazer um ping no destino com um ip route ls cache subsequente, só que nenhum pacote é enviado. Com o argumento iif, o kernel simula que um pacote tenha chegado vindo desta interface e procura um caminho para redespachar o pacote.

O formato de saída deste comando é o mesmo do ip route ls.

Exemplos

Encontrar uma rota para redespachar pacotes para 193.233.7.82:

kuznet@amber:~ $ ip route get 193.233.7.82
193.233.7.82 dev eth0  src 193.233.7.65 realms inr.ac
    cache  mtu 1500 rtt 300
kuznet@amber:~ $

Encontrar uma rota para redespachar pacotes que chegam na eth0 de 193.233.7.82 e destinados para 193.233.7.82:

kuznet@amber:~ $ ip r g 193.233.7.82 from 193.233.7.82 iif eth0
193.233.7.82 from 193.233.7.82 dev eth0  src 193.233.7.65 \
  realms inr.ac/inr.ac 
    cache   mtu 1500 rtt 300 iif eth0
kuznet@amber:~ $

info Este é o comando que criou a rota estranha de 193.233.7.82 com loop back para 193.233.7.82. Note a flag de redirecionamento.

Achar uma rota multicast para pacotes que chegam na eth0 do host 193.233.7.82 destinados para o grupo multicast 224.2.127.254 (um daemon de roteamento multicast precisa estar rodando. Neste caso é o pimd).

kuznet@amber:~ $ ip r g 224.2.127.254 from 193.233.7.82 iif eth0
multicast 224.2.127.254 from 193.233.7.82 dev lo  \
  src 193.233.7.65 realms inr.ac/cosmos 
    cache  iif eth0 Oifs: eth1 pimreg
kuznet@amber:~ $

Esta rota é diferente das vistas até agora. Ela possui uma parte "normal" e uma "multicast". A parte normal é usada para entregar (ou para não entregar) o pacote para ouvintes IP locais. Neste caso o roteador não é um membro deste grupo, de modo que a rota não tem uma flag local e apenas redespacha pacotes. O dispositivo de saída para registros deste tipo é sempre loopback. A parte multicast consiste de Oifs adicionais: listar mostrando as interfaces de saída.

Está na hora de um exemplo mais complicado. Vamos adicionar uma rota de gateway inválida para um destino que está realmente conectado diretamente

netadm@alisa:~ # ip route add 193.233.7.98 via 193.233.7.254
netadm@alisa:~ # ip route get 193.233.7.98
193.233.7.98 via 193.233.7.254 dev eth0  src 193.233.7.90
    cache  mtu 1500 rtt 3072
netadm@alisa:~ #

e testá-la com um ping:

netadm@alisa:~ # ping -n 193.233.7.98
PING 193.233.7.98 (193.233.7.98) from 193.233.7.90 : 56 data bytes
From 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98)
64 bytes from 193.233.7.98: icmp_seq=0 ttl=255 time=3.5 ms
From 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98)
64 bytes from 193.233.7.98: icmp_seq=1 ttl=255 time=2.2 ms
64 bytes from 193.233.7.98: icmp_seq=2 ttl=255 time=0.4 ms
64 bytes from 193.233.7.98: icmp_seq=3 ttl=255 time=0.4 ms
64 bytes from 193.233.7.98: icmp_seq=4 ttl=255 time=0.4 ms
^C
--- 193.233.7.98 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.4/1.3/3.5 ms
netadm@alisa:~ #

O que foi que aconteceu? O roteador 193.233.7.254 entendeu que temos um caminho muito melhor para o destino e nos enviou uma mensagem ICMP de redirecionamento. Agora podemos tentar novamente um ip route para ver o que há nas tabelas de roteamento:

netadm@alisa:~ # ip route get 193.233.7.98
193.233.7.98 dev eth0  src 193.233.7.90 
    cache   mtu 1500 rtt 3072
netadm@alisa:~ #

ip rule

As regras na base de dados da política de roteamento controlam o algaritmo de seleção de rotas.

ABREVIAÇÕES: rule, ru

Objeto

Algoritmos de roteamento clássicos usados na Internet tomam decisões de roteamento baseados apenas no endereço de destino dos pacotes (e, na teoria, mas não na prática, no campo TOS).

Em algumas ocasiões pode ser necessário rotear pacotes de forma diferente, não baseada apenas em endereços de destino, mas em outros campos dos pacotes: endereço de origem, protocolo IP, portas do protocolo de transporte ou até mesmo na carga útil (payload) dos pacotes. Esta tarefa é chamada de "política de roteamento".

Para resolver esta tarefa, a tabela de roteamento convencional baseada no destino, ordenada de acordo com a regra da combinação mais longa, é substituída por uma "base de dados de políticas de roteamento" (RPDB - routing policy database) que escolhe rotas executando algum conjunto de regras. As regras podem ter inúmeras chaves de natureza diferente, motivo pelo qual não podem ser ordenadas de forma natural - a ordenação é imposta pelo administrador. A RPDB do Linux 2.2 é uma lista linear de regras ordenada por valores numéricos de prioridade. A RPDB permite casar alguns campos do pacote:

  • endereço de origem do pacote
  • endereço de destino do pacote
  • TOS
  • interface de chegada(o que é metadado do pacote e não um campo)

Também é possível casar protocolos IP e portas de transporte indiretamente através de ipchains aproveitando sua habilidade de marcar algumas classes de pacotes com fwmark (marca de redespacho). Por este motivo, fwmark foi incluída no conjunto de chaves checadas pelas regras.

Uma regra da política de roteamento consiste de um seletor e de um predicado de ação. A RPDB é percorrida na ordem de prioridade crescente. O seletor de cada regra é aplicado (endereço de origem, endereço de destino, interface de chegada, tos, fwmark) e, se o seletor combinar com o pacote, a ação é realizada. O predicado de ação pode retornar com sucesso. Neste caso, ou ele fornece uma rota ou indica uma falha e a verificação da RPDB é encerrada. Caso contrário, o programa RPDB continua com a próxima regra.

Semanticamente, qual é a ação? A ação natural é selecionar o próximo salto e o dispositivo de saída. Isto é o que o IOS Cisco faz. Vamos chamar isto de "casar & definir". A proposta do Linux 2.2 é mais flexível. A ação inclui verificações em tabelas de roteamento baseadas em destinos e seleção de uma rota destas tabelas de acordo com o clássico algoritmo de combinação mais longa. A proposta de "casar & definir" é o caso mais simples da proposta do Linux. Ela é realizada quando uma tabela de roteamento de segundo nível contém uma única rota default. Lembre-se de que o Linux 2.2 trabalha com múltiplas tabelas administradas pelo comando ip route.

Ao ser iniciado, o kernel configura a RPDB default que possui três regras:

  1. Prioridade 0: Seletor - combina com qualquer coisa; Ação - verifica a tabela de roteamento local (ID 255). A tabela local é uma tabela de roteamento especial que contém rotas de controle de alta prioridade para endereços locais e de broadcast.
    A regra 0 é especial. Não pode ser deletada nem anulada por outra regra.
  2. Prioridade 32766: Seletor: combina com qualquer coisa; Ação - verifica a tabela de roteamento principal (ID 254). A tabela principal é a tabela de roteamento normal que contém todas as rotas não policiadas. Esta regra pode ser deletada e/ou anulada por outras criadas pelo administrador.
  3. Prioridade 32767: Seletor: combina com qualquer coisa; Ação - verifica a tabela de roteamento default (ID 253). A tabela default fica vazia. Ela é reservada para alguns processamentos posteriores se nenhuma das regras default anteriores selecionaram o pacote. Esta regra também pode ser deletada.

Não confunda tabelas de roteamento com regras: regras apontam para tabelas de roteamento, diversas regras podem se referir a uma tabela de roteamento e algumas tabelas de roteamento podem não estar sendo apontadas por qualquer regra. Se o administrador deletar todas as regras que apontem para uma tabela, a tabela não é usada, mas, ainda assim, existe - só deixará de existir quando todas as regras que ela contém também sejam deletadas.

Atributos das regras

Cada entrada RPDB possui atributos adicionais, por exemplo, cada regra possui um ponteiro para alguma tabela de roteamento. Regras NAT e de máscara possuem um atributo para selecionar novos endereços IP para traduzir/mascarar. Além disto, as regras possuem alguns atributos opcionais, que as rotas também possuem - os setores (realm). Estes valores não anulam os contidos em tabelas de roteamento, eles são usados apenas se a rota não tiver selecionado qualquer atributo.

Tipos de regras

O RPDB pode conter regras dos seguintes tipos:

  • unicast: a regra diz para retornar a rota encontrada na tabela de roteamento referenciada pela regra.
  • blackhole: (buraco negro) - a regra diz para descartar silenciosamente o pacote.
  • unreachable: a regra diz para gerar um erro "Network is unreachable" - rede inacessível.
  • prohibit: a regra diz para gerar um erro "Communication is administratively prohibited" - comunicação proibida administrativamente.
  • nat: a regra diz para traduzir endereços de origem de pacotes IP para algum outro valor.

Comandos

add, delete e show (ou list).


ip rule add/delete

ABREVIAÇÕES: add, a; delete, del, d

Argumentos

  • type TIPO (default): o tipo da regra. A lista de tipos válidos de regras está no tópico ip rule.
  • from PREFIXO: seleciona o prefixo da origem que deve casar.
  • to PREFIXO: seleciona o prefixo do destino que deve casar.
  • iif NOME: seleciona o dispositivo que deve casar. Se a interface for loopback, a regra apenas casa pacotes originários deste host. Isto significa que você pode criar tabelas de roteamento diferentes para pacotes redespachados e locais e, desta forma, segregá-los completamente.
  • tos TOS
    dsfield TOS
    : selecionar o valor TOS para casar.
  • fwmark MARCA: selecionar a fwmark para casar.
  • priority PREFERÊNCIA: a prioridade da regra. Cada regra deveria ter um valor de prioridade exclusivo e único.

    info Por razões históricas, o ip rule add pode ficar sem um valor de prioridade, como também permite que os valores não sejam únicos. Se o usuário não tiver fornecido uma prioridade, ela é selecionada pelo kernel. Se o usuário criar uma regra com um valor de prioridade que já existe, o kernel não rejeita a solicitação - ele adiciona a nova regra antes das mais antigas com a mesma prioridade.

    atencao Este é um erro de projeto. Deve ser corrigido no futuro, portanto, evite usar esta "brecha" - use prioridades explícitas!

  • table IDTABELA: o identificador da tabela de roteamento que deve ser verificada se o seletor da regra combinar.
  • realms DE/PARA: setores que devem ser selecionados se a regra casar e a verificação da tabela de roteamento tiver sucesso. Setor PARA só é usado se a rota não tiver selecionado o setor.
  • nat ENDEREÇO: a base do bloco de endereço IP que deve ser traduzido (para endereços de origem). O ENDEREÇO pode ser o início do bloco de endereços NAT (selecionado por rotas NAT) ou, no Linux 2.2, um endereço local de host (ou mesmo zero). No último caso, o roteador não traduz os pacotes, mas faz a máscara para o endereço. Esta característica foi eliminada a partir da versão 2.4.

atencao OBSERVAÇÃO

As alterações feitas com estes comandos na RPDB não são ativadas imediatamente. Espera-se que, após um script ter terminado um lote de atualizações, ele faça um limpeza no cache de roteamento com ip route flush cache.

Exemplos

Rotear pacotes com endereço de origem 192.203.80/24 de acordo com a tabela de roteamento inr.ruhep:

ip ru add from 192.203.80.0/24 table inr.ruhep prio 220

Traduzir o endereço de origem 193.233.7.83 para 192.203.80.144 e roteá-lo de acordo com a tabel #1
(na verdade, a inr.ruhep):

ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320

Deletar uma regra default não usada:

ip ru del prio 32767

ip rule show

ABREVIAÇÕES: show, list, sh, ls, l

Este comando não possui argumentos.

Formato de saída

kuznet@amber:~ $ ip ru ls
0:	from all lookup local 
200:	from 192.203.80.0/24 to 193.233.7.0/24 lookup main
210:	from 192.203.80.0/24 to 192.203.80.0/24 lookup main
220:	from 192.203.80.0/24 lookup inr.ruhep realms inr.ruhep/radio-msu
300:	from 193.233.7.83 to 193.233.7.0/24 lookup main
310:	from 193.233.7.83 to 192.203.80.0/24 lookup main
320:	from 193.233.7.83 lookup inr.ruhep map-to 192.203.80.144
32766:	from all lookup main 
kuznet@amber:~ $

A primeira coluna é o valor da prioridade da regra seguida por dois pontos. A seguir vem o seletor. Cada chave tem como prefixo a mesma palavra chave que foi usada para criar a regra.

A verificação da palavra chave é seguida por um identificador da tabela de roteamento, como registrado no arquivo /etc/iproute2/rt_tables.

Se a regra faz NAT (por exemplo, a regra 320), ela é mostrada pela palavra chave map-to seguida pelo início do bloco de endereços que deve ser mapeado.

O sentido deste exemplo é bastante simples. Os prefixos 192.203.80.0/24 e 193.233.7.0/24 formam uma rede interna, mas são roteados de forma diferente quando os pacotes saem desta rede. Além disto, o host 193.233.7.83 é traduzido para um outro prefixo para parecer ser 192.203.80.144 quando "falar" com o mundo externo.


OBSERVAÇÃO

Este texto de referência está em elaboração.

Enquanto este alerta estiver aqui, o texto está inacabado. Apesar disto, as informações que ele já contém podem ser úteis, motivo pelo qual o texto permanece publicado apesar de inacabado.

Abraços a todos da vovo e viva o Linux!


Fonte

IP Command Reference, Alexey N. Kuznetsov.

Вадим Логофет детиколбаски для грилялобановский александр харьковдепутат лобановскийгарнитуры jabraуправление проектамиалександр лобановский