nc — conexões TCP e UDP arbitrárias e escuta
SINOPSIS
nc [-46bCDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] [-m minttl] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable]
[-W recvlimit] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]
DESCRIÇÃO
O utilitário nc (ou netcat) é usado para praticamente qualquer coisa relacionada a TCP, UDP ou sockets Unix. Ele pode abrir conexões TCP, enviar pacotes UDP, ouvir em portas TCP e UDP arbitrárias, fazer varredura de portas e lidar com IPv4 e IPv6. Ao contrário de telnet(1), nc é executado bem em scripts e separa as mensagens de erro, enviando-as para a saída de erro padrão, em vez de enviá-las para a saída padrão, como telnet(1) faz em alguns casos.
Usos comuns incluem:
proxies TCP simples
clientes e servidores HTTP baseados em scripts
testes de daemon de rede
um proxy SOCKS ou HTTP para [ssh]({filename}../../ssh)(1)
e muito mais
As opções são as seguintes:
-4 Usar endereços IPv4 apenas.
-6 Usar endereços IPv6 apenas.
-b Permitir broadcast.
-C Enviar CRLF como terminador de linha. Cada caractere de nova linha (LF) nos dados de entrada é traduzido para CR+LF antes de ser gravado no socket. Caracteres de nova linha que já são precedidos por um retorno de carro (CR) não são traduzidos. Os dados recebidos não são afetados.
-D Habilitar depuração no socket.
-d Não tentar ler da entrada padrão.
-F Passar o primeiro socket conectado usando sendmsg(2) para a saída padrão e sair. Isso é útil em conjunto com -X para que o nc execute a configuração da conexão com um proxy, mas deixe o restante da conexão para outro programa (por exemplo, [ssh]({filename}../../ssh)(1) usando a opção ssh_config(5) ProxyUseFdpass). Não pode ser usado com -U.
-h Imprimir o texto de ajuda do nc e sair.
-I length
Especificar o tamanho do buffer de recebimento TCP.
-i interval
Dormir por interval segundos entre as linhas de texto enviadas e recebidas. Também causa um atraso entre as conexões a vários ports.
-k Quando uma conexão é concluída, ouvir por outra. Requer -l. Quando usado em conjunto com a opção -u, o socket do servidor não é conectado e pode receber datagramas UDP de vários hosts.
-l Ouvir por uma conexão de entrada, em vez de iniciar uma conexão com um host remoto. O destino e a porta para ouvir podem ser especificados como argumentos não opcionais ou com as opções -s e -p, respectivamente. Não pode ser usado em conjunto com -x ou -z. Além disso, quaisquer tempos limite especificados com a opção -w são ignorados.
-M ttl Define o TTL/limite de saltos dos pacotes de saída.
-m minttl
Solicite que o kernel descarte pacotes de entrada cujo TTL/limite de saltos seja inferior a minttl.
-N [shutdown]({filename}../../shutdown)(2) o socket de rede após o EOF na entrada. Alguns servidores exigem isso para concluir seu trabalho.
-n Não execute a resolução de nomes de domínio. Se um nome não puder ser resolvido sem DNS, um erro será relatado.
-O length
Especifique o tamanho do buffer de envio TCP.
-P proxy_username
Especifica um nome de usuário para apresentar a um servidor proxy que exige autenticação. Se nenhum nome de usuário for especificado, a autenticação não será tentada. A autenticação de proxy é suportada apenas para proxies HTTP CONNECT no momento.
-p source_port
Especifique a porta de origem que o nc deve usar, sujeito a restrições de privilégio e disponibilidade.
-q seconds
Após o EOF na entrada padrão, aguarde o número de segundos especificado e, em seguida, saia. Se os segundos forem negativos, aguarde indefinidamente (padrão). Especificar um número não negativo de segundos implica -N.
-r Escolha as portas de origem e/ou destino aleatoriamente, em vez de sequencialmente em um intervalo ou na ordem em que o sistema as atribui.
-S Habilite a opção RFC 2385 TCP MD5 signature.
-s sourceaddr
Defina o endereço de origem para enviar pacotes, o que é útil em máquinas com várias interfaces. Para sockets de datagrama de domínio Unix, especifica o arquivo de socket temporário local a ser criado e usado para que os datagramas possam ser recebidos. Não pode ser usado em conjunto com -x.
-T keyword
Altere o valor da classe de tráfego IPv4 TOS/IPv6. keyword pode ser um dos seguintes: critical, inetcontrol, lowcost, lowdelay, netcontrol, throughput, reliability ou um dos pontos de código DiffServ: ef, af11 ... af43, cs0 ... cs7; ou um número em hexadecimal ou decimal.
-t Envie respostas RFC 854 DON'T e WON'T para solicitações RFC 854 DO e WILL. Isso torna possível usar o nc para criar scripts de sessões telnet.
-U Use sockets de domínio Unix. Não pode ser usado em conjunto com -F ou -x. No Linux, se o nome começar com um símbolo de "arroba" (`@`), ele é lido como um socket de namespace abstrato: o "arroba" inicial é substituído por um byte nulo antes de vincular ou conectar. Para obter detalhes, consulte unix(7).
-u Use UDP em vez de TCP. Não pode ser usado em conjunto com -x. Para sockets de domínio Unix, use um socket de datagrama em vez de um socket de fluxo. Se um socket de domínio Unix for usado, um socket de recebimento temporário é criado em /tmp, a menos que a flag -s seja especificada.
-V rtable
Defina a tabela de roteamento a ser usada.
-v Produza uma saída mais detalhada.
-W recvlimit
Termine após receber recvlimit pacotes da rede.
-w timeout
As conexões que não podem ser estabelecidas ou que estão inativas serão encerradas após timeout segundos. A flag -w não tem efeito na opção -l, ou seja, o nc ouvirá indefinidamente por uma conexão, com ou sem a flag -w. O padrão é nenhum tempo limite.
-X proxy_protocol
Use proxy_protocol ao se comunicar com o servidor proxy. Os protocolos suportados são 4 (SOCKS 4, 4A (SOCKS v.4A), 5 (SOCKS v.5) e connect (proxy HTTPS). Se o protocolo não for especificado, a versão SOCKS 5 é usada. Observe que o protocolo SOCKS v.4 é muito limitado e só pode ser usado quando o host de destino pode ser resolvido para um endereço IPv4. Os outros protocolos passam o destino como uma string para ser interpretada pelo proxy remoto e não têm essa limitação.
-x proxy_address[:port]
Conecte-se ao destino usando um proxy em proxy_address e porta. Se a porta não for especificada, a porta bem conhecida para o protocolo proxy será usada (1080 para SOCKS, 3128 para HTTPS). Um endereço IPv6 pode ser especificado inequivocamente, colocando proxy_address entre colchetes. Um proxy não pode ser usado com nenhuma das opções -lsuU.
-Z Modo DCCP.
-z Apenas procure por daemons em execução, sem enviar dados para eles. Não pode ser usado
junto com -l.
destination pode ser um endereço IP numérico ou um nome de host simbólico (a menos que a opção -n seja fornecida).
Em geral, um destino deve ser especificado, a menos que a opção -l seja fornecida (nesse caso, o host local é usado). Para sockets de domínio Unix, um destino é obrigatório e é o caminho do socket para se conectar (ou escutar se a opção -l for fornecida).
port pode ser especificada como um número de porta numérico ou como um nome de serviço. Intervalos de portas podem ser especificados como números de porta numéricos no formato nn-mm. Em geral, uma porta de destino deve ser especificada, a menos que a opção -U seja fornecida. Para algumas opções, o valor 0 solicita que o sistema escolha um número de porta.
MODELO CLIENTE/SERVIDOR
É bastante simples construir um modelo cliente/servidor muito básico usando nc. Em um console, inicie nc escutando em uma porta específica para uma conexão. Por exemplo:
$ nc -l 1234
nc agora está escutando na porta 1234 para uma conexão. Em um segundo console (ou uma segunda máquina),
conecte-se à máquina e à porta em que está sendo escutado:
$ nc -N 127.0.0.1 1234
Agora deve haver uma conexão entre as portas. Tudo o que for digitado no segundo console será concatenado ao primeiro e vice-versa. Depois que a conexão for estabelecida, nc não se importa muito com qual lado está sendo usado como um "servidor" e qual lado está sendo usado como um "cliente". A conexão pode ser encerrada usando um EOF ('^D'), pois a flag -N foi fornecida.
Não há opção -c ou -e neste netcat, mas você ainda pode executar um comando após a conexão ser estabelecida, redirecionando os descritores de arquivo. Tenha cuidado aqui, pois abrir uma porta e deixar qualquer pessoa conectada executar um comando arbitrário em seu site é PERIGOSO. Se você realmente precisar fazer isso, aqui está um exemplo:
No lado do "servidor":
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
No lado do "cliente":
$ nc host.example.com 1234
$ (prompt do shell de host.example.com)
Ao fazer isso, você cria um fifo em /tmp/f e faz com que o nc escute na porta 1234 do endereço 127.0.0.1 no lado do ‘servidor’. Quando um ‘cliente’ estabelece uma conexão com sucesso nessa porta, /bin/sh é executado no lado do ‘servidor’ e o prompt do shell é fornecido ao lado do ‘cliente’.
Quando a conexão é encerrada, o nc também é encerrado. Use -k se você quiser que ele continue escutando, mas se o comando for encerrado, essa opção não o reiniciará nem manterá o nc em execução. Além disso, não se esqueça de remover o descritor de arquivo quando você não precisar mais dele:
$ rm -f /tmp/f
TRANSFERÊNCIA DE DADOS
O exemplo na seção anterior pode ser expandido para construir um modelo básico de transferência de dados. Qualquer
informação inserida em uma extremidade da conexão será exibida na outra extremidade, e a entrada e a
saída podem ser facilmente capturadas para emular a transferência de arquivos.
Comece usando o nc para escutar em uma porta específica, com a saída capturada em um arquivo:
$ nc -l 1234 > filename.out
Usando uma segunda máquina, conecte-se ao processo nc em escuta, alimentando-o com o arquivo que será transferido:
$ nc -N host.example.com 1234 < filename.in
Após a transferência do arquivo, a conexão será fechada automaticamente.
COMUNICANDO-SE COM SERVIDORES
Às vezes, é útil se comunicar com servidores “manualmente”, em vez de por meio de uma interface de usuário. Isso pode
ajudar na solução de problemas, quando pode ser necessário verificar quais dados um servidor está enviando em resposta aos comandos emitidos pelo cliente. Por exemplo, para recuperar a página inicial de um site:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Observe que isso também exibe os cabeçalhos enviados pelo servidor web. Eles podem ser filtrados, usando uma ferramenta como sed(1), se necessário.
Exemplos mais complexos podem ser criados quando o usuário conhece o formato das solicitações exigidas pelo servidor. Como outro exemplo, um e-mail pode ser enviado a um servidor SMTP usando:
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<_>
RCPT TO:<_>
DATA
Corpo do e-mail. . QUIT EOF
VERIFICAÇÃO DE PORTAS
Pode ser útil saber quais portas estão abertas e executando serviços em uma máquina de destino. A flag -z
pode ser usada para dizer ao nc para relatar portas abertas, em vez de iniciar uma conexão. Geralmente, é
útil ativar a saída detalhada para o stderr usando esta opção em conjunto com a opção -v.
Por exemplo:
$ nc -zv host.example.com 20-30
Conexão para host.example.com 22 porta [tcp/ssh] bem-sucedida! Conexão para host.example.com 25 porta [tcp/smtp] bem-sucedida!
O intervalo de portas foi especificado para limitar a pesquisa às portas 20 a 30, e é verificado em ordem crescente (a menos que a flag -r seja definida).
Você também pode especificar uma lista de portas para verificar, por exemplo:
$ nc -zv host.example.com http 20 22-23
nc: conectar a host.example.com 80 (tcp) falhou: Conexão recusada
nc: conectar a host.example.com 20 (tcp) falhou: Conexão recusada
Conexão para host.example.com porta [tcp/ssh] bem-sucedida! nc: conectar a host.example.com 23 (tcp) falhou: Conexão recusada
As portas são verificadas na ordem em que você as forneceu (a menos que a flag -r esteja definida).
Alternativamente, pode ser útil saber qual software de servidor está em execução e quais versões. Essas informações geralmente estão contidas nos banners de saudação. Para recuperá-los, é necessário primeiro estabelecer uma conexão e, em seguida, interromper a conexão quando o banner for recuperado. Isso pode ser feito especificando um pequeno tempo limite com a flag -w ou, talvez, emitindo um comando "QUIT" para o servidor:
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220host.example.com IMS SMTP Receiver Version 0.84 Ready
EXEMPLOS
Abra uma conexão TCP para a porta 42 de host.example.com, usando a porta 31337 como a porta de origem, com um tempo limite de 5 segundos:
$ nc -p 31337 -w 5 host.example.com 42
Abra uma conexão UDP para a porta 53 de host.example.com:
$ nc -u host.example.com 53
Abra uma conexão TCP para a porta 42 de host.example.com, usando 10.1.2.3 como o endereço IP para a extremidade local da conexão:
$ nc -s 10.1.2.3 host.example.com 42
Crie e escute em um socket de fluxo de domínio Unix:
$ nc -lU /var/tmp/dsocket
Conecte-se à porta 42 de host.example.com através de um proxy HTTP em 10.2.3.4, porta 8080. Este exemplo também pode ser usado por ssh(1); veja a diretiva ProxyCommand em ssh_config(5) para mais informações.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
O mesmo exemplo novamente, desta vez habilitando a autenticação de proxy com o nome de usuário “ruser”, caso o proxy exija:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
VEJA TAMBÉM
AUTORES
Implementação original por *Hobbit* <_>. Reescrito com suporte a IPv6 por Eric Jackson <_>. Modificado para a porta Debian por Aron Xu ⟨_⟩.
AVISOS
As verificações de porta UDP usando a combinação de flags -uz sempre relatarão sucesso, independentemente do estado da máquina de destino. No entanto, em conjunto com um analisador de tráfego, seja na máquina de destino ou em um dispositivo intermediário, a combinação de flags -uz pode ser útil para diagnósticos de comunicação. Observe que a quantidade de tráfego UDP gerado pode ser limitada devido a recursos de hardware e/ou configurações.