メインコンテンツへスキップ
検索
アプリケーションが 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 - Ping タイミングアウト
あなたが到達しようとしているホストがTCP(UDPではなく)ベースのサービスを実行していると仮定すると、あなたはホストにtelnetをしてサービスのポート番号を指定することができます。接続(図2)、拒否(図6)、何かが間違っている(図7と8)、タイムアウト(図9)の4つの応答が考えられます。
telnet 172.16.1.116 1830
Trying...
Connected to 172.16.1.116.
Escape character is '^]'.
図 2 - 接続
Connected」メッセージは、ホストに接続されていることを示しています - おそらく。WANアクセラレータの中には、プロキシとして動作して接続を傍受し、接続を完了させるものもあります。接続して数秒後に切断された場合は、あなたがアクセラレータに接続した後、アクセラレータが最終目的地に接続できずに切断した可能性があります。もちろん、実際のホストに接続してアプリケーションがクラッシュした可能性もあります。アクセラレータのハードウェアを使用しているかどうか、そしてそれがどのように動作するかを正確に把握しておくことが大切です。
切断するには、telnet>プロンプトでcontrol-と入力して"quit"を入力します。
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クライアントを使用してLinux システム上で tcplisten.pl を実行しています。
OpenVOSのtelnetクライアントは接続が終了するとターミナルウィンドウをクリアするので、接続メッセージを見るにはターミナルタイプを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 システム上でLinux クライアントを使用して 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)に到達できないという指示を受信した場合、その旨を報告します。network ... unreachable"メッセージは、OpenVOSがターゲットネットワークへのルートを持っていないか、ネットワークの途中にあるルータが宛先ネットワークに到達できなかったことを示しています。No route to host"メッセージは、宛先ネットワークに接続されているルータがターゲットホストに到達できなかったことを示しています。これは、ターゲットホストがダウンしている可能性が高いことを意味します。
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クライアント。
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クライアント
Telnet はこれらのエラーの発生源を報告しません。tuc.pl (UDP接続のテスト) Perlスクリプトは、同じIPアドレスとポート番号に向けられて、ソースIPアドレスを報告します (UDPテストに関する以下の議論を参照してください)。
タイムアウトはホストと連絡が取れないことを示しています。ほとんどのホストは接続か拒否のどちらかで応答しますが、もしホストがホストベースのファイアウォールを持っている場合、応答せずにリクエストをドロップするだけかもしれません。同様に、ネットワークベースのファイアウォールは応答せずにリクエストをドロップするだけかもしれません; そしてもちろん、ルータやホストによって送信されたすべてのICMPメッセージは、別のルータやファイアウォールによってもドロップされるかもしれません。
telnet 172.16.1.116 1830
Trying...
telnet: Unable to connect to remote host: The operation timed out.
図 9 - タイムアウトを報告する OpenVOS telnet クライアント
まとめると、以下の5つの結果が考えられます。
メッセージ
意味
つながる(バナー付き
ホストとアプリケーションにアクセス可能
接続済み(バナーなし
ホストとアプリケーションに到達可能 - おそらく
拒否
ホストには到達できるが、アプリケーションには到達できない - おそらく
到達不可能
ホストに到達できない
タイムアウト
ホストに到達できない - おそらく
図 10 - TCP 接続の結果と解釈のまとめ
アプリケーションがUDPポートを使用している場合は、より厄介なことになります。まず、OpenVOSにはUDPデータグラムを送信するための標準ユーティリティがありません。第二に、レスポンスはUDPデータグラムかICMPメッセージのどちらかで返ってくる可能性があります。tuc.pl (test UDP connection) 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 サーバアプリケーションが受信したメッセージをエコー処理する様子
サーバがターゲットポートをリッスンしていない場合は、"destination port unreachable" メッセージを返信する必要があります。メッセージがターゲット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 - ポート到達不能メッセージを送信するターゲットホスト
telnetテストのように、ネットワークやホストの問題を示す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 - ネットワークおよびホストの到達不能メッセージ
上記のエラーは、おそらく最も一般的なもののうちの2つでしょう。もう一つはルーティングループを示しています。
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 begins here

#

# Version 1.00 10-07-30

# このスクリプトは

# i686-vos用にビルドされたPerl v5.8.0.0を実行しているVOS 17.0.2ahを開きます。

# MicrosoftWindows XP Service Pack 3 が稼働中

# MSWin32-x86-multi-thread用にビルドされたActiveState Perl v5.10.0

# Red HatLinux 4AS-5.5 を実行しています。

# Perl v5.8.8.5 は x86_64 用にビルドされています-linux-thread-multi

#

# noah.davids@stratus.com

#

IO::Socketを使用します。

Getopt::Longを使用します。

Sys::ホスト名を使用します。

厳密に使用してください。

私の($result)。

私の($localPort, $message, $peerAddr)を使用しています。

私の ($newSock, $data) を使用しています。

$result = GetOptions ('port=s' => $localPort.

'message=s' => $message).

if (($result != 1) || !

{

print "nnUsage:n"と表示されます。

print "tperl tcplisten.pl -port PORT-NUMBER [-message MESSAGE]nn".

出口に行きます。

}

if (!defined ($message))

{

print "メッセージが指定されていません。

$message = "Connection accepted by tcplisten running on " .hostname.

}

print "perl tcplisten.pl -port $localPort -message '" .メッセージ ."“‘n”;

my $sock = IO::Socket::INET->new(

Proto => 'tcp'。

LocalPort => $localPort。

LocalAddr => '0.0.0.0.0'.

聞く⇒1.

) or die "Could not create socket for port $localPort: $!n".

の間

{

私の $newSock = $sock->accept ()。

print "Connected accepted accepted from " . $newSock->peerhost .

" at " .localtime () ."“n”;

print $newSock $message ."“n”;

newSock -> shutdown(2)。

$sock->read($data, 1024); # 閉じているかどうかの表示を待つ */.

newSock->close()。

}

#

# tcplisten.pl はここで終了です。

tuc.

# tuc.pl begins here

#

# Version 1.00 10-07-30

# このスクリプトは

# i686-vos用にビルドされたPerl v5.8.0.0を実行しているVOS 17.0.2ahを開きます。

# MicrosoftWindows XP Service Pack 3 が稼働中

# MSWin32-x86-multi-thread用にビルドされたActiveState Perl v5.10.0

# Red HatLinux 4AS-5.5 を実行しています。

# Perl v5.8.8.5 は x86_64 用にビルドされています-linux-thread-multi

#

# noah.davids@stratus.com

#

IO::Socketを使用します。

IO::Selectを使用します。

Getopt::Longを使用します。

厳密に使用してください。

私の($result)。

my ($destIP, $destPort, $timeout, $result, $message, $flags)。

my ($ready, $socket) を使用しています。

私の ($x, $c, $icmpAlready)。

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

'port=s' => $destPort.

'timeout=s' => $timeout)。

if (($result != 1) || !(defined($destIP) && defined($destPort))

{

print "nnUsage:n"と表示されます。

print "tperl tuc.pl -ip DESTINATION-IP-ADDRESS " .

"-port DESTINATION-PORT-NUMBERnn".

出口に行きます。

}

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

elsif ($timeout > 15) { print "OK, but " . $timeout .

" seems unreasonable long.n"; }.

メッセージ = "sented by tuc.pl at " .localtime ().

my $sock = IO::Socket::INET->new(

Proto => 'udp'.

PeerPort => $destPort.

PeerAddr => $destIP

) または die "Could not create socket for destination $destIP: $!n".

私の $isock = IO::Socket::INET->new(

Proto => 'icmp')。

sock->send($message) または die "Send error: $!n".

メッセージ = "".

私の $read_set = new IO::Select()。

read_set->add($sock).

read_set->add($isock).

($ready) = IO::Select->select($read_set, undef, undef, $timeout)。

icmpAlready = 0.

$c = 0;

foreach $socket (@$ready)

{

c = $c + 1となります。

if ($socket == $sock)

{

x = "からUDPソケットで受信した応答"です。

ソケット->recv($message, 100, $flags)。

if ($icmpAlready == 0)

{

if (長さ ($message) > 0)

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

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

}

}

else # icmpメッセージを受信しました

{

icmpAlready = 1.

ソケット->recv($message, 100, $flags)。

if (長さ ($message) > 98)

{ print "予想外に長い (" . length ($message) .

"からのICMPメッセージ " . $socket->peerhost .

" メッセージ。" . $message ."“n”; }

elsif (length ($message) < 52)

{ print "Unexpecedly short (" . length ($message) .

") からの ICMP メッセージ " . $socket->peerhost ."“n”; }

else # icmpメッセージを処理する

{

私の $type = ord (substr ($message, 20, 1))。

私の $code = ord (substr ($message, 21, 1))。

私の $port = ord (substr ($message, 50, 1))* 256 +

ord (substr ($message, 51, 1))。

if ($port != $destPort)

{ print "Unexpected ICMP message received from " .

ソケット->ピアホスト ." message : " . substr ($message, 20) .

"“n”; }

else # icmpメッセージは良好

{

if ($type == 3)

{

if ($code == 0) { print "ICMP Destination network " .

"から受信した到達不可能なメッセージ"

ソケット->ピアホスト ."“n”; }

elsif ($code == 1) { print "ICMP Destination host " .

"から受信した到達不可能なメッセージ"

ソケット->ピアホスト ."“n”; }

elsif ($code == 3) { print "ICMP Destination port " .

"から受信した到達不可能なメッセージ"

ソケット->ピアホスト ."“n”; }

elsif ($code == 6) { print "ICMP Destination network " .

"不明なメッセージを受信しました" .

ソケット->ピアホスト ."“n”; }

elsif ($code == 7) { print "ICMP Destination host unknown " .

"メッセージを受信しました" . $socket->peerhost ."“n”; }

elsif ($code == 8) { print "ICMP Source host isolated " .

"から受信したメッセージ"

ソケット->ピアホスト ."“n”; }

elsif ($code == 9) { print "ICMP Network administratively " .

"からの禁止メッセージを受信しました。

ソケット->ピアホスト ."“n”; }

elsif ($code == 10) { print "ICMP Host administratively " .

"からの禁止メッセージを受信しました。

ソケット->ピアホスト ."“n”; }

elsif ($code == 11) { print "ICMP Network unreachable for " .

"からTOSメッセージを受信しました。

ソケット->ピアホスト ."“n”; }

elsif ($code == 12) { print "ICMP Host unreachable for " .

"からTOSメッセージを受信しました。

ソケット->ピアホスト ."“n”; }

elsif ($code == 13) { print "ICMP 通信 " .

" から受信した管理上禁止されているメッセージ

ソケット->ピアホスト ."“n”; }

else { print "受信した予期せぬICMPメッセージ type = " .

タイプ .", code = " ."からの" .

ソケット->ピアホスト ."“n”; }

}# if ($type == 3)

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

{ print "ICMP Time exceeded , TTL expired in transit " .

"メッセージを受信しました" . $socket->peerhost ."“n”; }

else { print "受信した予期せぬICMPメッセージ type = " .

タイプ .", code = " ."からの" .

ソケット->ピアホスト ."“n”; }

}else # else # icmp メッセージは良好です

}else # else # icmpメッセージを処理する

}# else #icmpメッセージを受信しました

}# foreach $socket (@$ready)

if ($c == 0) { print "No response was received from " .

$sock->peerhost ."“n”; }

#

# tuc.plはここまで

udpecho.pl

# udpecho.pl begins here

#

# Version 1.00 10-07-30

# このスクリプトは

# i686-vos用にビルドされたPerl v5.8.0.0を実行しているVOS 17.0.2ahを開きます。

# MicrosoftWindows XP Service Pack 3 が稼働中

# MSWin32-x86-multi-thread用にビルドされたActiveState Perl v5.10.0

# Red HatLinux 4AS-5.5 を実行しています。

# Perl v5.8.8.5 は x86_64 用にビルドされています-linux-thread-multi

#

# noah.davids@stratus.com

#

IO::Socketを使用します。

IO::Selectを使用します。

Getopt::Longを使用します。

厳密に使用してください。

私の($result)。

my ($localPort, $debug, $result, $message, $flags).

my ($ready, $socket) を使用しています。

私の($x, $c)。

$result = GetOptions ('port=s' => $localPort.

'debug' => $debug)。

if (($result != 1) || !

{

print "nnUsage:n"と表示されます。

print "tperl udpecho.pl -port LOCAL-PORT-NUMBER [-debug]nn".

出口に行きます。

}

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

my $sock = IO::Socket::INET->new(

Proto => 'udp'.

ローカルポート => $localPort

) または die "Could not create socket $!n".

私の $read_set = new IO::Select()。

read_set->add($sock).

メッセージ = "".

の間

{

($ready) = IO::Select->select($read_set, undef, undef, 300)。

foreach $socket (@$ready)

{

ソケット->recv($message, 100, $flags)。

if (defined ($debug)) { print "Message from " . $socket->peerhost .

" メッセージ。" . $message ."“n”; }

ソケット->send("echoed by udpecho.pl: " . $message) or die "Send error: $!

+n”;

}

}

#

# udpecho.pl はここで終了します。

メニューを閉じる

© 2020ストラタステクノロジー.