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)
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
是生效前的最短时间。
如果您想使用更合适的应用程序来扫描一组端口,那么我建议您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。