nc:バインディング失敗:アドレスはすでに使用されています。

nc:バインディング失敗:アドレスはすでに使用されています。

ncスクリプトでコマンドを実行しようとしていますが、私のスクリプトはnc同じソースポートを使用してターゲットの他のポートでコマンドを実行しています。

たとえば、

nc -p 8140 -z -v -n 10.X.X.9 9090
nc -p 8140 -z -v -n 10.X.X.9 9091
nc -p 8140 -z -v -n 10.X.X.9 9092
nc -p 8140 -z -v -n 10.X.X.9 9093
and so on ...

最初の nc を実行した後、残りのすべての行について、次のエラー メッセージが表示されます。

nc: bind failed: Address already in use
nc: bind failed: Address already in use
nc: bind failed: Address already in use

これを避ける方法はありますか?

ベストアンサー1

背景

この方法を使用しようとすると、ncTCPポートを開いたままにして、宛先が完了した要求の受信を承認するのを待ちます。この点はWikipediaのTCP記事

待つ時間

(サーバーまたはクライアント)リモートTCPが接続終了要求の承認を受けるのに十分な時間待機していることを示します。 [RFC 793によれば、接続は最大最大セグメントライフタイム(MSL)と呼ばれる最大4分間TIME-WAIT状態にあります。 ]

次のものを使用すると効果が表示されますnc

$ nc -p 8140 -v -n 192.168.1.105 80

ポート8140の状態を確認してください。

$ netstat -anpt | grep 8140
tcp        0      0 192.168.1.3:8140       192.168.1.105:80         TIME_WAIT   -

実際、ほとんどのLinuxシステムでは、この時間はTIME_WAIT60秒に設定されています。

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60

効果を直接確認するには、このコードスニペットを使用してポートがリリースされるタイミングを観察できます。

$ date; nc -p 8140 -v -n 192.168.1.105 80 -w 1; date; \
    while netstat -anpt | grep 8140; do date; sleep 10; done; date
Tue Mar 25 09:46:59 EDT 2014
Connection to 192.168.1.105 80 port [tcp/*] succeeded!
Tue Mar 25 09:47:00 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:00 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:10 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:20 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:30 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:40 EDT 2014
tcp        0      0 192.168.1.3:8140       192.168.1.105:80        TIME_WAIT   -
Tue Mar 25 09:47:50 EDT 2014
Tue Mar 25 09:48:00 EDT 2014
$

方法#1 - NCの使用

ポート8140が解放されるのに時間がかかります。完全に解放されるのを待つか(その間スリープ状態を維持するのは簡単な方法です)、別のポートを使用する必要があります。

port@hostが開いていることを確認したい場合は、直接削除できます-p 8140

$ nc -zv -n 10.X.X.9 9090-9093

はい

$ nc -zv -n 192.168.1.200 2024-50000 |& grep -v refu
Connection to 192.168.1.200 5672 port [tcp/*] succeeded!
Connection to 192.168.1.200 35766 port [tcp/*] succeeded!

メモ:特定の時間だけ待つように指示する-wオプションを追加することもできます。ncデフォルトはnc永遠に待つことです。したがって、あなたのコマンドは次のようになります。

$ nc -p 8140 -zv -n 10.X.X.9 9090 -w 1

-w 60ただし、1.84を使用するCentOS 5.9システムでテストした結果、その後もポートは引き続き使用されたため、適用されるまでの最小限の時間なので、使用するのが最善です。TIME_WAIT

方法 #2 - nmapを使う

ポートセットのスキャンに適したアプリケーションを使用するには、これを使用することをお勧めしますnmap

$ sudo nmap -sS --source-port 8140 -p 9090-9093 10.X.X.9

はい

$ sudo nmap -sS --source-port 8140 -p 80-85 homer

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-24 21:22 EDT
Nmap scan report for homer (192.168.1.105)
Host is up (0.0059s latency).
PORT   STATE  SERVICE
80/tcp open   http
81/tcp closed hosts2-ns
82/tcp closed xfer
83/tcp closed mit-ml-dev
84/tcp closed ctf
85/tcp closed mit-ml-dev
MAC Address: 00:18:51:43:84:87 (SWsoft)

Nmap done: 1 IP address (1 host up) scanned in 11.36 seconds

iptrafここでは、送信元ポート8140を使用して、トラフィックがこれらのポートに送信されることを証明するフィルタを設定しました。

メモ:注意を払う#1図にはソースポート8140が表示されていますが、#2私が選択したいくつかの宛先ポート(主に80と83)が表示されます。

               SS#1

引用する

おすすめ記事