Pular para o conteúdo principal

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

 

© 2024 Stratus Technologies.