주요 콘텐츠로 건너뛰기
응용 프로그램은 172.16.1.116의 백 엔드 데이터베이스 서버에 도달하는 문제를 보고하거나 새 응용 프로그램을 설정하려고 하며 백 엔드 데이터베이스 서버에 도달할 수 있는지 확인하려고 합니다. 마음에 오는 첫 번째 도구는 ping하지만 많은 호스트는 더 이상 ICMP 에코 (ping) 요청에 응답하지 않습니다 및 자신의 네트워크 방화벽이 ping 요청 이나 그들의 회신중 하나를 차단할 가능성이 높은 이경우. ping 시간(그림 1)이 네트워크 연결을 테스트하는 다른 방법이 있습니다.
ping 172.16.1.116
Pinging host 172.16.1.116 : 172.16.1.116
ping: No reply. Time Out !!
ping: No reply. Time Out !!
ping: No reply. Time Out !!
ping: No reply. Time Out !!
Host 172.16.1.116 replied to 0 of the 4 pings
ready 12:26:32
그림 1 – 핑 타이밍 아웃
도달하려는 호스트가 UDP기반 서비스가 TCP를 실행중이라고 가정하면 호스트에 연락하고 서비스의 포트 번호를 지정할 수 있습니다. 4개의 가능한 응답, 연결(그림 2) 거절(그림 6), 잘못된 것의 표시(그림 7 및 8) 또는 시간(그림 9)이 있습니다.
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
그림 2 – 연결
"연결된" 메시지는 호스트에 연결되어 있음을 나타냅니다. 일부 WAN 가속기는 연결을 가로채프록시 역할을 하며 완료합니다. 연결한 다음 몇 초 후에 연결이 끊어진 경우 가속기에 연결한 다음 가속기가 최종 대상에 연결되지 않아 연결이 끊어졌을 수 있습니다. 물론 실제 호스트에 연결하고 응용 프로그램이 충돌했을 수도 있습니다. 가속기 하드웨어를 사용하고 있는지 정확히 어떻게 작동하는지 알 수 있습니다.
전화 통신 에서 형식 제어-] 및 "종료"를 분리하려면
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
telnet> quit
그림 3 – 연결된 세션 연결 해제
대상 호스트에서 실행되는 올바른 서비스에 도달했는지 확인하는 유일한 방법은 해당 서비스가 일종의 배너 메시지로 연결 요청에 응답하는 경우입니다. 예를 들어 호스트를 식별하는 로그인 프롬프트입니다. 대상 호스트에 액세스할 수 있고 해당 호스트가 Perl이 설치되어 있는 경우 연결을 수락할 때 지정된 배너 메시지를 보내는 tcplisten Perl 스크립트를 실행할 수 있습니다.
On target system (Linux)
[ndav@phx-lab-lnx64 ~]$ perl tcplisten.pl -p 1830 -m 'Connection has been accepted'
perl tcplisten.pl -port 1830 -message 'Connection has been accepted'
On OpenVOS client
stp -ttp ascii
ready 12:16:34
telnet 164.152.77.155 1830
Trying...
Connected to 164.152.77.155.
Escape character is '^]'.
Connection has been accepted
Escape character is '^]'.Connection closed by forei.
Ready 12:16:40
그림 4 OpenVOS 클라이언트와 리눅스 시스템에서 tcplisten.pl 실행
OpenVOS 텔넷 클라이언트는 연결이 닫히면 터미널 창을 지우기 때문에 터미널 유형을 ascii로 설정하여 연결 메시지를 확인해야 할 것입니다.
OpenVOS에서 tcplisten를 실행할 수도 있습니다(gnu_library 설치했다고 가정).
On OpenVOS target system
perl tcplisten.pl -p 1830 -m 'made it to m16'
perl tcplisten.pl -port 1830 -message 'made it to m16'
On Linux client
[ndav@phx-lab-lnx64 ~]$ telnet 164.152.77.128 1830
Trying 164.152.77.128...
Connected to rigel.az.stratus.com (164.152.77.128).
Escape character is '^]'.
made it to m16
Connection closed by foreign host.
[ndav@phx-lab-lnx64 ~]$
그림 5 리눅스 클라이언트와 OpenVOS 시스템에서 tcplisten.pl 실행
"거부됨" 메시지는 대상 호스트에 도달했지만 해당 포트에서 서비스를 수신 대기하지 않았음을 나타냅니다.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 12:31:28
그림 6 – 거절
일부 방화벽은 승인되지 않은 연결 요청에 대한 응답으로 리셋을 보낼 수 있습니다. 적어도 클라이언트 끝에서 어떤 시나리오가 발생하는지 알 수 없습니다.
telnet이 네트워크(그림 7) 또는 호스트(그림 8)에 연결할 수 없다는 표시를 받으면 이를 보고합니다. "네트워크 ... 연결할 수 없는" 메시지는 OpenVOS가 대상 네트워크에 대한 경로가 없거나 네트워크 중간에 있는 일부 라우터가 대상 네트워크에 연결할 수 없다는 것을 나타냅니다. "호스트 경로 없음" 메시지는 대상 네트워크에 연결된 라우터가 대상 호스트에 도달할 수 없음을 나타냅니다. 이는 대상 호스트가 다운된 것임을 의미합니다.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: Network trying to be reached is unreac
+hable.
ready 12:54:34
그림 7 – OpenVOS 텔넷 클라이언트는 네트워크에 연결할 수 없다고 보고합니다.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: No route to host.
ready 12:55:44
그림 8 – OpenVOS 텔넷 클라이언트가 호스트에 연결할 수 없다고 보고
Telnet은 이러한 오류의 원인을 보고하지 않습니다. 동일한 IP 주소로 향하는 tuc.pl(UDP 연결 테스트) Perl 스크립트는 소스 IP 주소를 보고합니다(UDP 테스트에 대한 다음 토론 참조).
시간 시간은 호스트에 연결할 수 없음을 나타냅니다. 대부분의 호스트는 연결 또는 거부로 응답하지만 호스트에 호스트 기반 방화벽이 있는 경우 응답하지 않고 요청을 삭제할 수 있습니다. 마찬가지로 네트워크 기반 방화벽은 응답하지 않고 요청을 삭제할 수 있습니다. 물론 라우터 나 호스트가 보낸 ICMP 메시지는 다른 라우터 또는 방화벽에 의해 삭제 될 수 있습니다.
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
그림 9 – 시간 시간을 보고하는 OpenVOS 텔넷 클라이언트
요약하면 5가지 가능한 결과가 있습니다.
메시지
의미
연결(배너)
호스트 및 응용 프로그램에 도달 할 수 있습니다
연결(배너 없음)
호스트 및 응용 프로그램에 도달 할 수 있습니다 - 아마
거부
호스트에 도달할 수 있지만 응용 프로그램에 는 도달할 수 없습니다 - 아마
연결할
호스트에 연결할 수 없습니다.
타임 아웃
호스트에 연결할 수 없습니다 - 아마
그림 10 – TCP 연결에 대한 결과 및 해석 요약
응용 프로그램이 UDP 포트를 사용하는 경우 상황이 까다롭습니다. 먼저 UDP 데이터그램을 전송하기 위한 OpenVOS에는 표준 유틸리티가 없습니다. 둘째, 응답은 UDP 데이터그램 또는 ICMP 메시지로 돌아올 수 있습니다. tuc.pl(UDP 연결 테스트) Perl 스크립트는 현재 날짜 시간이 포함된 데이터그램을 지정된 호스트 및 포트로 전송합니다. 그런 다음 UDP 데이터그램 또는 ICMP 메시지를 기다립니다. 이상적으로 응용 프로그램은 다음 표시되는 메시지를 반환합니다. 그림 11은 듣기 응용 프로그램이 스크립트에서 보낸 메시지를 에코한 것을 보여 주습니다.
perl tuc.pl -i 172.16.1.116 -p 1830
Reply received on UDP socket from 164.152.77.128 message: echoed by udpecho.pl:
+sent by tuc.pl at Mon Aug 30 13:31:34 2010
ready 13:31:34
그림 11 – UDP 서버 응용 프로그램은 수신된 메시지를 에코합니다.
서버가 대상 포트에서 수신 대기 중이 면 "대상 포트에 연결할 수 없는" 메시지를 다시 보내야 합니다. 대상 IP 주소에서 메시지를 수신한다고 가정하면 서버에 도달했지만 응용 프로그램이 수신되지 않았다는 의미입니다.
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination port unreachable message received from 172.16.1.116
ready 11:40:12
그림 12 – 포트에 연결할 수 없는 메시지를 보내는 대상 호스트
통신 망 테스트와 마찬가지로 네트워크 및 호스트 문제를 나타내는 ICMP 메시지를 얻을 수 있으며 위에서 설명한 대로 발신자 IP 주소를 얻을 수 있으므로 조사를 시작할 수 있는 보다 명확한 출발점이 됩니다.
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination network unreachable message received from 164.152.77.171
ready 11:43:50
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Destination host unreachable message received from 164.152.77.171
ready 11:44:54
그림 13 – 네트워크 및 호스트 연결할 수 없는 메시지
위의 오류는 아마도 가장 일반적인 두 가지입니다. 다른 경로 표시 루프
perl tuc.pl -i 172.16.1.116 -p 1830
ICMP Time exceeded , TTL expired in transit message received from 164.152.77.34
ready 11:45:39
그림 14 – 라우팅 루프를 나타내는 ICMP 메시지
다른 많은 오류가 있으며, 일부는 패킷의 흐름을 방지하기 위한 관리 작업을 나타냅니다. 이러한 메시지는 패킷을 차단하는 방화벽을 나타내는지 확신할 수 있습니다.
그러나 많은 응용 프로그램은 구체적으로 형식화 된 메시지를 기대합니다. 이 경우 당신은 아마 침묵과 만날 것입니다. 기본적으로 스크립트는 5초 후에 시간 중지하고 "응답 없음"을 보고합니다.
perl tuc.pl -i 172.16.1.116 -p 1830
No response was received from 172.16.1.116
ready 16:43:26
그림 15 – 응답 없음
더 오래 기다리거나 더 짧게 기다리려면 "-t 옵션"을 사용할 수 있습니다.
perl tuc.pl -i 172.16.1.117 -p 1830 -t 10
No response was received from 172.16.1.117
ready 12:06:26
perl tuc.pl -i 172.16.1.117 -p 1830 -t 1
No response was received from 172.16.1.117
ready 12:06:32
그림 16 – 기본 시간 계산시간 변경
침묵이 반드시 나쁜 것은 아닙니다. 대상 호스트에 도달했으며 대상 포트에서 듣고 있지만 전송된 테스트 메시지가 마음에 들지 않았음을 의미할 수 있습니다. 안타깝게도 테스트 패킷이 대상 호스트로 만들지 않았으며 차단되었음을 나타내기 위해 다시 전송된 ICMP 메시지가 있음을 의미할 수도 있습니다. 서버에 액세스할 수 있는 경우 자체 헤더를 추가할 udpecho.pl Perl 스크립트를 실행한 다음 전송된 모든 것을 에코할 수 있습니다(그림 11).
요약하자면
메시지
의미
응용 프로그램 배너 메시지
호스트 및 응용 프로그램에 도달 할 수 있습니다
ICMP 네트워크/호스트 메시지
호스트에 연결할 수 없습니다.
호스트의 ICMP 포트 메시지
호스트에 도달할 수 있지만 응용 프로그램은 할 수 없습니다.
응답이 없고 응용 프로그램에서 배너 메시지를 보냅니다.
호스트에 연결할 수 없습니다.
응답이 없고 응용 프로그램에서 배너 메시지를 보내지 않습니다.
호스트에 연락할 수도 있거나 연락하지 못할 수도 있습니다.
그림 17 – UCP 연결에 대한 결과 및 해석 요약

tcplisten.pl

# tcplisten.pl begins here

#

# 버전 1.00 10-07-30

# 이 스크립트는

# 오픈 VOS 17.0.2ah 실행 펄 v5.8.0 i686-vos에 대 한 내장

# 마이크로 소프트 윈도우 XP 서비스 팩 3 실행

# MSWin32-x86 멀티 스레드를 위해 제작된 액티브스테이트 펄 v5.10.0

# 레드 햇 리눅스 4AS-5.5 실행

# 펄 v5.8.5 x86_64 리눅스 스레드 멀티내장

#

# noah.davids@stratus.com

#

IO 사용::소켓;

Getopt 사용::긴;

Sys::Hostname;

엄격한 사용;

내 ($result);

내 ($localPort, $message, $peerAddr);

내 ($newSock, $data);

$result = GetOptions('포트='의' => $localPort,

'메시지=의' => $message);

(($result != 1) || 정의($localPort))

{

인쇄 "nnUse:n";

인쇄 "tperl tcplisten.pl -포트 번호 [메시지 메시지]nn";

종료;

}

(!정의($message))

{

"지정된 메시지 없음 – 메시지 생성"을 인쇄합니다.

$message = "tcplisten에 실행에 의해 허용 된 연결" . 호스트 이름;

}

"펄 tcplisten.pl -포트 $localPort -메시지 '"를 인쇄합니다. $message . "'n";

내 $sock = IO::소켓::INET->신규(

프로토 => 'tcp',

로컬포트 => $localPort,

로컬애더 => '0.0.0.0',

듣기 => 1,

) 또는 죽는 "포트 $localPort 대한 소켓을 만들 수 없습니다 : $!n";

동안 (1)

{

내 $newSock = $sock->수락 ();

인쇄 "연결에서 허용" . $newSock->피어호스트 .

" 현지 시간 () . "n";

인쇄 $newSock $message. "n";

$newSock -> 종료(2);

$sock->읽기($data, 1024); # 가까운 표시를 얻기 위해 기다립니다 */

$newSock->닫기();

}

#

# tcplisten.pl 여기서 끝납니다.

tuc.pl

# tuc.pl begins here

#

# 버전 1.00 10-07-30

# 이 스크립트는

# 오픈 VOS 17.0.2ah 실행 펄 v5.8.0 i686-vos에 대 한 내장

# 마이크로 소프트 윈도우 XP 서비스 팩 3 실행

# MSWin32-x86 멀티 스레드를 위해 제작된 액티브스테이트 펄 v5.10.0

# 레드 햇 리눅스 4AS-5.5 실행

# 펄 v5.8.5 x86_64 리눅스 스레드 멀티내장

#

# noah.davids@stratus.com

#

IO 사용::소켓;

IO 사용::선택;

Getopt 사용::긴;

엄격한 사용;

내 ($result);

내 ($destIP, $destPort, $timeout, $result, $message, $flags);

내 ($ready, $socket);

내 ($x, $c, $icmpAlready);

$result = GetOptions('ip='s' => $destIP,

'포트=s' => $destPort,

'시간 시간 =의' => $timeout);

(($result != 1) || 정의($destIP) 및 정의($destPort))

{

인쇄 "nnUse:n";

인쇄 "tperl tuc.pl -ip 대상 IP 주소" .

"포트 목적지-포트-눔베인";

종료;

}

if (!defined($timeout)) { $timeout = 5; }

엘시프 ($timeout > 15) { 인쇄 "OK,하지만" . $timeout .

"비합리적으로 긴 것 같다"; }

$message = "에서 tuc.pl 의해 전송 " . 현지 시간 ();

내 $sock = IO::소켓::INET->신규(

프로토 => 'udp',

피어포트 => $destPort,

피어애르 => $destIP

) 또는 죽는 "목적지 $destIP 대한 소켓을 만들 수 없습니다 : $!n";

내 $isock = IO::소켓::INET->신규(

프로토 => 'icmp');

$sock->보내기($message) 또는 죽는 "오류 보내기: $!n";

$message = "";

내 $read_set = 새 IO::선택();

$read_set->추가($sock);

$read_set->추가($isock);

($ready) = IO::select->선택($read_set, undef, undef, $timeout);

$icmpAlready = 0;

$c = 0;

$socket (@$ready)

{

$c = $c + 1;

($socket == $sock)

{

$x = "UDP 소켓에서 받은 회신";

$socket->recv($message, 100, $flags);

($icmpAlready == 0)

{

(길이($message) > 0)

{ print $x . $socket->peerhost . ” message: ” . $message . “n”; }

else { print $x . $socket->peerhost . “n”; }

}

}

다른 # icmp 메시지가 수신

{

$icmpAlready = 1;

$socket->recv($message, 100, $flags);

(길이($message) > 98)

{ 인쇄 "예기치 않게 긴 (". 길이 ($message) .

") "에서 ICMP 메시지 " $socket->피어호스트 .

" 메시지 : " $message . "n"; }

elsif (length ($message) < 52)

{ 인쇄 "exexpecedly 짧은 (" . 길이 ($message) .

") "에서 ICMP 메시지 " $socket->피어호스트 . "n"; }

다른 # 프로세스 icmp 메시지

{

내 $type = 성(서브스트 ($message, 20, 1));

내 $code = 성(서브스트 ($message, 21, 1));

내 $port = 성 (substr ($message, 50, 1)) * 256 +

오드 (서브스트스트 ($message, 51, 1));

($port != $destPort)

{ 인쇄 "예기치 않은 ICMP 메시지에서 받은" .

$socket->피어호스트 . " 메시지 : " 서브스트 ($message, 20) .

"n"; }

다른 # icmp 메시지는 좋다

{

($type == 3)

{

($code == 0) { 인쇄 "ICMP 대상 네트워크" .

"에서 받은 도달 할 수없는 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 1) { 인쇄 "ICMP 대상 호스트" .

"에서 받은 도달 할 수없는 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 3) { 인쇄 "ICMP 대상 포트" .

"에서 받은 도달 할 수없는 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 6) { 인쇄 "ICMP 대상 네트워크" .

"알 수 없는 메시지로부터 수신 " .

$socket->피어호스트 . "n"; }

elsif ($code == 7) { 인쇄 "ICMP 대상 호스트 알 수없는" .

"로부터 받은 메시지 " $socket->피어호스트 . "n"; }

elsif ($code == 8) { 인쇄 "ICMP 소스 호스트 격리" .

"로부터 받은 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 9) { 인쇄 "ICMP 네트워크 관리적으로" .

"로부터 수신 금지 된 메시지 " .

$socket->피어호스트 . "n"; }

elsif ($code == 10) { 인쇄 "ICMP 호스트 관리" .

"로부터 수신 금지 된 메시지 " .

$socket->피어호스트 . "n"; }

elsif ($code == 11) { 인쇄 "ICMP 네트워크에 연결할 수 없습니다" .

"에서 받은 TOS 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 12) { 인쇄 "ICMP 호스트에 도달 할 수 없습니다" .

"에서 받은 TOS 메시지 "

$socket->피어호스트 . "n"; }

elsif ($code == 13) { 인쇄 "ICMP 통신" .

"행정금지 메시지로부터 수신 "

$socket->피어호스트 . "n"; }

기타 { 인쇄 "예기치 않은 ICMP 메시지가 받은 유형 = "

$type . ", 코드 = " $code . " 에서 " .

$socket->피어호스트 . "n"; }

} #if ($type == 3)

elsif((($type == 11) 및 ($code ===0))

{ 인쇄 "ICMP 시간을 초과, TTL은 전송 만료 " .

"로부터 받은 메시지 " $socket->피어호스트 . "n"; }

기타 { 인쇄 "예기치 않은 ICMP 메시지가 받은 유형 = "

$type . ", 코드 = " $code . " 에서 " .

$socket->피어호스트 . "n"; }

} # 다른 # icmp 메시지는 좋다

} 다른 # 프로세스 icmp 메시지

} # 다른 #icmp 메시지가 수신

} # 포지엄 $socket (@$ready)

($c == 0) { 인쇄 "응답이 수신되지 않은 경우" .

$sock->피어호스트 . "n"; }

#

# tuc.pl 여기서 끝납니다.

udpecho.pl

# udpecho.pl begins here

#

# 버전 1.00 10-07-30

# 이 스크립트는

# 오픈 VOS 17.0.2ah 실행 펄 v5.8.0 i686-vos에 대 한 내장

# 마이크로 소프트 윈도우 XP 서비스 팩 3 실행

# MSWin32-x86 멀티 스레드를 위해 제작된 액티브스테이트 펄 v5.10.0

# 레드 햇 리눅스 4AS-5.5 실행

# 펄 v5.8.5 x86_64 리눅스 스레드 멀티내장

#

# noah.davids@stratus.com

#

IO 사용::소켓;

IO 사용::선택;

Getopt 사용::긴;

엄격한 사용;

내 ($result);

내 ($localPort, $debug, $result, $message, $flags);

내 ($ready, $socket);

내 ($x, $c);

$result = GetOptions('포트='의' => $localPort,

'디버그' => $debug);

(($result != 1) || 정의($localPort))

{

인쇄 "nnUse:n";

인쇄 "tperl udpecho.pl -포트 로컬 포트 번호 [디버그]nn";

종료;

}

if (defined($debug)) { print “local port number is ” . $localPort . “n”; }

내 $sock = IO::소켓::INET->신규(

프로토 => 'udp',

로컬포트 => $localPort

) 또는 죽는 "소켓을 만들 수 없습니다 $!n";

내 $read_set = 새 IO::선택();

$read_set->추가($sock);

$message = "";

동안 (1)

{

($ready) = IO::select->선택($read_set, undef, undef, 300);

$socket (@$ready)

{

$socket->recv($message, 100, $flags);

(정의($debug)) { 인쇄 "메시지" $socket > 피어호스트.

" 메시지 : " $message . "n"; }

$socket->보내기("udpecho.pl 메아리: " $message) 또는 죽는 "오류 보내기: $!

+n";

}

}

#

# udpecho.pl 여기서 끝납니다.