Eu tenho um bind9
servidor DNS mestre e 2 servidores escravos em execução no IPv4 (Debian Jessie), usando /etc/bind/named.conf
:
listen-on-v6 { none; };
Quando tento conectar-me a diferentes servidores, cada conexão leva pelo menos 5 segundos (estou usando as informações de tempo de Joseph para depuração):
$ curl -w "@curl-format.txt" -o /dev/null -s https://example.com
time_namelookup: 5.512
time_connect: 5.512
time_appconnect: 5.529
time_pretransfer: 5.529
time_redirect: 0.000
time_starttransfer: 5.531
----------
time_total: 5.531
De acordo com curl
, a pesquisa leva a maior parte do tempo, no entanto, o padrão nslookup
é muito rápido:
$ time nslookup example.com > /dev/null 2>&1
real 0m0.018s
user 0m0.016s
sys 0m0.000s
Depois de forçar o curl
uso do IPv4, fica muito melhor:
$ curl -4 -w "@curl-format.txt" -o /dev/null -s https://example.com
time_namelookup: 0.004
time_connect: 0.005
time_appconnect: 0.020
time_pretransfer: 0.020
time_redirect: 0.000
time_starttransfer: 0.022
----------
time_total: 0.022
Desabilitei o IPv6 no host:
echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6
embora o problema persista. Eu tentei correr strace
para ver qual é o motivo dos tempos limite:
write(2, "*", 1*) = 1
write(2, " ", 1 ) = 1
write(2, "Hostname was NOT found in DNS ca"..., 36Hostname was NOT found in DNS cache
) = 36
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 4
close(4) = 0
mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f220bcf8000
mprotect(0x7f220bcf8000, 4096, PROT_NONE) = 0
clone(child_stack=0x7f220c4f7fb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f220c4f89d0, tls=0x7f220c4f8700, child_tidptr=0x7f220c4f89d0) = 2004
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
poll(0, 0, 4) = 0 (Timeout)
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
poll(0, 0, 8) = 0 (Timeout)
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
poll(0, 0, 16) = 0 (Timeout)
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
poll(0, 0, 32) = 0 (Timeout)
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER|SA_RESTART, 0x7f22102e08d0}, NULL, 8) = 0
poll(0, 0, 64) = 0 (Timeout)
Não parece ser um problema de firewall, pois nslookup
(ou curl -4
) está usando os mesmos servidores DNS. Alguma ideia do que pode estar errado?
Aqui está tcpdump
do host tcpdump -vvv -s 0 -l -n port 53
:
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:14:52.542526 IP (tos 0x0, ttl 64, id 35839, offset 0, flags [DF], proto UDP (17), length 63)
192.168.1.1.59163 > 192.168.1.2.53: [bad udp cksum 0xf9f3 -> 0x96c7!] 39535+ A? example.com. (35)
20:14:52.542540 IP (tos 0x0, ttl 64, id 35840, offset 0, flags [DF], proto UDP (17), length 63)
192.168.1.1.59163 > 192.168.1.2.53: [bad udp cksum 0xf9f3 -> 0x6289!] 45997+ AAAA? example.com. (35)
20:14:52.543281 IP (tos 0x0, ttl 61, id 63674, offset 0, flags [none], proto UDP (17), length 158)
192.168.1.2.53 > 192.168.1.1.59163: [udp sum ok] 45997* q: AAAA? example.com. 1/1/0 example.com. [1h] CNAME s01.example.com. ns: example.com. [10m] SOA ns01.example.com. ns51.domaincontrol.com. 2016062008 28800 7200 1209600 600 (130)
20:14:57.547439 IP (tos 0x0, ttl 64, id 36868, offset 0, flags [DF], proto UDP (17), length 63)
192.168.1.1.59163 > 192.168.1.2.53: [bad udp cksum 0xf9f3 -> 0x96c7!] 39535+ A? example.com. (35)
20:14:57.548188 IP (tos 0x0, ttl 61, id 64567, offset 0, flags [none], proto UDP (17), length 184)
192.168.1.2.53 > 192.168.1.1.59163: [udp sum ok] 39535* q: A? example.com. 2/2/2 example.com. [1h] CNAME s01.example.com., s01.example.com. [1h] A 136.243.154.168 ns: example.com. [30m] NS ns01.example.com., example.com. [30m] NS ns02.example.com. ar: ns01.example.com. [1h] A 136.243.154.168, ns02.example.com. [1h] A 192.168.1.2 (156)
20:14:57.548250 IP (tos 0x0, ttl 64, id 36869, offset 0, flags [DF], proto UDP (17), length 63)
192.168.1.1.59163 > 192.168.1.2.53: [bad udp cksum 0xf9f3 -> 0x6289!] 45997+ AAAA? example.com. (35)
20:14:57.548934 IP (tos 0x0, ttl 61, id 64568, offset 0, flags [none], proto UDP (17), length 158)
192.168.1.2.53 > 192.168.1.1.59163: [udp sum ok] 45997* q: AAAA? example.com. 1/1/0 example.com. [1h] CNAME s01.example.com. ns: example.com. [10m] SOA ns01.example.com. ns51.domaincontrol.com. 2016062008 28800 7200 1209600 600 (130)
EDIT: Nos logs de ligação freqüentemente aparece esta mensagem:
error sending response: host unreachable
No entanto, cada consulta é eventualmente respondida (leva apenas 5s). Todas as máquinas são servidores físicos (não é culpa do NAT), é mais provável que os pacotes estejam sendo bloqueados por um roteador. Aqui está uma pergunta relacionada muito provável: as pesquisas de DNS às vezes levam 5 segundos .
strace -tt
tornaria o rastreamento mais informativo ao rastrear atrasos.poll(0, 0, 1000) = 0 (Timeout)
. No lado do servidor DNS, estou recebendo erros frequenteserror sending response: host unreachable
que parecem que o pacote de saída está bloqueado (mas não paranslookup
).Respostas:
Resposta curta:
Uma solução alternativa está forçando
glibc
a reutilização de um soquete para consulta dos registrosAAAA
eA
, adicionando uma linha a/etc/resolv.conf
:A verdadeira causa desse problema pode ser:
AAAA
pacotes DNSResposta longa:
Programas como
curl
ouwget
usam a função getaddrinfo () da glibc , que tenta ser compatível com IPv4 e IPv6, procurando os dois registros DNS em paralelo. Ele não retorna o resultado até que os dois registros sejam recebidos (há vários problemas relacionados a esse comportamento ) - isso explica ostrace
acima. Quando o IPv4 é forçado,curl -4
internamente , comogethostbyname()
consultasA
apenas para registro.A partir
tcpdump
podemos ver que:-> A?
dois pedidos são enviados no início-> AAAA?
(solicitando endereço IPv6)<- AAAA
resposta-> A?
solicitando novamente o endereço IPv4<- A
obteve resposta-> AAAA?
solicitando IPv6 novamente<- AAAA
respostaUma
A
resposta é descartada por algum motivo, essa é a mensagem de erro:No entanto, não está claro para mim o porquê da necessidade de segunda
AAAA
consulta.Para verificar se você está tendo o mesmo problema, atualize o tempo limite em
/etc/resolv.conf
:como descrito aqui :
Existem duas outras opções relacionadas em
man resolv.conf
:Assuntos relacionados:
fonte
Como o @Tombart diz, o atraso é devido à espera pelo tempo limite da resolução IPv6.
Outro curso de ação possível é dar precedência ao IPv4 no /etc/gai.conf
Dos comentários em /etc/gai.conf
Após a alteração
gai.conf
, é necessário reiniciar qualquer aplicativo usando a biblioteca de resolvedores DNS para que a alteração entre em vigor.Lembre-se de que, se você estiver usando um servidor BIND sem conectividade IPv6, aconselho desativar o IPv6
named
e retirar as dicas de raiz dos endereços IPv6. Obviamente, ele ainda tentará resolver os endereços AAAA.Portanto, para a configuração do BIND,
Em / etc / default / bind9, adicione -4 para endereços IPv4:
e
/etc/bind/db.root
exclua todas as linhas com raízes de DNS AAAA.fonte
Eu tive um problema semelhante ao usar o BIND9. Para corrigir isso, eu precisava adicionar:
opção para o meu
named.conf
.( Mais informações )
fonte