Como eu posso telnetar para a porta HTTP 80?


16

Depois de pesquisar no google, descobri que podemos telnetacessar o servidor da web na porta http e usá-lo GETpara recuperar uma página html.

Por exemplo:

$ telnet web-server-name 80

Mas não consigo entender como isso é possível?

Eu pensei que, se a porta 80 for para o servidor http, a porta 80 ouvirá apenas httpsolicitações. Mas como posso acessar telnetuma HTTPporta?

Não são telnete HTTPdois protocolos diferentes?


2
Para brincar na 'net, o comando netcat ( nc(1)) é muito mais flexível. Ele pode se conectar a serviços cifrados SSL / TLS e também ser usado como servidor e até mesmo retransmitir dados.
vonbrand

Respostas:


25

Parabéns, você acabou de se aprofundar no conceito de camadas de rede ao perceber que portas e protocolos não estão diretamente conectados entre si. Como outros dizem, o telnet pode ser usado para conectar-se a qualquer porta TCP. No entanto, para entender por que isso é possível, você precisa entender um pouco sobre as camadas de rede. Se você já ouviu falar do modelo OSI de 7 camadas, é isso que permite usar o telnet para conectar-se a outra porta. Embora na Internet, eles só se preocupam com 4 das camadas e é chamado de Internet Protocol Suite. Sem camadas de rede, cada programa não apenas precisaria entender seu próprio protocolo, mas também teria que definir seu próprio esquema de endereçamento IP e sistema de portas, o que significa que cada roteador precisaria entender como rotear esses esquemas e protocolos diferentes. mais difícil de aprender e diagnosticar. Simplificando, a Internet não funcionaria tão bem sem camadas.

Você se preocupa com a camada de transporte e a camada de aplicação. Na camada de transporte, temos protocolos da Internet como TCP e UDP com números de porta que variam de 1 a 65535 em cada um. Na camada de aplicação, temos protocolos como HTTP, SMTP e DNS. Geralmente, cada documento de padrões da Internet que define um protocolo especifica uma porta TCP ou UDP padrão que o protocolo deve usar por padrão. Como a porta TCP 80 para HTTP, porta TCP 25 para SMTP, porta UDP 53 para DNS e porta TCP 23 para Telnet. O programa telnet realmente fala o protocolo TELNET, que é um protocolo padrão, mas principalmente um antigo para os padrões atuais. Como suas seqüências de protocolo são feitas de caracteres de 8 bits, você raramente vê o protocolo em si e é quase sempre transparente quando comparado a outros protocolos mais modernos, como HTTP e SMTP, que usam palavras visíveis humanas em ASCII, como GET, POST, HELO, LOGIN, etc.

Como seu protocolo geralmente não é visível, o telnet foi uma ferramenta decente para conectar-se a outras portas TCP e permitir que o usuário digite protocolos manualmente. Alguns administradores de rede usam essa técnica para diagnosticar problemas com os servidores. No entanto, como o programa telnet ainda possui seu próprio protocolo e pode enviar bits extras de dados às vezes, você ainda pode ter problemas com essa técnica. Quando você usa o telnet, está realmente "fazendo uma conexão" na camada de aplicação e na camada de transporte. Acontece que outros protocolos da camada de aplicação podem funcionar bem na maioria dos diagnósticos e não interferem no protocolo telnet. Existe um programa melhor para fazer isso através do chamado nc (Net Cat. Ele recebe esse nome por ser uma versão baseada em rede do comando cat).

$ nc www.stackexchange.com 80

O programa nc não fala nenhum protocolo da camada de aplicativo e, quando você faz uma conexão com ele, está "fazendo uma conexão" apenas na camada da Internet (endereço IP) e na camada de Transporte (TCP ou UDP). O que isso significa é que você controla qual protocolo da camada de aplicativo é usado. Quase tudo é bom jogo, mesmo protocolos binários. Isso também permite que você faça coisas úteis como transferir arquivos sem que eles sejam corrompidos e escute nas portas o tráfego recebido:

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)

E, em seguida, movie.mp4 é transferido pela rede sem usar nenhum protocolo da camada de aplicativo (como FTP). O protocolo do aplicativo é realmente seu amigo, dizendo que eles estão prontos para você executar seu comando.

O nc também pode manipular pacotes UDP e soquetes de domínio UNIX. Usá-lo para ouvir também pode ser interessante.

nc -l 12345

Agora, no seu navegador, visite http: // localhost: 12345 / e na sua sessão nc, você deverá ver a GET / HTTP/1.1solicitação do navegador . Nesse ponto, você pode digitar algo e pressionar Ctrl-De ele deve aparecer no seu navegador em texto sem formatação (se você deseja que o HTML apareça, você deve enviá-lo de volta a resposta apropriada do protocolo HTTP seguida pelo código HTML).

Às vezes, programas que falam nativamente um protocolo como HTTP podem se conectar a outras portas destinadas a um protocolo diferente. Normalmente, você não pode mais fazer isso em um navegador da GUI porque eles os impediram de se conectar a algumas portas, mas se você usar um programa como curl para se conectar à porta 25 (SMTP para enviar e-mail), provavelmente verá algumas erros sobre a quebra de protocolo.

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.

Isso acontece porque o curl normalmente fala o protocolo HTTP; portanto, depois de estabelecer um handshake TCP, ele começa a enviar dados como este:

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl

Mas o que o servidor SMTP está esperando é SMTP, que é mais ou menos assim:

HELO myhomecomputername.local

Nesse momento, o servidor envia de volta sua linha de identificação:

250 yourispsmtpserverhost.com

Portanto, você vê que não há nada que impeça o curl de estabelecer uma conexão da camada de transporte com o servidor SMTP, apenas não pode falar o protocolo. Mas você pode falar o protocolo com um programa como telnet ou, mais preferencialmente, nc.


curlprecisa de um -vargumento para mostrar detalhado saída no OS X.
Hamid Rohani

6

telnet é uma ferramenta que pode se conectar a qualquer porta TCP.

Por padrão, ele se conecta à porta telnet (23), mas você pode solicitar que ele se conecte à porta http (80) ou smtp (25) ou qualquer outra coisa.

Você precisa saber como "falar" o protocolo que o servidor remoto está ouvindo nessa porta.

Por exemplo, se você deseja obter os cabeçalhos de um site (nomes de domínio etc. alterados para proteger os culpados):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign host.

A HEADlinha é o que eu digitei na conexão. Observe que o protocolo http exige que você envie uma linha em branco para indicar o final do seu HEAD ou GET ou qualquer outra solicitação. Essa é a linha em branco imediatamente após a solicitação HEAD.


3

A negociação inicial para ambos os protocolos usa comandos de texto, para que você possa se conectar e começar a inserir comandos. Isso vale para outros protocolos antigos , como o SMTP, e o telnet há muito tempo é usado para solucionar problemas de conexões com os respectivos serviços.

Por exemplo

Os protocolos são independentes da porta na qual eles se comunicam. Quase todas as implementações podem ser configuradas para escutar em qualquer porta.

Alguns protocolos (como HTTPS) não usam comandos de texto para negociação. No entanto, você pode (normalmente) conectar-se à porta na qual o servidor escuta, mas não faz nada útil.


3

Parte do seu entendimento está correta e outras não. A porta 80 geralmente é reservada para HTTP, mas isso é apenas uma convenção; qualquer programa pode escutar em qualquer porta aberta no sistema. Se houver um servidor da Web atendendo na porta 80 no sistema ao qual você está se conectando, será necessário usar o HTTP para se comunicar com ele.

telnetnão é um protocolo, é um programa que permite enviar texto bruto para qualquer host em qualquer porta. O host remoto não tem idéia de qual programa está se conectando a ele; tudo o que pode ver são os pacotes enviados para ele. Qualquer programa que envie pacotes que estejam em conformidade com o protocolo esperado pelo host remoto funcionará, portanto você pode telnetse comunicar com qualquer protocolo baseado em texto.

Você enviou algo do tipo GET /path/to/a/file HTTP/1.1, que é um comando HTTP 1.1 válido e tem a mesma aparência de uma solicitação que seria enviada por um navegador da Web, para que funcione bem.


11
telnet é um protocolo RFC 854 . É que os telnetclientes comuns não tentam usar o telnetprotocolo, exceto quando se conectam tcp/21. Na página do manual: "Ao conectar-se a outras portas que não a porta telnet, o telnet não tenta negociações de protocolo telnet. Isso possibilita a conexão a serviços que não suportam o protocolo telnet sem fazer uma bagunça. A negociação do protocolo pode ser forçada por colocando um traço antes do número da porta ".
user4556274
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.