역방향 조회 0.0.0.0 시간 초과

역방향 조회 0.0.0.0 시간 초과

임베디드 Linux 장치에서 0.0.0.0시작 시 IP 주소의 역방향 조회를 요구하는 애플리케이션을 실행하고 있습니다. 이것은 결국 이라고 불릴 것입니다 gethostbyaddr.

때로는 gethostbyaddr통화가 즉시 완료(실패)되기도 하지만 때로는 5~10초 정도 지연(DNS 시간 초과?)되는 경우도 있습니다. 어떤 상황에서 지연이 발생하는지 확인할 수 없었습니다.

몇 가지 팁:

  • 초기 초기화 스크립트 중 하나에서 다음 명령을 실행하여 시작 시 IP6 지원을 비활성화합니다.

    echo 1 >/proc/sys/net/ipv6/conf/all/disable_ipv6
    echo 1 >/proc/sys/net/ipv6/conf/default/disable_ipv6
    echo 1 >/proc/sys/net/ipv6/conf/lo/disable_ipv6
    

    (제 생각에는) 이것은 포기되어야 합니다:https://www.netroby.com/view/3695

  • 저는 Avahi/MDNS를 사용하고 있지 않습니다. 이로 인해 다음이 삭제됩니다.https://bugs.launchpad.net/ubuntu/+source/nss-mdns/+bug/94940

  • 장치가 로컬 DNS 서비스를 실행하고 있지 않습니다.

  • 이 문제는 DHCP 또는 고정 IP 구성에서 발생합니다. DHCP를 사용할 때 내 DSL 라우터는 자신을 DNS 서버로 광고합니다. 하지만 고정 IP 구성을 사용할 때는 8.8.8.8을 DNS 서버로 사용합니다(따라서 DSL 라우터 측에서 문제가 있는 DNS 서버가 삭제되어야 합니다).

여기서 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?


고쳐 쓰다:

현재 관련 줄은 다음 /etc/nsswitch.conf과 같습니다.

hosts: files dns

단순화된 테스트 애플리케이션을 사용하여 문제를 재현했습니다. 다음은 시간 초과가 발생할 때 strace 출력의 일부입니다.

291   23:34:30 connect(6, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 <0.000077>
291   23:34:30 gettimeofday({tv_sec=1514849670, tv_usec=139862}, NULL) = 0 <0.000032>
291   23:34:30 poll([{fd=6, events=POLLOUT}], 1, 0) = 1 ([{fd=6, revents=POLLOUT}]) <0.000049>
291   23:34:30 send(6, "\r\231\1\0\0\1\0\0\0\0\0\0\0010\0010\0010\0010\7in-addr\4arp"..., 38, MSG_NOSIGNAL) = 38 <0.000128>
291   23:34:30 poll([{fd=6, events=POLLIN}], 1, 5000) = 0 (Timeout) <5.005152>
291   23:34:35 gettimeofday({tv_sec=1514849675, tv_usec=147536}, NULL) = 0 <0.000088>
291   23:34:35 poll([{fd=6, events=POLLOUT}], 1, 0) = 1 ([{fd=6, revents=POLLOUT}]) <0.000086>
291   23:34:35 send(6, "\r\231\1\0\0\1\0\0\0\0\0\0\0010\0010\0010\0010\7in-addr\4arp"..., 38, MSG_NOSIGNAL) = 38 <0.000206>
291   23:34:35 poll([{fd=6, events=POLLIN}], 1, 5000) = 1 ([{fd=6, revents=POLLIN}]) <0.045356>
291   23:34:35 ioctl(6, FIONREAD, [106]) = 0 <0.000087>
291   23:34:35 recvfrom(6, "\r\231\201\203\0\1\0\0\0\1\0\0\0010\0010\0010\0010\7in-addr\4arp"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("8.8.8.8")}, [28->16]) = 106 <0.000096>

첫 번째 DNS 요청은 응답을 받지 못했으나 5초 제한 시간 후에 다시 시도하여 거의 즉시 응답을 받았습니다.

답변1

네트워크가 완전히 가동되지 않거나(DNS 요청이 손실됨) 무작위 패킷 손실이 발생할 수 있습니다(특히 WiFi에서 발생함). 전자는 애플리케이션을 실행하는 데 잠시 기다려서 처리할 수 있으며 후자는 거의 불가피합니다.

그러나 도움이 될 수 있는 몇 가지 사항은 다음과 같습니다.

  • 응용 프로그램을 복구하십시오. 나는 이것이 선택 사항이 아니라고 생각합니다. 그렇지 않으면 이미 이 작업을 수행하고 있을 것입니다.

  • 0.0.0.0에 대한 항목을 에 넣습니다 /etc/hosts. 그런 다음 기본적으로 즉각적인 "파일"을 통해 해결되어야 합니다. 물론 이를 위해서는 0.0.0.0에 이름을 부여해야 하며, 이로 인해 애플리케이션의 동작이 변경되거나 변경되지 않을 수 있습니다. 이것이 효과가 있다면 이것이 가장 쉬운 옵션입니다.

  • 상자에 DNS가 필요하지 않은 경우 상자에서 DNS를 제거하여 완전히 비활성화하십시오 /etc/nsswitch.conf.

  • 0.0.0.in-addr.arpa에 대해 권한을 부여하도록 구성할 수 있는 로컬 DNS 캐시를 실행합니다. 그런 다음 NXDOMAIN을 0.0.0.0으로 신속하게 반환할 수 있습니다. 이를 수행할 수 있는 로컬 캐싱을 제공하도록 설계된 여러 프로그램이 있습니다. 예를 들어 dnsmasq는 꽤 유명합니다. 필요한 기능에 따라 Unbound와 같은 다른 기능도 있습니다.

  • 최소한 glibc를 사용하면 다음과 같이 입력하여 시간 초과 및 재시도 options timeout:2 attempts:4동작을 변경할 수 있습니다 /etc/resolv.conf. 시간 초과를 줄이는 경우 DNS 서버가 문제를 해결하는 데 시간이 걸릴 수 있으므로 시도 횟수를 늘려야 할 수 있습니다(그러나 해결이 완료되면 캐시에서 빠르게 응답해야 합니다).

  • 자신만의 NSS 모듈을 작성하여 hosts0.0.0.0 오류를 빠르게 찾을 수 있습니다. 적어도 glibc의 경우에는 다음에서 이 작업을 수행할 수 있습니다.glibc 매뉴얼 섹션 29.

관련 정보