Você provavelmente já utilizou o NCAT (nc) para fazer testes de conectividade entre dois servidores de banco de dados, normalmente com portas comuns como a do ssh (22) ou listener do Oracle (1521).
Exemplo:
[grid@fppserver ~]$ nc -vz lab01 1521 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:1521. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
Mas além de testar a conectividade no cenário mais comum onde já tem um serviço escutando na porta em questão, também podemos usar o comando “nc” para testar qual porta que ainda não tenha um serviço ativo nela.
Por exemplo, se você você ainda vai instalar o software do Oracle e quiser verificar se a futura porta do Listener já tem liberação de firewall sem necessariamente ter que instalar e configurar o Grid, ou até mesmo um cenário similar com Golden Gate ou qualquer outro serviço.
Para este cenário, podemos usar o NCAT do lado do servidor de destino para ficar ouvindo em uma porta específica, de modo que possamos utilizá-lo no servidor de origem para realizar o teste de conectividade entre os dois servidores.
1) Exemplo Simples Com Uma Porta Específica
No servidor de destino, subindo o NCAT na porta 1522:
[grid@rac01 ~]$ nc -l -p 1522 & [1] 9435
Neste momento temos um processo do “nc” em background ouvindo na porta 1522 do servidor “rac01”. Podemos constatar isso com o netstat:
[grid@rac01 ~]$ netstat -tlpn | grep :1522 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:1522 0.0.0.0:* LISTEN 9435/nc
No servidor de origem, usamos o comando nc normalmente para testar a porta 1522:
[grid@fppserver ~]$ nc -zv rac01 1522 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.31:1522. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
Após o teste, o processo que estava ouvindo na porta 1522 do servidor rac01 é encerrado automaticamente:
[grid@rac01 ~]$ [1]+ Done nc -l -p 1522
E se você tentar testar mais uma vez sem subir o NCAT como ouvinte no destino novamente, receberá o erro indicando que não há nenhum serviço respondendo naquela porta:
[grid@fppserver ~]$ nc -zv rac01 1522 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connection refused.
2) Exemplo Com Um Range de Portas
Para o cenário mais complexo onde você pode precisar testar um range de portas, pode ser trabalhoso ter que subir as portas uma por uma no destino, e depois realizar o teste um por um na origem.
Felizmente podemos usar um loop no shell para simplificar essa tarefa. No exemplo abaixo eu irei testar um range de portas 8885-8895 que é usado pelo FPP para realizar a transferência de GoldImages do FPP Server para o FPP Target.
Comando que precisa ser executado no destino:
for (( port=8885; port<=8895; port++ )); do
nc -l -p $port &
done
Comando que precisa ser executado na origem, assumindo que o hostname de destino é “lab01” (poderia ser um IP também):
for (( port=8885; port<=8895; port++ )); do
nc -zv lab01 $port
done
Exemplo:
Origem, note que 11 processos foram criados em background, um para cada porta.
[grid@lab01 ~]$ for (( port=8885; port<=8895; port++ )); do > nc -l -p $port & > done [1] 23835 [2] 23836 [3] 23837 [4] 23838 [5] 23839 [6] 23840 [7] 23841 [8] 23842 [9] 23843 [10] 23844 [11] 23845
Na origem:
[grid@fppserver ~]$ for (( port=8885; port<=8895; port++ )); do > nc -zv lab01 $port > done Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8885. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8886. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8887. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8888. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8889. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8890. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8891. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8892. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8893. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8894. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds. Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.14:8895. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
E se você voltar na sessão do servidor de destino e pressionar ENTER, verá todos os processos sendo encerrados:
[grid@lab01 ~]$ [1] Done nc -l -p $port [2] Done nc -l -p $port [3] Done nc -l -p $port [4] Done nc -l -p $port [5] Done nc -l -p $port [6] Done nc -l -p $port [7] Done nc -l -p $port [8] Done nc -l -p $port [9] Done nc -l -p $port [10]- Done nc -l -p $port [11]+ Done nc -l -p $port
3) Testando Portas com Protocolo UDP
Por padrão o NCAT usa o protocolo TCP, seja como client ou como server. Para realizar um teste usando o protocolo UDP, basta adicionar a opção “-u” nos comandos do NCAT.
Para este exemplo, usarei o serviço do GNS (Grid Name Service), note que nestat mostra que há um processo escutando na porta 53 com protocolo UDP:
[grid@fppserver ~]$ netstat -tlnpu | grep :53 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) udp 0 0 169.254.23.147:53031 0.0.0.0:* 4021/asm_gen1_+ASM1 udp 0 0 192.168.1.29:53 0.0.0.0:* - udp 0 0 127.0.0.1:53329 0.0.0.0:* 4053/asm_dbw0_+ASM1 udp 0 0 169.254.23.147:53329 0.0.0.0:* 4053/asm_dbw0_+ASM1 udp 0 0 10.1.1.25:53437 0.0.0.0:* - udp 0 0 127.0.0.1:53693 0.0.0.0:* 4024/asm_diag_+ASM1 udp 0 0 169.254.23.147:53693 0.0.0.0:* 4024/asm_diag_+ASM1 udp 0 0 0.0.0.0:5353 0.0.0.0:* 2797/mdnsd.bin udp 0 0 0.0.0.0:5353 0.0.0.0:* 2797/mdnsd.bin
Se tentarmos executar um teste com NCAT com a mesma sintaxe dos exemplos anteriore, dará serviço negado:
[grid@fppserver ~]$ nc -vz 192.168.1.29 53 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connection refused.
Mas ao incluirmos o parâmetro “-u” de UDP, a conexão é realizada com sucesso:
[grid@fppserver ~]$ nc -u -vz 192.168.1.29 53 Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.1.29:53. Ncat: UDP packet sent successfully Ncat: 1 bytes sent, 1 bytes received in 2.02 seconds.
Tenha isso em mente quando precisar testar portas de serviços que usam protocolo UDP, como é o caso de DNS, assim como o GNS (Grid Name Service).
4) Transferindo Um Arquivo Com NCAT
Também é possível transferir um arquivo usando o NCAT, o que pode ser útil para investigação e testar se um serviço deve ser capaz de realizar transferência de arquivos por uma porta específica. Para este exemplo, irei copiar o arquivo “gi_home_19300.zip” do servidor “fppserver” para o “lab01” pela porta 8895.
Observe o tamanho do arquivo e o hash obtido com md5sum:
[grid@fppserver medias]$ md5sum gi_home_19300.zip b7c4c66f801f92d14faa0d791ccda721 gi_home_19300.zip [grid@fppserver medias]$ [grid@fppserver medias]$ du -sh gi_home_19300.zip 2.7G gi_home_19300.zip
No destino, iniciando nc para ouvir na porta 8895 e gravar o resultado que ele receber no arquivo “/u01/medias/gi_home_19300.zip” (poderia ser qualquer nome e destino). Note que este arquivo ainda não existe no servidor de destino e será criado pelo NCAT, conforme ele receber a entrada do servidor de origem.
[grid@lab01 ~]$ nc -l 8895 > /u01/medias/gi_home_19300.zip
Na origem, executando um “cat” no arquivo zip que é um binário do Grid, e passando a saída para o comando “nc” transferir o conteúdo para o servidor “lab01”, na porta 8895:
[grid@fppserver medias]$ cat gi_home_19300.zip | nc lab01 8895
Este comando não mostrará nenhum progresso da cópia e você precisa aguardar o controle da sessão voltar para o prompt.
Agora se verificar novamente no destino, verá que o processo do NCAT que estava ativo na porta 8895 finalizou, e o arquivo .zip foi criado:
[grid@lab01 ~]$ du -sh /u01/medias/gi_home_19300.zip 2.7G /u01/medias/gi_home_19300.zip [grid@lab01 ~]$ [grid@lab01 ~]$ md5sum /u01/medias/gi_home_19300.zip b7c4c66f801f92d14faa0d791ccda721 /u01/medias/gi_home_19300.zip