Acessos: 16276
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
ip - sintaxe do comando
ip route add, change, replace
Referências ee Comentários
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.
Não use esta opção quando informar bugs ou pedir ajuda.
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.
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
kuznet@alisa:~ $ ip link ls eth0
kuznet@alisa:~ $ ip link ls sit0
5: sit0@NONE:  mtu 1480 qdisc noqueue
kuznet@alisa:~ $ ip link ls dummy
2: dummy:  mtu 1500 qdisc noop
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.
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.
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).
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.
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
2449949362 2786187  0       0       0       0
178558497  1783945  332     0       332     35172
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
TX errors: aborted  fifo    window  heartbeat
0        0       0       332
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.
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
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 off     : muda a flag de MULTICAST no dispositivo.
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.
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!
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.
ABREVIAÇÕES: address, addr, a
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.
add, delete, flush e show (ou list).
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.
# 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:
Outro meio para desabilitar o IP numa interface é usar o ip addr 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.
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.
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 ***
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
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
Os comandos são: add, change, replace, delete, flush e show (ou list).
Estes comando criam novos registros neighbour ou atualizam registros existentes.
ABREVIAÇÕES: add, a; change, chg; replace, repl
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:
permanent: o registro neighbour é válido para sempre e só pode ser removido administrativamente.
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.
reachable: o registro neighbour é válido até que se esgote o tempo em que pode ser alcançado.
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.
Adiciona um registro ARP permanente para o vizinho 10.0.0.3 no dispositivo eth0.
Altera seu estado para reachable (alcançável).
Este comando invalida um registro neighbour.
Os argumentos são os mesmos do ip neigh add, só que lladdr e nud são ignorados.
Invalida o registro ARP para o vizinho 10.0.0.3 no dispositivo eth0.
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).
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.
Este comando limpa as tabelas de vizinhos selecionando registros de acordo com um critério.
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.
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 \
ABREVIAÇÕES: route, ro, r
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:
O prefixo mais longo é escolhido. Todos os outros são descartados.
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.
Se diversas rotas ficarem disponíveis depois das etapas anteriores, então as rotas com os melhores valores de preferência são selecionadas.
Se ainda existirem diversas rotas, então a primeira delas é selecionada.
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.
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.
É 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.
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.
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.
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.
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 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.
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)
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.
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.
Adicionar uma rota simples para a rede 10.0.0/24 via gateway 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
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 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.
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:
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
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.
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.
O IPv6 só tem uma tabela, mas o utilitário faz uma emulação e a quebra em principal, local e cache.
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).
Contar rotas do gated/bgp num roteador:
kuznet@amber:~ $ ip ro ls proto gated/bgp | wc
1413    9891    79010
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
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 \
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
cache   mtu 1500 rtt 300 iif eth0
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.
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.
Este comando descarrega rotas selecionadas de acordo com um critério.
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.
O primeiro exemplo tira todas as rotas com gateway da tabela principal (por exemplo, depois que um daemon cai).
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 \
cache  used 2 age 15sec mtu 1500 rtt 300
3ffe:2400::280:c8ff:fe59:5bcc via 3ffe:2400::280:c8ff:fe59:5bcc \
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 \
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
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 ***
netadm@amber:~ # ip ro f proto gated/bgp
netadm@amber:~ # ip ro ls proto gated/bgp
Este comando pega um rota única para um destino e mostra seu conteúdo exatamente como é visto pelo kernel.
ABREVIAÇÕES: get, g
to ENDEREÇO (default): o endereço de destino.
from ENDEREÇO: o endereço de origem.
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.
Encontrar uma rota para redespachar pacotes para 193.233.7.82:
Encontrar uma rota para redespachar pacotes que chegam na eth0 de 193.233.7.82 e destinados para 193.233.7.82:
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).
cache  iif eth0 Oifs: eth1 pimreg
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
e testá-la com um ping:
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:
cache   mtu 1500 rtt 3072
ABREVIAÇÕES: add, a; delete, del, d
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.
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.
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.
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.
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.
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):
Deletar uma regra default não usada:
Este comando não possui argumentos.
kuznet@amber:~ $ ip ru ls
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
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.
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 e viva o Linux!
IP Command Reference, Alexey N. Kuznetsov.
Вадим Логофет детиколбаски для грилялобановский александр харьковдепутат лобановскийгарнитуры jabraуправление проектамиалександр лобановский