17.1 이전에 STCP는 구성된 DNS를 먼저 쿼리하여 호스트 이름을 해결하고 이름 서버의 응답이나 부정적인 응답이 없는 경우에만 로컬 호스트 파일을 검색합니다.
17.1에서 시작하여 로컬 호스트 파일을 먼저 검색할 수 있지만 몇 가지 조건이 있습니다. 첫째, 응용 프로그램은 17.1 시스템의 POSIX 규칙에 따라 빌드되어야 합니다. command_library >system>stcp>command_library 표준 명령 집합은 모두 이러한 방식으로 빌드되지만 응용 프로그램을 다시 빌드하지 않고 17.1을 설치할 수 없으며 이 기능을 사용할 것으로 예상됩니다. 둘째 는 이름 서비스 스위치, nsswitch.conf, 구성 파일을 >system>stcp 디렉토리에 설치해야 합니다. 파일의 기본 버전은 >system>stcp>템플릿 디렉터리에서 찾을 수 있습니다.
그림 1에서 볼 수 있듯이 nsswitch.conf 파일은 모든 종류의 것을 제어하는 것처럼 보입니다. 그러나 "호스트" 및 "네트워크" 항목만 시스템 동작에 영향을 미칩니다. 키워드 "dns"와 "파일"의 순서는 검색 순서를 제어합니다. "파일"이 먼저 오면 DNS를 쿼리하기 전에 호스트 또는 네트워크 파일을 검색합니다. "dNs"가 먼저 오면 파일을 검색하기 전에 DNS가 쿼리됩니다. "호스트" 또는 "네트워크" 항목에 키워드 중 하나만 포함된 경우 해당 키워드에 해당하는 검색만 수행됩니다.
DNS를 쿼리하는 대신 호스트 파일을 사용하는 주된 이유는 속도/재해 복구 및 제어입니다. 예1에서 이름 서버 중 하나가 이름 확인 시간에 응답하지 않는 경우 20밀리초에서 거의 2초로 이동합니다. 이름 서버가 응답하지 않는 경우 이름 확인 시간이 매우 길 수있습니다(예 2). 호스트 파일에 중요한 이름을 배치하고 호스트 파일을 먼저 검색하면 이름을 해결하는 데 걸리는 시간에 대해 걱정할 필요가없습니다(예 3).
호스트 파일을 먼저 검색하는 또 다른 이유는 로컬 컨트롤입니다. DNS를 사용할 때 이름 확인 프로세스의 제어를 포기합니다. 대부분의 조건에서 이 작업은 문제 없이 작동하지만 때로는 로컬 제어가 필요합니다. 예를 들어 호스트에 대한 액세스를 일시적으로 또는 영구적으로 차단해야 하는 경우 방화벽에서 또는 DNS 데이터베이스 또는 호스트 파일을 변경하여 문제 호스트로 요청을 리디렉션하여 수행할 수 있습니다. DNS 데이터베이스를 변경하지 못할 수 있으며 방화벽을 변경하는 데 너무 오래 걸릴 수 있지만 호스트 파일을 변경할 수 있습니다. 예제 4에서는 www.google.com 액세스가 로컬 호스트로 리디렉션됨을 보여 주겠습니다.
호스트 파일의 아래쪽은 호스트 이름과 IP 주소 간의 매핑이 정적이라는 것입니다. 예를 들어 5에서는 여러 응용 프로그램 서버 간에 부하를 분산하기 위해 다른 IP 주소를 제공하도록 이름 서버를 구성할 수 있습니다. 호스트 파일에 항목을 추가하는 경우 항목이 정적이며 DNS가 제공할 수 있는 로드 균형 조정의 이점이 손실됩니다. 또한 호스트 IP 주소가 변경되는 경우 호스트 파일을 수동으로 유지해야 합니다.
그렇다면 nsswitch.conf 파일을 어떻게 구성해야 합니까? 파일의주석(그림 1)은모든 응용 프로그램이 파일을 사용하도록 다시 빌드될 때까지 >system>stcp 디렉터리에 파일을 설치하지 않는 것을 제안합니다. 이렇게 하면 이전 응용 프로그램에서 DNS가 하나의 주소를 가져오는 경우 새 응용 프로그램이 호스트 파일을 사용하여 다른 주소를 얻는경우(예 4)가발생할 수 있습니다. 또한 DNS가 항상 먼저 쿼리되었기 때문에 더 이상 올바르지 않은 기존 호스트 파일에 항목이 있을 수 있습니다. 다른 전략은 호스트 항목이 "파일 dN"로 설정된 파일을 설치하지만 호스트 파일의 유일한 항목이 로컬 호스트(예 6)인지확인하는 것입니다. 그런 다음 호스트 /IP 주소를 최소한 편집하여 필요에 따라 호스트 파일에 추가할 수 있으므로 이전 응용 프로그램에서 호스트 파일 주소가 표시되지 않습니다.
좋아, 네트워크는 어떻습니까? 항상 @system>stcp>네트워크 파일에 배치하여 네트워크 이름을 지정할 수 있었습니다. 개인적으로, 나는 필요를 본 적이 없지만 경로를 추가 할 때 이름을 사용할 수 있습니다. 흥미롭게도, 경로를 인쇄할 때 이름이 표시되지않습니다(예 7). arp 명령에서 -network 인수를 사용할 때도 이름을 사용할 수 있습니다. 네트워크의 기본 nsswitch.conf 파일은 먼저 네트워크 파일을 검색한 다음 DNS를 쿼리합니다. 실제로 DNS가 네트워크 이름 정보를 반환하도록 구성된 경우 내 제안은 네트워크 항목에서 dNS 키워드를 제거하는 것입니다.
마지막 점 하나. 두 가지 예제 프로그램을 포함했습니다. 첫 번째 해결.c 이전 이름 확인 함수 gethostbyname을 사용합니다. 두 번째, new_resolve.c 새로운 기능 getaddrinfo를 사용합니다. gethostbyname 기능은 POSIX 표준 함수 getaddrinfo로 대체되었습니다. 그것은 POSIX 표준이기 때문에 당신은 getaddrinfo에 대한 문서를 찾을 수 없습니다 Stratadoc ; 그러나 웹에 문서의 큰 거래가있다, 그냥 구글 getaddrinfo.
예제:
다음 예제에서는 resolve_17.0 및 해결 프로그램은 동일한 소스 코드를 기반으로 합니다. 유일한 차이점은 해결이 17.1 시스템에서 컴파일된 동안 resolve_17.0이 VOS 17.0 시스템에서 컴파일되었다는 것입니다. 이름 서버 1.1.1.1, 1.1.1.2 및 1.1.1.3은 허구이며 응답하지 않는 이름 서버를 시뮬레이션하는 데 사용됩니다. 또한 공용 네트워크에 없는 호스트 번호도 X'ed했습니다.
d >시스템>stcp>resolv.conf -match 네임 서버 %phx_vos#m16_mas>시스템>stcp>resolv.conf 11-05-24 08:07:13 mst 네임서버 164.152.XXX.XXX 네임서버 134.111.XXX.XXX 준비 완료 08:07:13 resolve_17.0 ftp.stratus.com ftp.stratus.com 20.615ms에서 192.52.248.14로 해결되었습니다. 준비 완료 08:07:20 d >시스템>stcp>resolv.conf -match 네임 서버 %phx_vos#m16_mas>시스템>stcp>resolv.conf 11-05-24 08:07:30 mst 네임서버 1.1.1.1 네임서버 164.152.XXX.XXX 네임서버 134.111.XXX.XXX 준비 완료 08:07:30 resolve_17.0 ftp.stratus.com ftp.stratus.com 1989.395년 192.52.248.14로 해결되었습니다. 준비 완료 08:07:38 |
예 1 - 이름 서버(1.1.1.1)가 응답하지 않는 시간 변경 |
d >시스템>stcp>resolv.conf -match 네임 서버
%phx_vos#m16_mas>시스템>stcp>resolv.conf 11-05-23 13:11:31 mst
네임서버 1.1.1.1
네임서버 1.1.1.2
네임서버 1.1.1.3
준비 13:11:31
resolve_17.0 ftp.stratus.com
ftp.stratus.com 14759.949 ms에서 192.52.248.14로 해결되었습니다.
준비 13:12:13
|
예 2 – 이름 서버가 대답하지 않는 경우 이름을 확인할 시간 |
d >시스템>stcp>resolv.conf -match 네임 서버 %phx_vos#m16_mas>시스템>stcp>resolv.conf 11-05-24 08:18:10 mst 네임서버 1.1.1.1 네임서버 164.152.XXX.XXX 네임서버 134.111.XXX.XXX 준비 완료 08:18:10 d >시스템>stcp>nsswitch.conf -일치 호스트: %phx_vos#m16_mas>시스템>stcp>nsswitch.conf 11-05-24 08:18:21 mst 호스트: 파일 dNs 준비 완료 08:18:21 해결 ftp.stratus.com ftp.stratus.com 13.702 ms에서 192.52.248.14로 해결되었습니다. 준비 완료 08:18:31 해결 www1.stratus.com www1.stratus.com 227.798ms에서 134.111.1.84로 해결되었습니다. 준비 완료 08:18:39 |
예 3 – 호스트 파일을 먼저 검색하고 항목을 찾게 하지 않을 때의 시간 차이 |
d >시스템>stcp>resolv.conf -match 네임 서버 %phx_vos#m16_mas>시스템>stcp>resolv.conf 11-05-23 13:28:51 mst 네임서버 164.152.XXX.XXX 네임서버 134.111.XXX.XXX 준비 13:28:51 d %phx_vos#m16_mas>시스템>stcp>호스트 -일치 구글 %phx_vos#m16_mas>시스템>stcp>호스트 11-05-23 13:29:29 mst 127.0.0.1 www.google.com google.com 구글 준비 준비 13:29:29 resolve_17.0 www.google.com www.google.com 180.099ms에서 74.125.226.115로 해결되었습니다. 준비 13:29:40 해결 www.google.com www.google.com 13.458 ms에서 127.0.0.1로 해결되었습니다. 준비 완료 13:30:01 |
예 4 – 새 응용 프로그램에 대한 주소를 로컬 호스트로 변경하여 www.google.com 대한 액세스를 차단 |
해결 www.yahoo.com www.yahoo.com 21.439 ms에서 67.195.160.76으로 해결되었습니다. 준비 13:35:56 해결 www.yahoo.com www.yahoo.com 21.713ms에서 69.147.125.65로 해결되었습니다. 준비 13:35:56 해결 www.yahoo.com www.yahoo.com 30.106ms에서 67.195.160.76으로 해결되었습니다. 준비 13:35:57 해결 www.yahoo.com www.yahoo.com 29.739 ms에서 69.147.125.65로 해결되었습니다. 준비 13:35:58 해결 www.yahoo.com www.yahoo.com 23.880 ms에서 67.195.160.76으로 해결되었습니다. 준비 13:35:58 해결 www.yahoo.com www.yahoo.com 22.736ms에서 69.147.125.65로 해결되었습니다. 준비 13:35:58 |
예 5 – DNS는 여러 IP 주소를 제공합니다. |
d >시스템>stcp>호스트 %phx_vos#m16_mas>시스템>stcp>호스트 11-05-24 08:32:51 mst # # 샘플 호스트 파일 # # IP 주소 이름 별칭 # 코멘트 # 127.0.0.1 로컬 호스트 루프백 호스트 루프백 lb # 필요 준비 완료 08:32:51 |
예 6 – 최소 호스트 파일 |
경로 추가 노아 테스트 164.152.XXX.XXX 5.255.255.0 준비 13:52:54 경로 인쇄 기본 게이트웨이: 164.152.XXX.XXX 네트워크 주소 게이트웨이 주소 서브넷 마스크 리디렉션 라이프 1.2.3.0 164.152.XXX.XXX 255.255.255.0 준비 13:53:26 d 네트워크 -일치 노아 테스트 %phx_vos#m16_mas>system.17.1>stcp>네트워크 11-05-23 13:53:48 mst 노아 테스트 1.2.3.0 준비 13:53:48 |
예 7 – 네트워크 테이블에 이름을 사용하여 네트워크 추가 |
# # 샘플 nsswitch.conf (5) - 이름 서비스 스위치 구성 파일 # # 이 구성 파일은 빌드된 프로그램에서만 사용됩니다. # 17.1 이상 에서 POSIX 규칙에 따라. 이 구성의 경우 # 파일이 존재하지 않으며 호스트 이름 조회는 # DNS 소프트웨어의 이전 버전. 혼란을 피하기 위해, 우리는 # 모든 때까지이 구성 파일을 사용하여 연기하는 것이 좋습니다 # 응용 프로그램은 POSIX를 사용하여 다시 구축되었습니다. # # 비 POSIX DNS 소프트웨어 (및 출시 전에 모든 DNS 소프트웨어 # 17.1) 먼저 DNS를 사용하여 호스트를 해결한 다음 # >시스템>stcp>호스트 파일. 이것은 몇 가지 사소한 문제가 있습니다. # # 1. 호스트 파일에 잘못된 항목이 있는 경우 # 뭔가 DNS가 사라질 때까지 감지. 이 #은 원하지 않을 때 정확히 혼란을 초래할 수 있습니다. # # 2. DNS에서 돌아오는 나쁜 호스트를 과도하게 탈 수 있는 방법은 없습니다. # # 3. 대부분의 다른 구현은 호스트 파일을 먼저 검색합니다. # # 이 중 어느 것도 호환되지 않는 변화를 만들 만큼 매력적이지 않습니다. 기본 동작에 #; 그러나 검색 순서를 전환할 수 있습니다. # 위의 문제를 피하기 위해이 파일을 사용. 호스트 파일을 검색하려면 # 먼저, 당신은 원하는 : # # 호스트 : 파일 dNs # # DNS를 먼저 하고 100% 호환상태를 유지해야 합니다. # VOS의 이전 릴리스, 당신은 원하는 : # # 호스트 : dns 파일 # # 또한, 비 POSIX 및 사전 17.1 소프트웨어는 dN을 사용하지 않았다는 점에 유의하십시오. # 네트워크를 찾고 있습니다. 새로운 소프트웨어는 않습니다. 기본적으로 이 작업을 수행합니다. #>system>stcp>네트워크 파일을 보고 나면 됩니다. 하나는 구성 할 수 있습니다 # 이 동작도 마찬가지입니다. 일반적으로 유용한 정보가 별로 없습니다. # 네트워크에 대한 DNS에서 돌아온다. DNS 조회를 끄려면 # 네트워크의 경우 다음과 같은 작업을 수행하십시오. # # 네트워크 : 파일 # 그룹: 컴팟 group_compat: 니스 호스트: 파일 dNs 네트워크: 파일 dNs 통과: 컴팻 passwd_compat: 니스 셸: 파일 서비스: 컴팟 services_compat: 니스 프로토콜: 파일 rpc: 파일 |
그림 1 – >system>stcp>템플릿에서 발견된 기본 nsswitch.conf 파일 |
#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 (); } |
그림 2 – resolve.c는 이전 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); } |
그림 3 – new_resolve.c는 새로운 POSIX 표준 getaddrinfo 기능을 사용합니다. |