저는 마스터 장치가 여러 슬레이브 장치와 통신하는 프로젝트를 진행하고 있습니다. 이를 위해서는 네트워크의 호스트와 연결을 설정해야 합니다. 그러나 때로는 중단됩니다.
그 이유는 여분의 시간 소모 때문인 것 같습니다.역방향 DNS 조회. 목록을 확인하거나 생성할 수 있는 명령이나 스크립트를 알려주십시오.역방향 DNS 조회시간.
번호를 수정하세요. 1
또한 다른 호스트에 연결하는 동안 각 요청에 걸린 시간 목록을 얻을 수 있도록 rsh 소스 코드에 이 명령을 추가할 수 있는 위치를 알려주십시오.
이렇게 하면 서버가 정지되는 이유를 찾을 수 있습니다.
답변1
이 중 일부는 사용되는 스텁 파서에 따라 다릅니다. 예를 들어 IPv6 AAAA 레코드가 반환되었지만 IPv6 연결이 없는 경우 IPv6 문제가 발생할 수도 있습니다.
소프트웨어(어, rsh
? 정말요? 이 답변은 구체적이지 않습니다 )가 자체 구현(예 : 또는 ) 이 아닌 rsh
시스템 파서(예: )를 사용한다고 가정하면 이를 사용하여 무슨 일이 일어나고 있는지 확인할 수 있습니다 .ping
dig
host
getent
$ time getent ahostsv4 www.google.com
$ time getent ahostsv6 www.google.com
위의 방법은 정방향 및 역방향 조회를 모두 수행합니다(역방향 PTR이나 다른 유형의 조회를 강제로 수행할 수는 없지만 getent
A/AAAA 레코드에만 관심이 있음).
몇 가지 편리한 스크립트가 있습니다이 답변도착하다https://serverfault.com/questions/7056/whats-the-reverse-dns-command-line-utility, 이를 통해 (IPv4 전용)과 같은 정방향 및 역방향 조회를 수행할 수 있지만 getent hosts
Perl에서는 이를 수정할 수 있습니다.
위의 두 가지 가능성 모두 nsswitch와 관련된 모든 스윙 및 로터리를 포함하여 시스템 파서를 사용하므로~해야 한다동작은 대부분의 응용 프로그램과 동일합니다.
클라이언트 측에서 테스트하는 것을 잊지 마세요그리고서버 중 하나 또는 둘 다 역방향 조회를 수행합니다.
로컬 파서를 하나씩 확인할 수도 있습니다.
$ while read opt p1 ; do
[ "$opt" = "nameserver" ] && dig @$p1 www.google.com +short +identify;
done < /etc/resolv.conf
그리고 역방향 DNS를 확인하세요.
$ dig www.google.com +short | xargs -n1 -i dig -x {} PTR +short +identify
이 문제를 추가로 디버깅하려면 다음을 확인해야 합니다.
/etc/host.conf
(역방향 DNS를 통한 스푸핑 검사 등 다양한 옵션)/etc/resolv.conf
(귀하의 파서)/etc/nsswitch.conf
(확인할 데이터베이스(예:/etc/hosts
DNS, LDAP 등))- 산출
dnstrace
그리고/또는dig +trace
/etc/gai.conf
, 존재하는 경우. 무엇보다도 이는 IPV6 AAAA 레코드가 A 레코드보다 먼저 정렬되는지 여부를 제어합니다./etc/nscd.conf
nscd
당신이 사용하는 경우
Wireshark 및 루트 액세스 권한이 있으면 온라인으로 DNS 요청을 볼 수 있습니다.
# tshark -w dns.cap "port 53"
# tshark -V -ta -n -r dns.cap
(해당 -V
옵션은 너무 장황하지만 개발자는 프로토콜 구문 분석 출력에 타임스탬프를 넣을 생각을 하지 않았습니다 -O dns
. 새 버전에서는 이 문제가 해결되었을 수도 있습니다.)
지금 당장 사용 하지 않더라도 nscd
쉽게 볼 수 있는일부옵션을 사용하거나 대화식으로 실행하면 -dd
어떻게 되나요 -ddd
? 호스트(A/AAAA) 레코드만 캐시 되므로 nscd
PTR 레코드는 결국 짧은(기본값 20초) 수명으로 부정적으로 캐시됩니다.
glibc 파서(및 기타)는 " options debug
" /etc/resolv.conf
뿐만 아니라 RES_OPTIONS
디버깅을 활성화하는 데 사용할 수 있는 환경 변수도 지원합니다. 안타깝게도 이 유용한 기능을 사용하려면 glibc를 빌드할 때 DEBUG를 활성화해야 하므로 이를 사용할 수 없을 것입니다...
무거운 작업의 경우 가장 좋은 옵션은 다음과 같습니다.ltrace
strace
, 시스템 호출을 추적하는 방법 gethostbyname()
과 마찬가지로 라이브러리 호출을 추적하고 타임스탬프를 지정할 수 있습니다 gethostbyaddr()
. 단점: 여러 수준의 간접 참조 제공NS 스위치, 엄청난 양의 출력에서 길을 잃을 수도 있습니다. 텔넷에서 간단히 실행하면 3000줄이 넘는 출력이 생성되었으며 두 쌍은 숨겨졌습니다 gethostbyname()
.
$ ltrace -ttT -e "getaddr*+gethost*+getname*" getent ahosts www.google.com
13:42:06.118718 getent->getaddrinfo("www.google.com", nil, { 0x2a, 0, 0, 0, 0, nil,
nil, nil }, { 0x2a, 0x2, 0x3, 0, 16, { 2, 0, { 0x69187d4a } }, "www.google.com", {
0x2a, 0x2, 0x2, 0x11, 16, { 2, 0, { 0x93187d4a } }, nil, { 0x2a, 0x2, 0x3, 0, 16, {
2, 0, { 0x67187d4a } }, nil, { 0x2a, 0x2, 0x2, 0x11, 16, { 2, 0, { 0x68187d4a } },
nil, ... } } } }) = 0 <0.042561>
0x69187d4a
사람이 읽을 수 있는 IP 주소( =105,24,125,74 -> 74.125.24.105) 를 출력하지 않기 때문에 무슨 일이 일어나고 있는지 이해하기가 조금 어렵습니다 . 그러나 NSS를 통해 모든 통화를 볼 수 있으므로 이는 아마도 로컬 문제를 추적하는 가장 좋은 방법일 것입니다.
위의 수정 사항을 사용했으며 ~/.ltrace.conf
추가 수정이 필요할 수 있습니다.
typedef size_t = int;
typedef sockaddr = struct(short, short, in_addr);
typedef addrinfo = struct;
typedef addrinfo = struct(hex(int), hex(int), hex(int), hex(int), size_t, sockaddr*, string, addrinfo *);
int getaddrinfo(string, string, addrinfo *, +addrinfo**);
int getnameinfo(sockaddr*, uint, +string, +uint, +string, +uint, uint);
답변2
느린 역방향 쿼리 응답에 문제가 있는 경우 다음 방법 중 하나를 시도하여 문제를 해결할 수 있습니다.
- 가능하다면 애플리케이션에서 역방향 조회를 비활성화하고 차이점을 확인하세요.
PTR을 캐시하는 nscd(Name Service Cache Daemon)를 사용할 수 있지만 몇 가지 보안 문제가 있습니다.
nscd(이름 서비스 캐시 데몬)의 기본 동작은 애플리케이션이
"A" 레코드에 대해 DNS "PTR" 레코드를 검증하는 것을 허용하지 않습니다.특히 nscd는 "PTR" 레코드에 대한 요청을 캐시하고 "A" 레코드에 대한 요청이 나중에 수신되면 nscd는 "A" 레코드에 대해 권한 있는 DNS를 쿼리하는
대신 캐시된 "PTR" 레코드의 정보를 유출합니다.
. " 기록.
인용하다협회