FreeBSD Handbook/Administração/Configuração e Ajuste/Configurando Interfaces de Rede



11.8 Configurando Interfaces de RedesEditar

Contribuição de Marc Fonvieille.

Hoje não podemos pensar em um computador sem pensar em uma conexão de rede. Adicionar e configurar uma placa de rede é uma tarefa comum para qualquer administrador FreeBSD.

11.8.1 Encontrando o Driver CorretoEditar

Antes de começar, você deve saber o modelo da placa você tem, o chip que ele usa, e se é uma placa PCI ou ISA. O FreeBSD suporta uma ampla variedade de placas PCI e ISA. Verifique a lista de compatibilidade de hardware para sua versão para ver se sua placa é suportada.

Uma vez que tendo certeza de que sua placa é suportada, você precisa determinar o driver apropriado para ela. Os arquivos /usr/src/sys/conf/NOTES e /usr/src/sys/arch/conf/NOTES lhe darão a lista de drivers de interface de rede com algumas informações sobre os chipsets/placas suportadas. Se você tem dúvidas sobre qual driver é o correto, leia a página de manual do driver. A página de manual vai lhe dar mais informações sobre o hardware suportado e até mesmo os possíveis problemas que poderiam ocorrer.

Se você possui uma placa de rede comum, na maioria das vezes você não terá que procurar muito por um driver. Drivers para placas de rede comuns estão presentes no kernel GENERIC, então sua placa deve aparecer durante a inicialização, assim:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto

Neste exemplo, vemos que duas placas usando o driver dc(4) estão presentes no sistema.

Se o driver para sua placa de rede não está presente no GENERIC, você vai precisar carregar o driver apropriado para usá-la. Isto pode ser feito de duas maneiras:

  1. A maneira mais fácil é simplesmente carregar um módulo de kernel para sua placa de rede com kldload(8), ou automaticamente no momento da inicialização adicionando a linha apropriada no arquivo /boot/loader.conf. Nem todos os drivers estão disponíveis como módulos, exemplos notáveis de dispositivos para os quais não existem módulos são placas ISA.
  2. Alternativamente, você pode compilar estaticamente o suporte para sua placa no kernel. Verifique /usr/src/sys/conf/NOTES, /usr/src/sys/arch/conf/NOTES e a página de manual do driver para saber o que adicionar em seu arquivo de configuração do kernel. Para obter mais informações sobre como recompilar seu kernel, consulte o Capítulo 8. Se a sua placa foi detectada durante o boot pelo seu kernel (GENERIC) você não tem que construir um novo kernel.

11.8.1.1 Usando Drivers NDIS Windows ®Editar

Infelizmente, ainda existem muitos fabricantes que não fornecem os esquemas dos seus drivers para a comunidade de software livre, pois guardam tais informações como segredos comerciais. Em função disso, os desenvolvedores do FreeBSD e outros sistemas operacionais têm duas opções: desenvolver os drivers por um processo longo e doloroso de engenharia reversa ou usando o driver binário existente disponível para as plataformas Microsoft® Windows. A maioria dos desenvolvedores, incluindo os envolvidos com o FreeBSD, utilizaram a segunda abordagem.

Graças à contribuição de Bill Paul (wpaul) há suporte "nativo" para a Especificação de Interface de Driver de Rede (Network Driver Interface Specification - NDIS). O NDISulator do FreeBSD (também conhecido como Projeto Evil) pega um driver binário do Windows e, basicamente, o engana para que ele pense estar sendo executado no Windows. Em função do driver ndis(4) usar um binário do Windows, ele só pode ser usado em sistemas i386™ e amd64.

Nota: O driver ndis(4) é projetado para suportar, principalmente dispositivos PCI, Cardbus e PCMCIA. Dispositivos USB ainda não são suportados.

Para usar o NDISulator, você precisará de três coisas:

  1. Fontes do kernel
  2. Driver binário do Windows XP (com extensão .sys)
  3. Arquivo de configuração do driver do Windows XP (com extensão .inf)

Localise os arquivos da sua placa. Normalmente eles podem ser encontrados nos CDs fornecidos ou no site do fabricante. No exemplo seguinte usaremos os arquivos W32DRIVER.SYS e W32DRIVER.INF.

Nota: Você não pode usar um driver de Windows/i386 no FreeBSD/amd64, é necessário obter um driver de Windows/amd64 para que o esquema funcione corretamente.

O próximo passo é compilar o driver binário em um módulo de kernel carregável. Para isso, como root, use ndisgen(8):

# ndisgen /caminho/para/W32DRIVER.INF /caminho/para/W32DRIVER.SYS

O ndisgen(8) é interativo e irá pedir qualquer informação extra que precisar. Ele produzirá um módulo do kernel no diretório atual, que pode ser carregado assim:

# kldload ./W32DRIVER_SYS.ko

Além do módulo de kernel gerado, você deve carregar os módulos ndis.ko e if_ndis.ko. Isso deve ser feito automaticamente quando você carregar qualquer módulo que dependa do ndis(4). Se você quiser carregá-los manualmente, use os seguintes comandos:

# kldload ndis
# kldload if_ndis

O primeiro comando carrega o driver de miniporta NDIS wrapper, o segundo carrega a interface de rede.

Agora, execute o dmesg(8) para ver se houve algum erro. Se tudo correu bem, você deve obter uma saída semelhante a seguinte:

 ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
 ndis0: NDIS API version: 5.0
 ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
 ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
 ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

A partir daí você pode tratar o dispositivo ndis0 como qualquer outra interface de rede (por exemplo, dc0).

Você pode configurar o sistema para carregar os módulos NDIS em tempo de inicialização da mesma forma que qualquer outro módulo. Primeiro, copie o módulo gerado, W32DRIVER_SYS.ko, para o diretório /boot/modules. Em seguida adicione a seguinte linha ao /boot/loader.conf:

 W32DRIVER_SYS_load="YES"

11.8.2 Configurando a Placa de RedeEditar

Depois de carregado o controlador de dispositivo (driver) correto para a placa de rede, é preciso que ela seja configurada. Assim como muitos outros itens, a placa de rede pode já ter sido configurada pelo programa sysintall no momento da instalação.

Para exibir informações sobre as interfaces de rede presentes no sistema, execute o seguinte comando:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=80008<VLAN_MTU,LINKSTATE>
       ether 00:a0:cc:da:da:da
       inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
       media: Ethernet autoselect (100baseTX <full-duplex>)
       status: active
dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=80008<VLAN_MTU,LINKSTATE>
       ether 00:a0:cc:da:da:db
       inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
       media: Ethernet 10baseT/UTP
       status: no carrier
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
       options=3<RXCSUM,TXCSUM>
       inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
       inet6 ::1 prefixlen 128
       inet 127.0.0.1 netmask 0xff000000
       nd6 options=3<PERFORMNUD,ACCEPT_RTADV>


Nota: Versões antigas do FreeBSD podem exigir que o comando ifconfig(8) seja acompanhado da opção -a. Para obter mais detalhes sobre a sintaxe correta do ifconfig(8), favor consultar a página do manual.

Neste exemplo, o comando mostra os seguintes dispositivos:

  • dc0: A primeira interface Ethernet
  • dc1: A segunda interface Ethernet
  • plip0: A interface da porta paralela (se a porta paralela existir na máquina)
  • lo0: O dispositivo de loopback

Para dar nome às placas de rede, o FreeBSD utiliza o nome do controlador (driver) seguido pela ordem na qual uma placa é detectada pelo kernel (núcleo do sistema) durante a inicialização do sistema. Por exemplo, sis2 seria a terceira placa de rede no sistema a usar o controlador sis(4)

Neste exemplo, o dispositivo dc0 está instalado e funcionando. Os principais indicadores são:

  1. UP significa que a placa está configurada e pronta para uso.
  2. A placa tem um endereço de Internet (inet) (neste caso 192.168.1.3)
  3. Ela possui uma máscara de sub-rede válida (netmask; 0xffffff00 é o mesmo que 255.255.255.0).
  4. Possui um endereço de divulgação (broadcast) válido (neste caso, 192.168.1.255).
  5. O endereço MAC da placa (ether) é 00:a0:cc:da:da:da
  6. A escolha do meio físico (mídia) está no modo de seleção automática (media: Ethernet autoselect (100baseTX <full-duplex>)). Vemos que dc1 foi configurado para ser executado com o meio físico 10baseT/UTP. Para obter mais informações sobre os tipos de mídia disponíveis para um determinado controlador de dispositivo, consulte a página de manual do mesmo.
  7. status: active indica que o estado da ligação (link status) encontra-se ativo, ou seja, o sinal foi detectado. Para dc1, vemos status: no carrier. É normal que isso aconteça quando um cabo Ethernet não está conectado à placa.

Caso a saída do comando ifconfig(8) fosse algo similar a:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=80008<VLAN_MTU,LINKSTATE>
       ether 00:a0:cc:da:da:da
       media: Ethernet autoselect (100baseTX <full-duplex>)
       status: active

estaria indicando que a placa não foi configurada.

Para configurar a placa de rede, você precisa ter privilégios de super-usuário (Capítulo 13.3 O Super Usuário). A configuração da placa de rede pode ser feita a partir da linha de comando através do ifconfig(8), mas nesse caso seria necessário repetir o comando após cada inicialização do sistema. Para evitar isso, a configuração da placa de rede deve ficar armazenada no arquivo /etc/rc.conf.

Abra /etc/rc.conf no seu editor favorito e adicione uma linha para cada placa de rede presente no sistema. Por exemplo, no nosso caso, adicionaríamos as linhas a seguir:

ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"

Será preciso substituir dc0, dc1, etc, com a identificação do controlador adequado para a placa de rede em uso, e indicar os endereços IP apropriados. Consulte a página do manual referente ao controlador da placa e ao ifconfig(8) para mais detalhes sobre as opções disponíveis e também a página do manual referente ao rc.conf(5) para mais informações sobre a sintaxe a ser usada no arquivo /etc/rc.conf.

Caso a rede tenha sido configurada durante o processo de instalação, linhas referentes à(s) placa(s) de rede podem já estar presentes. Verifique o arquivo /etc/rc.conf com atenção redobrada antes de incluí-las.

Também será preciso editar /etc/hosts para adicionar os nomes e endereços IP das várias máquinas da rede local (LAN), caso tais informações já não se encontrem no arquivo. Para maiores informações, consulte a página do manual hosts(5) e também os exemplos em /usr/share/examples/etc/hosts.

Nota: Se a máquina for acessar a internet, será preciso também configurar manualmente o gateway padrão e o servidor de nomes (DNS):

 # echo 'defaultrouter="your_default_router"' >> /etc/rc.conf
 # echo 'nameserver your_DNS_server' >> /etc/resolv.conf

11.8.3 Testes e Solução de ProblemasEditar

Depois de feitas as mudanças necessárias em /etc/rc.conf, é preciso reiniciar o sistema. Isso vai permitir que as mudanças sejam efetivadas, e verificar se o sistema consegue reiniciar sem nenhum erro de configuração.

Depois que o sistema já foi reiniciado, você deve testar as interfaces de rede.

11.8.3.1 Testando a Interface EthernetEditar

Para confirmar que uma interface de rede está configurada corretamente, há duas operações a realizar. Primeiro, realizar um ping para a própria interface de rede, e então um segundo ping para outra máquina na rede local.

Primeiro teste a interface local:

% ping -c5 192.168.1.3

PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms

E então, para testar o tráfego com outra máquina na rede local:

% ping -c5 192.168.1.2

PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

Seria possível utilizar o nome da máquina em vez de 192.168.1.2 caso os ajustes no arquivo /etc/hosts tenham sido feitos.

11.8.3.2 Solucionando ProblemasEditar

Resolver problemas de configuração de hardware e software é sempre um transtorno, que pode ser aliviado ao serem verificados previamente itens simples: o cabo de rede está conectado? Você configurou adequadamente os serviços de rede? O firewall está configurado adequadamente? O FreeBSD oferece suporte a este modelo de placa de rede? Sempre verifique as notas de hardware antes de enviar um relatório de bug. Atualize sua versão do FreeBSD para a versão STABLE mais recente. Verifique o histórico das listas de discussão, ou, talvez, pesquise na Internet.

Caso a placa esteja funcionando, mas com um desempenho muito baixo, pode valer a pena consultar a página do manual sobre o tuning(7). Você também pode verificar as configurações de rede procurando por ajustes incorretos que possam causar lentidão nas conexões.

Mensagens de “device timeout” podem surgir eventualmente para alguns usuários, o que é normal para certos tipos de placas de rede. Caso o problema persista, é uma boa idéia certificar-se de que não haja nenhum conflito com outros dispositivos. Verifique com cuidado o encaixe físico dos cabos. Talvez seja necessário adquirir uma nova placa de rede.

Às vezes podem surgir também erros de “watchdog timeout”. A primeira coisa a ser feita é verificar o cabo de rede. Muitas placas de rede exigem que o encaixe (slot) PCI da placa mãe ofereça suporte a Bus Mastering - o que, em alguns modelos mais antigos, só irá acontecer para um dos encaixes PCI, geralmente o de número 0. Verifique a documentação da placa de rede e da placa mãe para determinar se essa é a causa do problema.

A mensagem de “No route to host” surge quando o sistema não consegue estabelecer uma rota para o endereço de destino (host) de um pacote. Isso pode ocorrer caso não haja rota especificada por padrão, ou se houver algum cabo desconectado. Verifique a saída do comando netstat -rn e certifique-se de haver uma rota válida para o alvo. Caso não exista, leia o [capítulo 31].

Erros de “ping: sendto: Permission denied” costumam ser causados por um firewall mal configurado. Caso ipfw esteja habilitado no kernel mas nenhuma regra haja sido definida, então a política aplicada por padrão é a de negar todo e qualquer tráfego - inclusive pedidos de ping! Leia o [capítulo 30] para mais informações.

Algumas vezes o desempenho da placa de rede pode se mostrar fraco, ou abaixo da média. Nesses casos, o melhor é ajustar a escolha do meio físico, trocando de autoselect (seleção automática) para o meio correto. Este procedimento costuma funcionar para a maioria dos dispositivos, embora possa não solucionar todas as ocorrências desse problema. É sempre bom verificar todas as configurações de rede, e reler a página do manual sobre tuning(7).