Как я могу Telnet к порту HTTP 80?

16

После поиска в Google я обнаружил, что мы можем telnetподключиться к веб-серверу на его http-порт и использовать его GETдля извлечения html-страницы.

Например:

$ telnet web-server-name 80

Но я не могу понять, как это возможно?

Я думал, что если порт 80 для http-сервера, то порт 80 будет только слушать httpзапросы. Но как я в состоянии telnetк HTTPпорту?

Разве нет telnetи HTTPдвух разных протоколов?

СФС
источник
2
Для работы в сети команда netcat ( nc(1)) гораздо более гибкая. Он может подключаться к зашифрованным службам SSL / TLS, а также использоваться в качестве сервера и даже передавать данные.
vonbrand

Ответы:

25

Поздравляем, вы только что углубились в концепцию сетевых уровней, осознав, что порты и протоколы не связаны напрямую друг с другом. Как говорят другие, telnet можно использовать для подключения к любому порту TCP. Однако, чтобы понять, почему это возможно, вам нужно немного разбираться в сетевых уровнях. Если вы когда-либо слышали о модели уровня OSI 7, это то, что позволяет вам использовать telnet для подключения к другому порту. Хотя в Интернете они касаются только 4-х уровней и их называют Internet Protocol Suite, Без сетевых уровней каждая программа должна была бы не только понимать свой собственный протокол, но и определять собственную схему IP-адресации и систему портов, что означает, что каждый маршрутизатор должен понимать, как маршрутизировать эти схемы, и различные протоколы будут очень полезны. сложнее учиться и диагностировать. Проще говоря, Интернет не будет работать почти так же хорошо без слоев.

Вас интересуют транспортный уровень и прикладной уровень. На транспортном уровне у нас есть интернет-протоколы, такие как TCP и UDP, с номерами портов от 1 до 65535 на каждом. На прикладном уровне у нас есть протоколы, такие как HTTP, SMTP и DNS. Обычно каждый документ стандартов Интернета, который определяет протокол, определяет порт TCP по умолчанию или порт UDP, который протокол должен использовать по умолчанию. Например, TCP-порт 80 для HTTP, TCP-порт 25 для SMTP, UDP-порт 53 для DNS и TCP-порт 23 для Telnet. Программа telnet фактически говорит по протоколу TELNET, который является стандартным протоколом., но в основном древний по нынешним меркам. Поскольку его последовательности протоколов состоят из 8-битных символов, вы редко видите сам протокол и в основном его прозрачный по сравнению с другими более современными протоколами, такими как HTTP и SMTP, которые используют видимые человеком слова в ASCII, такие как GET, POST, HELO, LOGIN, и т.п.

Поскольку его протокол обычно не виден, telnet стал хорошим инструментом для подключения к другим портам TCP и позволяет пользователю вводить протоколы вручную. Некоторые сетевые администраторы используют эту технику для диагностики проблем с серверами. Однако, поскольку программа telnet по-прежнему имеет собственный протокол и иногда может отправлять дополнительные биты данных, вы все равно можете испытывать проблемы с этим методом. Когда вы используете telnet, вы действительно «устанавливаете соединение» на уровне приложений, а также на транспортном уровне. Просто случается, что другие протоколы прикладного уровня могут работать нормально для большинства задач диагностики и не будут мешать протоколу telnet. Есть лучшая программа для этого через nc (Net Cat. Она получила свое название от сетевой версии команды cat).

$ nc www.stackexchange.com 80

Программа nc не говорит ни о каком протоколе прикладного уровня, и когда вы устанавливаете соединение с ним, вы «устанавливаете соединение» только на интернет-уровне (IP-адрес) и транспортном уровне (TCP или UDP). Это означает, что вы контролируете, какой протокол прикладного уровня используется. Честная игра, даже бинарные протоколы. Это также позволяет вам делать полезные вещи, такие как передача файлов без их повреждения и прослушивание портов для входящего трафика:

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

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

А затем movie.mp4 передается по сети, вообще не используя протокол прикладного уровня (например, FTP). Протокол приложения - это ваш друг, который говорит вам, что он готов выполнить вашу команду.

nc также может обрабатывать UDP-пакеты и сокеты UNIX-домена. Использование его для прослушивания также может быть интересным.

nc -l 12345

Теперь в вашем веб-браузере зайдите на http: // localhost: 12345 /, а в сеансе nc вы должны увидеть GET / HTTP/1.1запрос браузера . В этот момент вы можете что-то набрать и нажать, Ctrl-Dи это должно появиться в вашем браузере в виде обычного текста (если вы хотите, чтобы HTML отображался, вы должны отправить его обратно с правильным ответом протокола HTTP, а затем HTML-кодом).

Иногда программы, которые изначально используют один протокол, такой как HTTP, могут подключаться к другим портам, предназначенным для другого протокола. Обычно вы больше не можете делать это в браузере с графическим интерфейсом, потому что они ограничивают их для подключения к некоторым портам, но если вы используете программу, такую ​​как curl, для подключения к порту 25 (SMTP для отправки почты), вы, вероятно, увидите пару ошибки о нарушении протокола.

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

Это происходит потому, что curl обычно говорит по протоколу HTTP, поэтому после установления TCP-квитирования он начинает отправлять данные следующим образом:

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

Но SMTP-сервер ожидает SMTP, который выглядит примерно так:

HELO myhomecomputername.local

В этот момент сервер отправляет обратно свою идентификационную строку:

250 yourispsmtpserverhost.com

Итак, вы видите, что нет ничего, что мешает curl установить соединение транспортного уровня с SMTP-сервером, оно просто не может говорить по протоколу. Но вы можете говорить по протоколу самостоятельно с помощью программы, такой как telnet или, более предпочтительно, nc.

deltaray
источник
curlнужен -vаргумент, чтобы показать подробный вывод в OS X.
Хамид Рохани
6

telnet это инструмент, который может подключаться к любому порту TCP

По умолчанию он подключается к порту telnet (23), но вы можете указать ему подключение к порту http (80) или порту smtp (25) или что-то еще.

Вы должны знать, как «говорить» протокол, который удаленный сервер ожидает на этом порту.

Например, если вы хотите получить заголовки веб-сайта (имена доменов и т. Д. Изменены для защиты виновных):

$ 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.

HEADЛиния это то , что я напечатал в связи. Обратите внимание, что протокол http требует, чтобы вы отправили пустую строку, чтобы указать конец вашего HEAD или GET или любого другого запроса. Это пустая строка сразу после запроса HEAD.

саз
источник
3

Первоначальное согласование для обоих протоколов использует текстовые команды, поэтому вы можете подключиться и начать вводить команды. Это справедливо для других старых протоколов, таких как SMTP, и telnet уже давно используется для устранения неполадок подключений к соответствующим службам.

Например

Протоколы не зависят от порта, на котором они общаются. Почти все реализации могут быть настроены для прослушивания на любом порту.

Некоторые протоколы (такие как HTTPS) не используют текстовые команды для согласования. Однако вы можете (обычно) подключиться к порту, на котором сервер слушает, но ничего не делать полезного.

Томас Дики
источник
3

Некоторые из вас понимают правильно, а некоторые нет. Порт 80 обычно зарезервирован для HTTP, но это просто соглашение; любая программа может прослушивать любой открытый порт в системе. Если веб-сервер прослушивает порт 80 в системе, к которой вы подключаетесь, вам нужно использовать HTTP для связи с ним.

telnetэто вовсе не протокол, это программа, которая позволяет отправлять необработанный текст на любой хост любого порта. Удаленный хост не знает, какая программа подключается к нему; все, что он может видеть, - это отправляемые ему пакеты. Любая программа, отправляющая пакеты, соответствующие протоколу, ожидаемому удаленным хостом, будет работать, поэтому вы можете использовать ее telnetдля связи по любому текстовому протоколу.

Вы отправили что-то вроде строки GET /path/to/a/file HTTP/1.1, которая является действительной командой HTTP 1.1 и выглядит так же, как запрос, который будет отправлен веб-браузером, поэтому она работает нормально.

Михаил Мрозек
источник
1
telnet является протокол RFC 854 . Просто обычные telnetклиенты не пытаются использовать telnetпротокол, кроме как при подключении к tcp/21. Со страницы man: «При подключении к портам, отличным от порта telnet, telnet не пытается согласовать протокол telnet. Это позволяет подключаться к службам, которые не поддерживают протокол telnet, без создания беспорядка. Согласование протокола может быть вызвано поставить тире перед номером порта. "
user4556274