nc: 绑定失败: 地址已被使用

sau*_*rav 5 networking tcp netcat

我正在尝试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 ...
Run Code Online (Sandbox Code Playgroud)

在第一次 nc 执行之后,对于所有行的其余部分,我收到了下面提到的错误消息。

nc: bind failed: Address already in use
nc: bind failed: Address already in use
nc: bind failed: Address already in use
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这种情况?

slm*_*slm 10

背景

当您尝试以nc这种方式使用时,它会继续保持 TCP 端口打开,等待目的地确认收到已完成的请求。维基百科上TCP 文章强调了这一点。

时间的等待

(服务器或客户端)表示等待足够的时间过去以确保远程 TCP 收到其连接终止请求的确认。[根据 RFC 793,连接可以在 TIME-WAIT 中停留最多四分钟,称为 MSL(最大段寿命)。]

当我使用nc类似的方法时,您可以看到它的效果:

$ nc -p 8140 -v -n 192.168.1.105 80
Run Code Online (Sandbox Code Playgroud)

查看8140端口的状态:

$ netstat -anpt | grep 8140
tcp        0      0 192.168.1.3:8140       192.168.1.105:80         TIME_WAIT   -
Run Code Online (Sandbox Code Playgroud)

事实上,在大多数 Linux 系统上,这TIME_WAIT被设置为 60 秒。

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
Run Code Online (Sandbox Code Playgroud)

如果您想自己查看效果,可以使用此代码段查看端口何时发布。

$ 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
$
Run Code Online (Sandbox Code Playgroud)

方法 #1 - 使用 nc

8140 端口的释放需要一些时间才能发生。您要么需要等到它完全释放(在两者之间放置一些睡眠将是一种简单的方法)或使用不同的端口。

如果您只想查看端口@host 是否打开,您可以删除-p 8140.

$ nc -zv -n 10.X.X.9 9090-9093
Run Code Online (Sandbox Code Playgroud)

例子

$ 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!
Run Code Online (Sandbox Code Playgroud)

注意:您可能会尝试将-w选项添加到nc,这会指示它只等待一段时间。默认情况下nc将永远等待。所以你的命令应该是这样的:

$ nc -p 8140 -zv -n 10.X.X.9 9090 -w 1
Run Code Online (Sandbox Code Playgroud)

然而,在我对使用 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
Run Code Online (Sandbox Code Playgroud)

例子

$ 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
Run Code Online (Sandbox Code Playgroud)

在这里,我设置了一个过滤器,iptraf用于证明流量使用 8140 的源端口传到这些端口。

注意:请特别注意图中的#1,它显示了源端口 8140,而#2显示了我选择的几个目标端口,主要是 80 和 83。

               党卫军#1

参考