Antes da 17.1 STCP resolveria nomes de hosts consultando primeiro qualquer DNS configurado e somente se não houvesse resposta ou uma resposta negativa dos servidores de nomes pesquisaria o arquivo de hosts local.
A partir de 17.1 você tem agora a opção de pesquisar primeiro o arquivo do anfitrião local, mas há algumas condições. Primeiro, sua aplicação tem que ser construída sob as regras do POSIX em um sistema 17.1. O conjunto padrão de comandos em >system>stcp>command_library são todos construídos desta forma, mas você não pode simplesmente instalar o 17.1 sem reconstruir suas aplicações e esperar usar este recurso. Em segundo lugar você deve instalar o Name Service Switch, nsswitch.conf, arquivo de configuração no diretório >system>stcp. Uma versão padrão do arquivo pode ser encontrada no diretório >system>stcp>templates.
Como você pode ver na figura 1, o arquivo nsswitch.conf parece controlar todos os tipos de coisas. Entretanto, apenas as entradas "hosts" e "redes" têm algum efeito sobre o comportamento do sistema. A ordem das palavras-chave "dns" e "files" controlam a ordem de busca. Se "files" vier primeiro, os hosts ou arquivos de rede serão pesquisados antes de consultar o DNS. Se "dns" vier primeiro, então o DNS será consultado antes de pesquisar os arquivos. Se a entrada "hosts" ou "redes" incluir apenas uma das palavras-chave, então será feita apenas a busca correspondente a essa palavra-chave.
A principal razão para utilizar o arquivo host em vez de apenas consultar o DNS é a recuperação e controle de velocidade/desastre. Como mostra o exemplo 1, quando um dos servidores de nomes não responde, o tempo de resolução do nome passa de 20 milissegundos para quase 2 segundos. Se nenhum de seus servidores de nomes estiver respondendo, o tempo de resolução de nomes pode ser muito longo(exemplo 2). Ao colocar nomes críticos no arquivo host e pesquisar o arquivo host primeiro, você não precisa se preocupar com o tempo que leva para resolver nomes(exemplo 3).
Outro motivo para procurar primeiro o arquivo anfitrião é o controle local. Ao utilizar um DNS, você desiste do controle do processo de resolução do nome. Sob a maioria das condições, isto funciona sem problemas, mas às vezes é necessário um controle local. Por exemplo, se for necessário bloquear temporária ou permanentemente o acesso a um host, você pode fazê-lo no firewall ou redirecionando as solicitações para um host problemático para um endereço diferente, alterando o banco de dados DNS ou o arquivo do host. Pode não ser possível alterar o banco de dados DNS e as alterações no firewall podem demorar muito tempo, mas você pode alterar seu próprio arquivo de hosts. O exemplo 4 mostra que o acesso a www.google.com é redirecionado para um host local.
O lado negativo do arquivo host é que o mapeamento entre os nomes dos hosts e os endereços IP é estático. Como exemplo 5, os servidores de nomes podem ser configurados para fornecer diferentes endereços IP para espalhar a carga entre vários servidores de aplicação. Se você adicionar uma entrada no arquivo de hosts, essa entrada é estática e você perde o benefício de qualquer balanceamento de carga que o DNS possa fornecer. Além disso, você deve manter manualmente o arquivo de hosts se/quando os endereços IP do host forem alterados.
Então, como você deve configurar o arquivo nsswitch.conf. Os comentários no arquivo(figura 1) sugerem que você não instale o arquivo no diretório >system>stcp até que todas as suas aplicações tenham sido reconstruídas para utilizá-lo. Isto evitará possíveis resultados divergentes onde a aplicação antiga usa DNS obtendo um endereço enquanto as novas aplicações usam o arquivo host obtendo um endereço diferente(exemplo 4). Além disso, como o DNS sempre foi consultado primeiro, é bem possível que haja entradas em um arquivo de hosts existente que não estejam mais corretas. Uma estratégia alternativa é instalar o arquivo com a entrada do host definida como "files dns", mas certifique-se de que a única entrada no arquivo de hosts seja localhost(exemplo 6). Você pode então adicionar endereços host /IP ao arquivo host conforme necessário, com um mínimo de edição, tendo em mente que qualquer aplicação antiga não verá o endereço do arquivo host.
OK, e as redes? Sempre foi possível dar um nome a uma rede colocando-a no arquivo >system>stcp>networks. Pessoalmente, eu nunca vi a necessidade, mas você poderia usar um nome ao adicionar uma rota. Curiosamente, o nome não é exibido quando você imprime rotas(exemplo 7). Você também pode usar um nome ao usar o argumento -network no comando arp. O arquivo nsswitch.conf padrão para redes pesquisa primeiro o arquivo de rede e depois consulta o DNS. A menos que você realmente tenha seu DNS configurado para retornar informações do nome da rede, minha sugestão é remover a palavra-chave dns da entrada da rede.
Um último ponto. Incluí dois programas de exemplo. O primeiro resolve.c usa a antiga função de resolução de nomes gethostbyname; o segundo, new_resolve.c usa a nova função getaddrinfo. A função gethosthostbyname foi substituída pela função padrão POSIX getaddrinfo. Por ser o padrão POSIX você não encontrará nenhuma documentação sobre getaddrinfo em Stratadoc; no entanto, há uma grande quantidade de documentação na web, basta ir ao Google getaddrinfo.
Exemplos:
Nos exemplos a seguir, a resolução_17.0 e os programas de resolução são baseados no mesmo código fonte. A única diferença é que resolve_17.0 foi compilado em um sistema VOS 17.0 enquanto resolve foi compilado em um sistema 17.1. Os servidores de nomes 1.1.1.1.1, 1.1.1.2, e 1.1.1.3 são ficções e são usados para simular um servidor de nomes que não responde. Também X'ed os números de hosts que não estão em uma rede pública.
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-24 08:07:13 mst nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX pronto 08:07:13 resolve_17.0 ftp.stratus.com ftp.stratus.com resolvido para 192.52.248.14 em 20.615 ms pronto 08:07:20 d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-24 08:07:30 mst nameserver 1.1.1.1.1 nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX pronto 08:07:30 resolve_17.0 ftp.stratus.com ftp.stratus.com resolvido para 192.52.248.14 em 1989.395 ms pronto 08:07:38 |
Exemplo 1 - mudança no tempo quando um servidor de nomes (1.1.1.1) não responde |
d >system>stcp>resolv.conf -match nameserver
%phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-23 13:11:31 mst
nameserver 1.1.1.1.1
nameserver 1.1.1.2
nameserver 1.1.1.1.3
pronto 13:11:31
resolve_17.0 ftp.stratus.com
ftp.stratus.com resolvido para 192.52.248.14 em 14759.949 ms
pronto 13:12:13
|
Exemplo 2 - tempo para resolver um nome quando nenhum servidor de nomes responde |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-24 08:18:10 mst nameserver 1.1.1.1.1 nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX pronto 08:18:10 d >system>stcp>nsswitch.conf -match hosts: %phx_vos#m16_mas>system>stcp>nsswitch.conf 11-05-24 08:18:21 mst hospedeiros: arquivos dns pronto 08:18:21 resolver ftp.stratus.com ftp.stratus.com resolvido para 192.52.248.14 em 13.702 ms pronto 08:18:31 resolve www1.stratus.com www1.stratus.com resolveu para 134.111.1.84 em 227.798 ms pronto 08:18:39 |
Exemplo 3 - diferença de tempo ao procurar primeiro o arquivo anfitrião e encontrar/não encontrar uma entrada |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-23 13:28:51 mst nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX pronto 13:28:51 d %phx_vos#m16_mas>sistema>stcp>hosts -match google %phx_vos#m16_mas>sistema>stcp>hosts 11-05-23 13:29:29 mst 127.0.0.0.1 www.google.com google.com google pronto 13:29:29 resolve_17.0 www.google.com www.google.com resolvido a 74.125.226.115 em 180.099 ms pronto 13:29:40 resolver www.google.com www.google.com resolvido a 127,0,0,1 em 13,458 ms pronto 13:30:01 |
Exemplo 4 - bloqueio de acesso a www.google.com alterando seu endereço para localhost para novas aplicações |
resolver www.yahoo.com www.yahoo.com resolveu 67.195.160.76 em 21.439 ms pronto 13:35:56 resolver www.yahoo.com www.yahoo.com resolveu 69.147.125.65 em 21.713 ms pronto 13:35:56 resolver www.yahoo.com www.yahoo.com resolveu 67.195.160.76 em 30.106 ms pronto 13:35:57 resolver www.yahoo.com www.yahoo.com resolveu 69.147.125.65 em 29.739 ms pronto 13:35:58 resolver www.yahoo.com www.yahoo.com resolveu 67.195.160.76 em 23.880 ms pronto 13:35:58 resolver www.yahoo.com www.yahoo.com resolveu 69.147.125.65 em 22.736 ms pronto 13:35:58 |
Exemplo 5 - O DNS fornece múltiplos endereços IP |
d >sistema>stcp>hosts %phx_vos#m16_mas>sistema>stcp>hosts 11-05-24 08:32:51 mst # # Arquivo de anfitriões de amostras # # Nome de endereço IP alias Comentário(s) # 127.0.0.1 loopback-host localhost loopback lb # necessário pronto 08:32:51 |
Exemplo 6 - arquivo de anfitrião mínimo |
adicionar rota noahs-test 164.152.XXX.XXX 5.255.255.0 pronto 13:52:54 imprimir o itinerário Porta de entrada padrão: 164.152.XXX.XXX Máscara de Endereço da Subrede de Endereço da Rede Vida Redirecionada 1.2.3.0 164.152.XXX.XXX 255.255.255.255.0 pronto 13:53:26 d redes -match noahs-test %phx_vos#m16_mas>system.17.1>stcp>networks 11-05-23 13:53:48 mst noahs-teste 1.2.3.0 pronto 13:53:48 |
Exemplo 7 - adicionar uma rede usando um nome na tabela de redes |
# # Amostra nsswitch.conf(5) - arquivo de configuração da chave de serviço de nome # # Este arquivo de configuração é usado somente por programas que foram construídos # sob as regras POSIX no release 17.1 ou posterior. Se esta configuração # não está presente, a pesquisa do nome do hospedeiro será compatível com o # versões mais antigas do software DNS. Para evitar confusão, nós # recomendar que você adie o uso deste arquivo de configuração até que todos # aplicações foram reconstruídas usando o POSIX. # # O software DNS não-POSIX (e todo o software DNS antes do lançamento # 17.1) resolved hosts usando primeiro o DNS e depois usando o >system>stcp>hosts file. Isto tem um par de pequenos problemas: # # 1. Se houver uma entrada ruim no arquivo do anfitrião, ele não receberá # detectado até que algo faça com que o DNS desapareça. Este # poderia resultar em confusão exatamente quando não se quer. # # 2. Não há como superar um mau anfitrião voltando do DNS. # # 3. A maioria das outras implementações busca primeiro o arquivo anfitrião. # # Nenhuma delas é suficientemente convincente para fazer uma mudança incompatível # para o comportamento padrão; entretanto, você pode mudar a ordem de busca # usando este arquivo para evitar as questões acima. Para pesquisar o arquivo anfitrião # primeiro, você quer: # # hospedeiros: arquivos dns # # a fazer primeiro o DNS e permanecer 100% compatível com o comportamento de # lançamentos anteriores de VOS, você quer: # # hospedeiros: arquivos dns # # Também, note que o software não-POSIX e pré 17.1 nunca usou o dns para # procurando por redes. O novo software faz. Por padrão, ele faz isto # depois de procurar no >system>stcp>networks file. Pode-se configurar # este comportamento, também. Normalmente não há muita informação útil que # volta do DNS para redes. Se você quiser desativar as buscas no DNS # para redes, faça isso: # # redes: arquivos # grupo: compatriota group_compat: nis hospedeiros: arquivos dns redes: arquivos dns senha: compatriota passwd_compat: nis conchas: arquivos serviços: compatriota serviços_compat: nis protocolos: arquivos rpc: arquivos |
Figura 1 - arquivo nsswitch.conf padrão encontrado em >system>stcp>templates |
#define _POSIX_C_SOURCE 200112L #include <netdb.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main (argc, argv) int argc; char *argv []; { struct hostent *hInfo; /* used to hold host information including IP address after resolving hostname */ long long jJiffy1; /* starting jiffy time */ long long jJiffy2; /* ending jiffy time */ extern void s$read_jiffy_clock(long long *); double milliseconds; /* ms between jJiffy2 & jJiffy1 */ /* process arguments. If we don't have exactly the right number of arguments print out a usage message, a version message and exit */ if (argc != 2) { printf ("Usage:ntresolve hostnamen"); exit (0); } /* Take a timestamp, resolve the name and take another timestamp */ s$read_jiffy_clock (&jJiffy1); hInfo = gethostbyname (argv [1]); s$read_jiffy_clock (&jJiffy2); milliseconds = (jJiffy2 - jJiffy1) / 65.536; if (hInfo == NULL) printf ("nCould not resolve the address of %s - %3.3f msn", argv [1], milliseconds); else { printf ("%s resolved to %s in %3.3f msn", argv [1], inet_ntoa (*(struct in_addr *)(hInfo -> h_addr_list [0])), milliseconds); } endhostent (); } |
Figura 2 - resolve.c usa a antiga função gethostbyname |
#define _POSIX_C_SOURCE 200112L #include <netdb.h> #include <arpa/inet.h> #include <sys/socket.h> #include <stdlib.h> #include <stdio.h> int main (argc, argv) int argc; char *argv []; { struct addrinfo *addressInfo; /* used to hold host information */ struct sockaddr_in *sin; /* template to extract addr info */ int error; long long jJiffy1; /* starting jiffy time */ long long jJiffy2; /* ending jiffy time */ extern void s$read_jiffy_clock(long long *); double milliseconds; /* ms between jJiffy2 & jJiffy1 */ char szIP [16]; /* holds printable IP address */ /* process arguments. If we don't have exactly the right number of arguments print out a usage message, a version message and exit */ if (argc != 2) { printf ("Usage:ntresolve hostnamen"); exit (0); } /* Take a timestamp, resolve the name and take another timestamp */ s$read_jiffy_clock (&jJiffy1); error = getaddrinfo (argv [1], NULL, NULL, &addressInfo); s$read_jiffy_clock (&jJiffy2); milliseconds = (jJiffy2 - jJiffy1) / 65.536; if (error != 0) printf ("nCould not resolve the address of %s - %3.3f msn", argv [1], milliseconds); else { if (inet_ntop (AF_INET, &(((struct sockaddr_in *)(addressInfo->ai_addr))-> sin_addr.S_un.S_addr), szIP, 16) == NULL) printf ("Could not convert address %xn", (((struct sockaddr_in *)(addressInfo->ai_addr))-> sin_addr.S_un.S_addr)); else printf ("%s resolved to %s in %3.3f msn", argv [1], szIP, milliseconds); } freeaddrinfo (addressInfo); } |
Figura 3 - new_resolve.c usa a nova função getaddrinfo padrão POSIX |