nc:綁定失敗:地址已在使用中
我正在嘗試
nc
從腳本執行命令,我的腳本正在nc
使用相同的源埠在 Destination 的不同埠上執行命令。例如:
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
有沒有辦法避免這種情況?
背景
當您嘗試以
nc
這種方式使用時,它會繼續保持 TCP 埠打開,等待目的地確認接收到完成的請求。這在 Wikipedia 上的 TCP 文章中得到了強調。時間的等待
(伺服器或客戶端)表示等待足夠的時間以確保遠端 TCP 收到其連接終止請求的確認。
$$ According to RFC 793 a connection can stay in TIME-WAIT for a maximum of four minutes known as a MSL (maximum segment lifetime). $$
當我
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 需要一些時間。您要麼需要等到它完全釋放(在兩者之間放置一些睡眠是一種簡單的方法),要麼使用不同的埠。
如果您只想查看埠@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
然而,在我使用 1.84 對 CentOS 5.9 系統進行測試時,它仍然繼續使用該埠,因此您能做的最好的事情就是使用,因為這是生效
-w 60
前的最短時間。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。
參考