UDPを介して(両方にアクセスできる)リモートサーバーの特定のポートに到達できるかどうかをテストしようとしています。
どちらのサーバーもインターネットに面しています。 netcatを使用して、特定のポートをリッスンしています。
次に、nmapを使用してそのポートが開いているかどうかを確認しますが、開いていないようです。
Iptablesはオフになっています。
なぜこれが起こり得るのか?私は最終的にVPNトンネルをセットアップするつもりですが、トンネルは非常に新しいので、進む前にポートUDP 1194に接続できることを確認したいと思います。
「開いている」UDPポートなどはありません。少なくとも、ほとんどの人が考えるのに慣れているという意味ではありません(「OK、私はあなたの接続を受け入れました」のようなものに答えています)。 UDPはセッションレスであるため、「ポート」(読み取り:オペレーティングシステムのIPスタックのUDPプロトコル)がそれ自体で「成功」することはありません。
UDPポートには2つの状態しかありません:待機中かどうか。これは通常、「プロセスによってソケットが開かれている」または「ソケットが開かれていない」という意味になります。システムは ICMP Destination Unreachable packet with code = 3(Port unreachable)で応答する必要があるため、後者のケースは簡単に検出できます。残念ながら、多くのファイアウォールはこれらのパケットをドロップする可能性があるため、何も返されない場合、ポートがこの状態にあるかどうかはわかりません。また、ICMPもセッションレスで再送信を行わないことを忘れないでください。ポート到達不能パケットは、ネットワーク上のどこかで失われる可能性が非常に高いです。
「リスニング」状態のUDPポートはまったく応答しない場合があります(それをリッスンするプロセスはパケットを受信し、何も送信しない)、または何かを送り返す可能性があります(プロセスが受信時に動作する場合およびUDP経由で元の送信者IP:ポートに応答することで機能する場合)。繰り返しになりますが、何も返されない場合は、状態がどうなるかはわかりません。
あなたはあなたが受信ホストを制御できると言います:それはあなたがUDPポート到達可能性をチェックするためにあなた自身のプロトコルを構築することを可能にします:与えられたUDPポートand返信する(またはメールを送信する、またはただひたすらホストファイルシステムのunlink()
すべてを......注意をトリガーするものはすべて行う)。
Udpポートが応答しているかどうかをテストするには、netcat
を使用します。
man page の例:
nc -v -u -z -w 3 example.Host 20-30
Send UDP packets to ports 20-30 of example.Host, and report which ones
did not respond with an ICMP packet after three seconds.
もちろん、ファイアウォールがDROP
ingである場合、これは通常、インターネットに接続されたゲートウェイを処理するときに当てはまり、ICMP応答を受信しません。
yum install nc
(centosの場合)nc -ul 6111
nc -u <server> 6111
注:サーバーでnc -ul
コマンドを実行すると、最初の接続がのみ接続しますそれに。私が知ったように、nc -ul
を停止して再起動せずに、pingを実行するサーバーを切り替えることはできません。実際、クライアントを^ C停止すると(nc -u ...
)、最初にサーバーリスナーを再起動しないとクライアントを再起動できません。
Nmapを使用して開いているUDPポートをテストすることは危険に満ちています-開いていることを示す3方向のハンドシェイクはありません。リッスンプロセスがnmapが送信するものに応答しない限り、nmapが応答していない開いているポートとフィルタリングされたポートを区別する方法はありません。
はるかに簡単なのは、一方の端をnetcatでリッスンし、もう一方の端でnetcatを使用してパケットを送信し、もう一方の端に到着することを確認することです。両方の方法で実行してください。 tcpdump
を使用して、パケットがどこに行く必要があるかを確認することもできます。
私は同様の問題を抱えていて、netcatを使用して良い解決策を見つけました: http://en.wikipedia.org/wiki/Netcat#Test_if_UDP_port_is_open:_simple_UDP_server_and_client
nc -vzu <Host> <port>
UDPポートが開いていることを確認でき、実際のコードのテストに進むことができました。
次のコマンドを使用して、udpポートをスキャンできます
nmap -sU -v <hostname or ip>
私は単純な考え方をしています。 UDPサーバーが予期したデータを返さない場合は、ダウンしたと想定して、dgramの収集を停止します。
LINE: while(1)
{
my $line;
my $flags;
local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
alarm 5;
eval {
$socket->recv($line,2024,$flags);
};
unless($line =~ /\{.*\}/){
if($verbose){
print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
}
last LINE;
}
}
ネットワーク外でテストする別のマシンがある場合は、netcat
(nc)またはiperf
を使用してこれを行うことができます。私の選択は、環境外のシステムからのnmap
UDPスキャンです。 nmapコマンドラインは何でしたか?ハードウェアファイアウォールまたはその他のデバイスが混在していますか?