Como é bem provável que você esteja trabalhando em uma rede mista, com pelo menos
Linux e Windows, é quase certo que você já tenha
passado por problemas de resolução de nomes para as máquinas Linux enxergarem as Windows. Você já deve ter tentado pingar uma
estação Windows e não conseguir uma reposta, e ficou surpreso quando descobriu que o mesmo ping partindo de uma estação Windows
funciona normalmente. Esse tópico visa explicar o motivo disso acontecer.
Desde a época do Windows 3.11, a rede Microsoft trabalha com nomes
Netbios. O Netbios é
extremamente simples e, por isso mesmo, contém algumas limitações, entre as quais o limite de 16 caracteres no nome, e o fato de não
ser roteável. Ele era usado onde as redes não eram muito grandes. Hoje, o Netbios foi adicionado ao TCP/IP da Microsoft. No Linux não há
o protocolo Netbios. Quem implementa isso é o
Samba.
Para exemplificar, vamos supor que você esteja em uma máquina Windows e precise acessar outra máquina Windows de nome servidor1.
Quando tentamos resolver um nome Netbios, os passos executados pelo resolvedor do Windows são os seguintes:
- O resolvedor adiciona o sufixo DNS configurado nas opções de rede. Por exemplo vivaolinux.com.br;
- O resolvedor verifica se o nome servidor1.vivaolinux.com.br está em seu cache dns;
- Se não estiver, o resolvedor consulta o arquivo c:\windows\system32\drivers\etc\hosts;
- Se não existir, o resolvedor faz uma consulta ao DNS;
- Se o DNS não resolver, o sufixo é retirado do nome e passa-se a usar o Netbios;
- O resolvedor consulta o cache netbios para ver se o nome já foi resolvido;
- Caso não existe, o resolvedor consulta o servidor Wins (semelhante ao DNS, mas para nomes Netbios);
- Se o Wins não resolver, será feito um broadcast;
- Se não resolver por broadcast, o arquivo c:\windows\system32\drivers\etc\lmhosts será usado.
Como geralmente existe um servidor DNS interno e que os nomes netbios são mapeados para DNS (por exemplo, existe um registro no
DNS interno para a máquina servidor1), pingar "servidor1" é o mesmo que pingar "servidor1.vivaolinux.com.br". Esse mapeamento
geralmente é criado quando a estação é colocada no domínio do Active Directory do Windows. O
Active Directory cria uma entrada no DNS
Interno para a estação. Mas se uma máquina não está no domínio (algo comum em estações Linux), esta não será configurada no DNS.
Assim, quando uma estação Linux tentar pingá-la, ela não responderá na rede, pois o Linux não faz consultas Netbios, fazendo somente
os 4 primeiros passo da resolução de nomes do Windows.
Uma forma de amenizar isso é utilizar o programa nbtscan. Na sua forma mais simples, ele consulta um IP e traz os registros netbios
associados a este IP.
nbtscan 172.20.1.8
Resposta:
IP address NetBIOS Name Server User MAC address
------------------------------------------------------------------------------------------------------------------------------------------------------------
172.20.1.8 SRVAPL <server> <unknown> 00:1c:c4:c1:9c:b4
Uma opção interessante é fazer com que o nbtscan vasculhe toda a rede a gere uma saída no formato do arquivo hosts. Um script
poderia rodar isso todo dia e atualizar o arquivo /etc/hosts. Para rodar esse comando devemos estar logado como root.
# nbtscan -e 172.20.0.0/16
Resposta:
172.20.0.0 Sendto failed: Permission denied
172.20.0.10 PWKS0220
172.20.1.6 PSRV014
172.20.1.1 PSRV011
172.20.1.8 SRVAPL
172.20.1.20 PSRV020
172.20.1.4 PSRV029
172.20.1.86 PSRV028
...
Se preferir usar uma saída no estilo lmhosts, use o parâmetro "-l" ao invés de "-e"