modprobe / insmod / lsmod / rmmod / modinfo
O primeiro passo para configurar um interface é garantir que o kernel saiba como “conversar” com esse dispositivo. Para tanto, o kernel deverá ou ter embutido o “driver” (que no Linux chamamos de módulo) ou carregar dinâmicamente esse “driver”. Os comandos “mod” servem para carregar, descarregar e listar módulos, e são bastante simples de usar:
Para listar os módulos carregados pelo kernel use o comando lsmod, exemplo:
# lsmod
Module Size Used by Not tainted
e100 49064 1
Para carregar um módulo é só utilizar o comando insmod ou o comando modprobe. A diferença entre os dois é que o comando modprobe resolve e carrega as dependências do módulo que estamos tentando carregar, isto é, se o módulo “A” necessita que o módulo “B” esteja carregado, usar “modprobe A” carregará os dois! Exemplo:
# modprobe 8139too
Alguns módulos aceitam parâmetros ao serem carregados como, por exemplo, IRQ, I/O, opções de velocidade, etc. Para obter mais informações sobre um módulo, utilize o comando modinfo. Por exemplo, para obter a lista de parâmetros de um módulo use “modinfo -p módulo”.
O comando rmmod serve para remover um módulo que não está mais em uso. Também podemos usar o comando modprobe com a opção -r, para se obter um efeito análogo ao carregamento de módulos com dependências, mas para remover, é claro.
mii-tool
O comando mii-tool serve para verificar e alterar o estado “Media-Independent Interface” de uma interface. O MII é um recurso utilizado pela maioria dos adaptadores fast ethernet para negociar a velocidade do link e o full/half duplex. Atenção, nem todos os adaptadores suportam esse recurso!
Para verificar o estado de uma interface, basta usar o comando sem parâmetros. Exemplo:
# mii-tool
eth0: negotiated 100baseTx-FD, link ok
Para forçar que uma placa anuncie somente certas capacidades, ou para desabilitar completamente a auto-negociação e forçar uma certa velocidade, use os parâmetros -A e -F, respectivamente. Exemplo:
Anuncia que a placa entende 100Mbit/s Half e Full Duplex:
# mii-tool -A 100BaseTx-FD,100BaseTx-HD eth0
Força a placa a entrar no modo 10Mbit/s Full Duplex:
# mii-tool -F 10BaseT-FD eth0
ifconfig
O ifconfig é o principal comando para configurarmos interfaces no Linux. A sua forma geral é “ifconfig opções | endereço”. Consulte a página do manual para ver todas as opções (man ifconfig). Veremos a seguir alguns exemplos:
Para listar as interfaces e seus endereços:
# ifconfig
eth1 Link encap:Ethernet HWaddr 02:60:8C:F1:EB:CF
inet addr:10.10.10.1 Bcast:10.255.255.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:858 (858.0 b) TX bytes:0 (0.0 b)
Interrupt:5 Base address:0×2440
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:55870 errors:0 dropped:0 overruns:0 frame:0
TX packets:55870 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:124540531 (118.7 ))MiB(() TX bytes:124540531 (118.7 ))MiB(()
Para configurar e levantar uma interface com um determinado IP:
# ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
Para desabilitar uma interface:
# ifconfig eth0 down
Para configurar um “alias” em uma interface, juntamente com outro endereço IP:
# ifconfig eth0:1 192.168.1.1 netmask 255.255.255.0
Para mudar a MTU de uma interface:
# ifconfig eth0 mtu 1440
Para configurar placa com uma conexão ponto-a-ponto:
# ifconfig eth0 192.168.2.1 netmask 255.255.255.255 pointopoint 192.168.2.2
Para colocar e retirar uma interface do modo “Promíscuo” (a interface aceita pacotes destinados a qualquer IP):
# intertace eth0 promisc
# interface eth0 -promisc
O ifconfig também pode ser utilizado para se alterar o endereço MAC da placa! Para alterar esse endereço é necessário que a placa esteja inativa. Exemplo:
# ifconfig eth0 down
# ifconfig eth0 hw ether 00:11:22:33:44:55
# ifconfig eth0 up
Configuração de Rotas
route
O comando route serve para mostrar e manipular a tabela principal de rotas. Quando utilizado sem argumentos ele mostra a tabela de rotas. Exemplo:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.10.0 * 255.255.255.0 U 0 0 0 eth0
default 10.10.10.10 0.0.0.0 UG 0 0 0 eth0
Um parâmetro que pode ser útil ao mostrarmos rotas é o “-n”, que faz com que o comando route não tente resolver nomes.
Para inserir uma rota use o comando no formato: route add [ -net | -host ] target [ netmask Nm ] [ gw Gw ] [[ dev ] If ]. Exemplos:
Inserir uma rota para uma rede:
# route add -net 192.168.5.0 netmask 255.255.255.0 gw 192.168.1.3
Inserir uma rota para um host, utilizando uma determinada interface ponto-a-ponto:
# route add -net 192.168.10.1 dev ppp0
Para selecionar a rota default:
# route add default gw 192.168.1.200
Para remover rotas usamos praticamente a mesma sintaxe, mas ao invés do “add” usamos o “del”.
Comandos úteis na resolução de problemas
Problemas no nível 2
Quando falamos em roteamento, estamos trabalhando basicamente com a camada 3 (IP) do modelo OSI. No entanto, existem muitos casos em que é necessário conhecer e trabalhar com o nível 2 (enlace), mais especificamente estaremos falando, no nosso caso, de ethernet.
arp
O comando arp serve para listar e modificar a tabela arp do kernel. A tabela arp associa endereços IP à endereços de “hardware”, (no caso do ethernet, aos MAC address). Na sua forma mais básica, sem parâmetros, o comando arp simplesmente lista a tabela arp (utilize a opção -n para não resolver nomes), exemplo:
# arp
Address HWtype ))HWaddress(( Flags Mask Iface maquina1.teste ether 00:00:0C:95:0B:00 C eth0 maquina2.teste ether 00:60:08:A1:48:A6 C eth0
Para remover uma entrada da tabela utilize opção “-d host”. exemplo:
# arp -d maquina2.teste
O comando arp permite também que entradas sejam adicionadas manualmente na tabela. Normalmente isso não é necessário mas em algumas situações poderá ser, por exemplo, quando configuramos uma conexão ponto-a-ponto, ou dial-up. Nesse caso é preciso que a máquina roteadora seja capaz de aceitar pacotes que tenham como destino a outra máquina da conexão. Para adicionarmos uma entrada usamos a opção “-s host hw_address” ou para forçarmos que uma interface responda a requisições arp utilizando o endereço de outra (ou dela mesmo) interface, podemos usar as opções “-i”, para definir a interface, e a opção “-D”, para dizer de qual interface queremos “copiar” o endereço de hardware. Exemplo
# arp -s 192.168.0.3 -i eth0 -D eth0 pub
O exemplo acima faria com que a interface eth0 respondesse a requisições de arp para o endereço 192.168.0.3 utilizando o seu próprio endereço de hardware. A opção pub faz com que a interface passe a “divulgar” esse endereço (e não apenas a aceitar pacotes para ele).
arping
O comando arping serve para enviar requisições arp e/ou ICMP. O comando arping, além de aceitar nome de hosts, endereços IPs? e endereços de hardware, pode usar também como origem e/ou destino endereços de broadcast. Por exemplo, se quisermos verificar se um determinado IP está sendo utilizado antes de o configurarmos na placa de rede poderíamos fazer:
# arp -0 192.168.0.1
O resultado disso é:
# tcpdump arp
tcpdump: listening on eth0
14:02:48.327806 arp who-has 192.168.0.1 tell 0.0.0.0
14:02:48.327939 arp reply 192.168.0.1 is-at 0:60:8:a1:48:a6
Conectividade e Rotas
Para diagnosticar problemas de conectividade ou de roteamento os comandos a seguir são bastante úteis.
ping
O ping já deve ser um velho conhecido de todos que trabalham com redes de computadores. Ele serve para enviar requisições ICMP de “echo request” e fica escutando pelos pacotes ICMP de “echo reply”. No entanto, o ping serve também para mostrar a rota que os pacotes ICMP fazem, tanto na “ida” quanto na “volta”. Para tanto, basta utilizar a opção “-R” do ping, como no exemplo abaixo:
# ping -c 1 -R 200.Z.Z.21
PING 200.X.X.21 (200.X.X.21) 56(124) bytes of data.
64 bytes from 200.X.X.21: icmp_seq=1 ttl=254 time=5.16 ms
RR: 200.X.X.36
200.X.Y.21
200.Z.Z.20
200.Z.Z.21
200.Z.Z.21
200.X.Y.22
200.X.X.41
200.X.X.36
— 200.Z.Z.21 ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.165/5.165/5.165/0.000 ms
A opção “-c N” serve para especificar quantos “pings” queremos enviar.
traceroute
O comando traceroute é utilizado para traçar rotas até um determinado IP. Ao contrário do “ping -R” o traceroute resolve os nomes (podendo-se desabilitar isso com a opção “-n”), e é capaz de traçar uma rota mesmo que o host não exista ou esteja inacessível. Obviamente o comando só irá traçar a rota até que um roteador responda com um “unreacheable” ou até o TTL expirar. Exemplo:
# traceroute 200.Z.Z.21
traceroute to 200.Z.Z.21 (200.Z.Z.21), 30 hops max, 38 byte packets
1 maquina1 (200.X.X.41) 2.501 ms 1.289 ms 1.316 ms
2 maquina2 (200.X.Y.22) 1.246 ms 1.358 ms 1.117 ms
3 destino (200.Z.Z.21) 1.153 ms 2.126 ms 1.004 ms
tracepath
O tracepath é um comando bastante similar ao traceroute, mas mostra o pmtu do caminho. Exemplo:
# tracepath 200.Z.Z.21
1: LOCALHOST pmtu 1500
1: maquina1 (200.X.X.41) 4.243ms
2: maquina2 (200.X.Y.22) 4.242ms
3: destino (200.Z.Z.21) 7.171ms reached
Resume: pmtu 1500 hops 3 back 3
tcpdump
O comando tcpdump serve para fazer um dump do tráfego de rede. Na sua operação normal ele coloca a interface de rede em modo promíscuo e imprime na tela uma breve descrição de todos os pacotes que chegam à interface. O tcpdump foi utilizado no exemplo acima sobre arping para mostrar as requisições e respostas arp na rede. Nesse documento vamos apenas citar alguns exemplos e deixar a cargo do leitor que olhe no manual do comando a imensa lista de opções que ele é capaz de aceitar.
Para mostrar os pacotes do tipo ICMP que chegam à interface eth0:
# tcpdump -i eth0 icmp
Para mostrar os pacotes com origem na máquina x.y.z.z:
# tcpdump src x.y.z.z
Para mostrar pacotes que tenham como origem ou destino a máquina x.y.z.z
# tcpdump host x.y.z.z
O Comando IP
O comando IP merece um tópico a parte, pois ele resume em apenas um comando funcionalidades do ifconfig, arp e route, além de permitir a manipulação de tabelas de rotas especiais e túneis. A sua forma básica é ip [ opções ] OBJETO { COMMAND | help }. Onde objeto os principais objetos são: link, addr, neigh, e route. Veremos a seguir em mais detalhes esses objetos. Os objetos tunnel e rule serão vistos em outra ocasião.
Vale lembrar que utilizando simplesmente “ip” ou “ip objeto help” o comando imprimirá um ajuda rápida.
ip link
O objeto link serve para mostrar e manipular opções dos dispositivos de rede. Através dele é possível ativar ou desativar uma interface, mudar os seus endereços de “hardware”, opções de arp e multicast e até mesmo “renomear” uma interface. Veremos aqui algumas opções mais utilizadas:
Para mostrar os dispositivos de rede (ao contrário do ifconfig, o ip link pode mostrar dispositivos que estejam inativos também):
# ip link show
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:55:5d:07:c6 brd ff:ff:ff:ff:ff:ff
3: eth1: mtu 1440 qdisc pfifo_fast qlen 1000
link/ether 11:22:33:44:55:66 brd ff:ff:ff:ff:ff:ff
Para ativar uma interface:
# ip link set eth0 up
Para mudar a mtu de um dispositivo:
# ip link set eth0 mtu 1480
ip addr
O objeto addr server para listar e manipular os endereços IPv4 / IPv6 das interfaces (virtuais ou não). Ao contrário do comando ifconfig, o comando ip addr é capaz de atribuir e mostrar mais de um endereço IPv4 para a mesma interface. Atenção, o comando ip addr mostra e espera como entrada endereços no formato addr/masklen. Exemplos:
Para mostrar os endereços das interfaces:
# ip addr show
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:55:5d:07:c6 brd ff:ff:ff:ff:ff:ff
inet 200.X.X.36/27 brd 200.238.128.63 scope global eth0
Para adicionar um endereço em uma interface:
# ip addr add 192.168.0.1/24 dev eth0
Para se remover a sintaxe é semenhante, mas usamos o del e não o add.
Para configurar um endereço ponto-a-ponto:
# ip addr add 192.168.0.2 peer 192.168.0.1
ip neigh
O objeto neigh é semelhante em funcionalidade ao comando arp, ou seja, serve para mostrar e manipular a tabela arp. Exemplos:
Para listar a tabela arp associada a uma determinada interface:
# ip neigh show dev eth0
200.X.X.41 dev eth0 lladdr 00:00:0c:95:0b:00 nud reachable
200.X.X.40 dev eth0 lladdr 00:60:08:a1:48:a6 nud reachable
Para inserir uma entrada na tabela arp:
# ip neigh add 10.0.0.1 lladdr 00:11:22:33:44:55 dev eth0
Para remover uma entrada basta trocar o “add” por “del”.
Para limpar toda a tabela arp associada a uma interface:
# ip neigh flush dev eth0
ip route
O objeto route é utilizado para mostrar e manipular as tabelas de rota do kernel. Ao contrário do comando route que só manipula a tabela de rotas principal, o ip route consegue manipular todas as tabelas de rotas (veremos em um outro capítulo mais detalhes sobre isso). Exemplos:
Para listar a tabela de rotas:
# ip route show
192.168.0.1 dev eth1 proto kernel scope link src 192.168.0.2
unreachable 10.20.20.0/24
blackhole 10.40.40.0/24
default via 200.X.X.41 dev eth0
Para mostrar uma rota para uma determinada rede ou host:
# ip route get 200.X.X.21
200.X.X.21 via 200.Z.Z.41 dev eth0 src 200.Z.Z.36
cache mtu 1500 advmss 1460
Para adicionar uma rota:
# ip route add 10.0.0.0/24 via 192.168.1.200
Para deletar rotas basta trocar o “add” por “del”.
Para acrescentar uma rota “blackhole” (os pacotes são silenciosamente descartados):
# ip route add blackhole 10.0.1.0/24
Para acrescentar uma rota “unreachable” (é gerado um ICMP host unreachable):
# ip route add unreachable 10.0.2.0/24
Automatizando a Configuração de Redes/Rotas
Até aqui mostramos como configurar interfaces, endereços e rotas manualmente. É claro que isso também pode ser feito automaticamente. Cada distribuição Linux coloca seus arquivos de configurações de rede em locais um pouco diferentes. A saber:
RedHat (e Mandrake)
* definação de interfaces /etc/sysconfig/network-scripts/ifcfg-*
* hostname e rota padrão gateway definition /etc/sysconfig/network
* Rotas estáticas /etc/sysconfig/static-routes
Slackware
* Definição de interfaces e rotas /etc/rc.d/rc.inet1
Debian
* Definição de rotas e interfaces /etc/network/interfaces
Como nosso foco é a distribuição Debian, vamos dar uma rápida olhada no arquivo /etc/network/interfaces. Exemplo:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 200.X.X.36
netmask 255.255.255.224
network 200.X.X.32
broadcast 200.X.X.63
gateway 200.X.X.41
Além das opções mostradas, cada interace aceita ainda as opções pre-up, up, down, post-down que podem ser utilizadas para se executar comandos ou scripts, antes de subir a interface, depois de subir, antes de descer e após descer a interface. Assim, por exemplo, se quisermos adicionarmos uma rota ao subir um determinada interface, poderíamos usar a seguinte linha dentro das opções da interface:
iface eth0 inet static
…
up ip route add 10.0.0.0/24 via 200.X.X.Y
Fonte: RNP












