Networking

nc:綁定失敗:地址已在使用中

  • July 10, 2021

我正在嘗試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。

               #1

參考

引用自:https://unix.stackexchange.com/questions/121230