Antecedentes
Quando você está tentando usar nc
desta maneira, ele continua mantendo a porta TCP aberta, esperando que o destino confirme o recebimento da solicitação concluída. Isso é destacado no artigo do TCP na Wikipedia .
TIME-WAIT
(either server or client) represents waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request. [According to RFC 793 a connection can stay in TIME-WAIT for a maximum of four minutes known as a MSL (maximum segment lifetime).]
Você pode ver os efeitos disso quando eu uso nc
da mesma forma:
$ nc -p 8140 -v -n 192.168.1.105 80
Olhando para o estado da porta 8140:
$ netstat -anpt | grep 8140
tcp 0 0 192.168.1.3:8140 192.168.1.105:80 TIME_WAIT -
Na verdade, na maioria dos sistemas Linux, esse TIME_WAIT
está definido para 60 segundos.
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
Se você quiser ver o efeito você mesmo, você pode usar este snippet para assistir quando a porta for liberada.
$ 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
$
Método 1 - usando nc
A liberação da porta 8140 leva algum tempo para ocorrer. Você precisará aguardar até que seja totalmente liberado (colocar algumas horas de descanso seria uma maneira fácil) ou usar uma porta diferente.
Se você quer apenas ver se o port @ host está aberto ou não, você pode simplesmente descartar o -p 8140
.
$ nc -zv -n 10.X.X.9 9090-9093
Exemplo
$ 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!
OBSERVAÇÃO: Você pode se sentir tentado a adicionar a opção -w
a nc
, que o instrui a aguardar apenas um determinado período de tempo. Por padrão, nc
esperará para sempre. Então seu comando seria algo assim:
$ nc -p 8140 -zv -n 10.X.X.9 9090 -w 1
No entanto, nos meus testes em um sistema CentOS 5.9 usando 1.84, ele continuou a manter a porta em uso posteriormente, então o melhor que você pode fazer é usar -w 60
, já que é o menor tempo até TIME_WAIT
entra em vigor.
Método 2 - usando o nmap
Se você quiser usar um aplicativo mais apropriado para verificar um conjunto de portas, sugiro usar nmap
.
$ sudo nmap -sS --source-port 8140 -p 9090-9093 10.X.X.9
Exemplo
$ 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
Aqui eu configurei um filtro usando iptraf
para provar que o tráfego está saindo para essas portas usando a porta de origem do 8140.
OBSERVAÇÃO: Preste atenção especial a # 1 no diagrama, que mostra a porta de origem 8140, enquanto # 2 mostra um par de minhas portas de destino que eu selecionei, principalmente 80 & 83.
Referências
Folha de referência do Nmap - Vincular: Endereço já em uso - ou como evitar esse erro ao fechar conexões TCP