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
背景
この方法を使用しようとすると、nc
TCPポートを開いたままにして、宛先が完了した要求の受信を承認するのを待ちます。この点は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_WAIT
60秒に設定されています。
$ 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)が表示されます。