В 1995 году Тату Илонен написал письмо длиной с пост на Хабре и бесплатно получил номер ssh -p 22 user@host, который теперь знает каждый сисадмин. Но до этого порты были однонаправленными, чётные номера считались ненужными, а половина слотов вообще пустовала. О том, как порты стали «дверями» в сервер и что останется от них через десять лет, рассказал в статье. 

Когда порты умели только слушать 

В начале 1970-х ARPANET был в зачатках, TCP ещё не существовал, а единственным протоколом передачи данных был однонаправленный Network Control Protocol (NCP). Но для полноценного обмена данными нужно было два соединения — одно туда, другое обратно, поэтому инженеры разделили номера на нечётные для исходящего трафика и чётные для входящего. 

В итоге Telnet получил 1, FTP — 3, Echo — 7, а Discard — 9. Все ключевые сервисы были на нечётных числах, потому что чётные стали зеркальными половинками для обратного канала. Гомосокетальность в прямом смысле была запрещена на уровне протокола. 

Кроме того, на тот момент было всего 256 портов, и всем тогда казалось, что этого хватит навсегда.

Кстати, порт 0 технически существует, но в заголовке TCP он означает динамическое назначение, а в сокетах Беркли sin_port = 0 при bind() говорит ядру выбрать самому. 

Джон Постел и книга всех номеров

В мае 1972 года аспирант UCLA по имени Джон Постел написал RFC 349 — документ, который по последствиям сопоставим с изобретением колеса. Он предложил назначить «царя», который будет выдавать официальные сокетные номера и вести список, и мягко намекнул, что этим «царём» мог бы быть он. К слову, «царь» — это не моё художество, так серьёзно было написано в документе (он ниже). 

Так Постел стал «царём интернета». Он редактировал RFC 791, 792, 793 (IP, ICMP и TCP), а также вёл Assigned Numbers — периодически обновляемый документ, который для сетевых инженеров того времени был важнее телефонной книги.  

Когда Тим Бернерс-Ли в январе 1992 года написал, что хочет HTTP на порту 80, Постел одобрил ему эту просьбу в тот же день. В исходниках первого в мире веб-браузера до сих пор стоит комментарий, что порт выделен Джоном Постелем 24 января 1992 года.

Постел работал по принципу, который позже назовут Robustness Principle — «Будь консервативен в том, что отправляешь, и либерален в том, что принимаешь». Это, по его мнению, касалось и протоколов, и людей. Он выдавал порты быстро, без бюрократии, почти по одному email, потому что понимал, что интернет растёт, и тормозить его рост нельзя. 

Билл Джой и сокеты Беркли

Примерно в это же время в Беркли (нежелательная организация в РФ) американский программист Билл Джой работал над версией 4.2 операционки BSD. Для того чтобы ускорить разработку, DARPA, финансирующая разработку, поручила написание стека TCP/IP компании BBN. Однако их код еле-еле тянул 50 кбит/с, поэтому Джой переделал всё сам. 

Когда BBN прислала новую официальную версию, Джой отказался её принимать, ведь у Беркли уже был стек, который летал на 3 Мбит/с. Позже на совещании он сказал, что всё очень просто — читаешь протокол и пишешь код.

В 4.2 BSD, выпущенной уже в августе 1983 года, появился Berkeley sockets API (сокеты Беркли): socket(), bind(), listen() и accept(). Джой интегрировал сокеты с файловыми дескрипторами Unix, и сокет стал файлом, порт — его адресом, а системный вызов — рукояткой той самой «двери» порта. 

Время шло, и 1 января 1983 года ARPANET отключил NCP и перешёл на TCP/IP. Новый протокол был двухсторонним, поэтому чётные порты практически мгновенно потеряли смысл. 2, 4, 6, 8, 10, 12 и дальше по списку остались зарезервированными, но никогда не использованными слотами. 

Теперь уже «бесконечными» стали шестнадцать бит адресного пространства, то есть 65536 портов. Однако сегодня и этот диапазон периодически заканчивается даже на вполне обычных серверах.

Как получить порт за один день

Даже после перехода на TCP/IP Telnet передавал пароли открытым текстом, rlogin доверял практически всем IP-адресам, а FTP требовал отдельного канала, который файрволы с радостью дропали. Нужен был новый протокол… И вот весной 1995 года финский исследователь Тату Илонен закончил свою программу для безопасного удалённого доступа — Secure Shell, в простонародье SSH. Для этого протокола нужен был порт. 

10 июля 1995 года, в 11:45 по хельсинкскому времени, Илонен отправил письмо в IANA. В нём он написал, что разработал программу для безопасного удалённого входа через недоверенные сети. Илонен отметил, что планирует распространять SSH бесплатно и просит выделить ему зарегистрированный привилегированный порт, желательно в диапазоне 1–255, чтобы сервис можно было корректно указывать в WKS-записях DNS. 

Кроме того, в сообщении была отметка о том, что во время бета-тестирования SSH уже использовал порт 22, который тогда числился как «неназначенный», и разработчик попросил закрепить именно его. 

В тот же день, в 15:35 по тихоокеанскому времени, ему пришёл ответ от Джойс К. Рейнольдс из IANA:  

Небольшое письмо Илонена помогло официально закрепить 22 порт за SSH. 

Как порты стали маской

IPv4-адреса заканчивались быстрее, чем предполагали инженеры, нужно было новое решение. Оно нашлось в 1994 году, когда рабочая группа IETF выпустила RFC 1631, описав NAT — механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов. С этого времени порт перестал быть просто адресом сервиса внутри машины, он стал ещё и идентификатором конкретного клиента за роутером. 

Два года спустя, в 1996 году, появилась технология PAT. Роутер начал переписывать source port у исходящих соединений, и сотни устройств в офисе могли работать через один внешний адрес одновременно. 

Это работало настолько хорошо, что интернет по сути забросил end-to-end принцип, ведь узел за NAT стал недостижим извне без заранее созданного правила проброса. 

Контейнеры добавили ещё один слой. Например, хостовый 8080 проксируется во внутренний 80 контейнера, но в ядре находятся всё те же хеш-таблицы, всё тот же tcp_v4_rcv() и всё те же 16 бит. Именно поэтому порты до сих пор остаются «дверями».

Когда у «дверей» проверяют «замки»

Если порт — это «дверь», то рано или поздно кто-то начнёт стучать во все подряд. Так, в сентябре 1996 года провайдер PANIX из Нью-Йорка обнаружил, что его почтовые серверы перестали отвечать из-за того, что кто-то слал поток SYN-пакетов, заполняя очередь полуоткрытых соединений. Это была одна из первых SYN flood-атак, которая привлекла внимание CERT.

После этой атаки группа сетевых экспертов выпустила бюллетень с рекомендацией фильтровать спуфленный трафик, однако механизма защиты тогда ещё не существовало, и никто не знал, как это делать. Проблема заключалась в самом TCP — сервер выделял ресурсы под каждое входящее SYN-соединение ещё до завершения рукопожатия. Именно это и позволяло SYN-атакам быстро забивать очередь полуоткрытых соединений.

Однако решения не пришлось долго ждать. Через неделю после атаки на PANIX Дэниел Бернштейн и Эрик Шенк предложили механизм SYN cookies. По нему, вместо того чтобы выделять память и создавать запись о полуоткрытом соединении для каждого SYN-пакета, сервер кодировал параметры соединения в TCP sequence number и отправлял клиенту SYN-ACK без сохранения состояния. 

Если клиент настоящий, он отвечал корректным ACK, после чего ядро восстанавливало состояние соединения. Если SYN был подделан или отправлен ботом, ответ не приходил, а значит, сервер не тратил ресурсы впустую.

Год спустя, в 1997-м, Гордон Лайон под псевдонимом Фёдор Васкович (отсылка к Достоевскому) выпустил Nmap — инструмент, который автоматизировал сетевую разведку. Этот сканер отправлял пакеты на разные порты и по ответам определял, какие сервисы доступны извне. 

Позже Nmap научился определять операционные системы по особенностям TCP/IP-стека, распознавать версии сервисов по баннерам и сигнатурам, а также обходить часть фильтрации через нестандартные техники сканирования и фрагментацию пакетов.

К слову, в «Матрице: Перезагрузке» Тринити использует Nmap, находит открытый SSH на 22-м порту SCADA-системы и подключается к ней — это один из немногих технически правдоподобных моментов в голливудском кино. 

Уже тогда всем было понятно, что открытый порт — это потенциальная точка атаки, поэтому сисадмины начали массово переносить SSH с 22-го порта на нестандартные, снижая поток автоматических сканирований и брутфорса.

Однако и тут есть нюансы. Например, если перенести SSH, например, на 2222-й порт (зарегистрирован для Ethernet/IP-1), сервис окажется в диапазоне registered ports 1024–49151, где часть номеров уже закреплена за другими протоколами. Обычно это не создаёт проблем, но в корпоративных сетях возможны коллизии и вопросы от безопасников.

Что останется от «дверей»

Каждая инфраструктурная абстракция, которую инженеры считают вечной, рано или поздно превращается в деталь реализации. IP-адреса спрятались за DNS, диски — за volume managers, а порты постепенно растворяются в service discovery, mesh-сетях и бессерверке. Но до сих пор, когда что-то ломается, сисадмин открывает терминал и пишет ssh -p 22 или netstat -tlnp, чтобы проверить, кто занял восьмидесятый, или nmap -p-, чтобы убедиться, что предыдущий админ не оставил открытых дверей. 

Порты пережили NCP, TCP/IP и NAT, ведь они до гениальности просты — 16 бит, 65536 значений, и вся сложность интернета укладывается в это число. Думаю, они продолжат жить и через десятки лет…

Сколько портов открыто на вашем сервере прямо сейчас? Делитесь в комментариях, будет интересно сравнить.

© 2026 ООО «МТ ФИНАНС»

Комментарии (22)


  1. fury21
    26.05.2026 14:52

    Спасибо, было интересно почитать


  1. Zazza
    26.05.2026 14:52

    До того, как кто-то решил, что 1194 порт это зло, у меня были открытыми только 80/443 и 1194. А уж внутри тонеля было куча портов, да.


  1. lazarus_net
    26.05.2026 14:52

    Уже тогда всем было понятно, что открытый порт — это потенциальная точка атаки, поэтому сисадмины начали массово переносить SSH с 22-го порта на нестандартные, снижая поток автоматических сканирований и брутфорса.

    Хотелось бы ссылку на источник. Перенос порта для ssh это Security throughobscurity


    1. ioannes
      26.05.2026 14:52

      Да, но работает.

      Помогает от коврового сканирования.


    1. benito03
      26.05.2026 14:52

      По моей практике, со сменой порта иногда заморачиваются чтобы снизить нагрузку со стороны low-effort брутфорс ботов, в сторону совсем небольших vm с внешним IP


    1. kenomimi
      26.05.2026 14:52

      В первую очередь перенос делается для закрытия от массовых сканеров. Перенос радикально уменьшает количество логов, что уменьшает количество записей аудита и нагрузку на аналитику системы безопасности. На 22 в день можно легко набрать пару миллионов записей на ноду, когда как на каком-нибудь 53090 записей ну пару сотен в день будет... Собственно, суть переноса в этом. Безопасности самому ssh перенос не добавляет.


    1. SrvTrantor Автор
      26.05.2026 14:52

      Смена порта была еще описана при публикации письма Тату тут. На хабре его активно обсуждали именно в контексте переноса порта. Почитать обсуждение можно тут.


  1. valvalva
    26.05.2026 14:52

    ss -pantu


  1. Kurochkin
    26.05.2026 14:52

    Czar в американском английском используется повсеместно, в значении "руководитель направления". CNN постоянно пишет border czar о главе соответствущего ведомства. Переводчику полагается знать такое (или найти и узнать)


    1. SrvTrantor Автор
      26.05.2026 14:52

      Спасибо за информацию, я никогда не задавался этим вопросом. Век живи — век учись)


  1. makarovpro
    26.05.2026 14:52

    Сегодня порты используют 16-битную адресацию: 2^16 = 65536 возможных значений (от нуля).

    Они делятся на три основные категории:

    0 — 1023: Системные или общеизвестные порты (например, 80 для HTTP, 443 для HTTPS).

    1024 — 49151: Зарегистрированные порты, используемые программами и играми.

    49152 — 65535: Динамические порты для временных соединений.


    1. vesper-bot
      26.05.2026 14:52

      Диапазон динамических портов OS specific, мало того настраивается отдельно (помню что в centos7 настраивал, и вроде в Windows натыкался на настройку). То есть категорий по факту две: 1-1023 привилегированные (“системные”, в некоторых ОС на открытие нужен root или явно прописанный манифест), 1024-65535 “обычные”, динамический диапазон просто болтается где-то как настройка.


    1. select26
      26.05.2026 14:52

      0 — 1023: Системные или общеизвестные порты

      это не просто системные или общеизвестые: в Unix-системах такой порт может слушать только сервис с UID 0 (root). Это часть политик безопасности. Хотя сейчас, с распространением контейнеров, не столь актуально.

      1024 — 49151: Зарегистрированные порты, используемые программами и играми.

      49152 — 65535: Динамические порты для временных соединений.

      Впервые за 25 лет слышу. Где можно ознакомиться с RFC?
      p.s. игры - не программы что ли?


      1. pae174
        26.05.2026 14:52

        RFC 6335


        1. select26
          26.05.2026 14:52

          Действительно!
          Век живи- век учись..


      1. selivanov_pavel
        26.05.2026 14:52

        Это часть политик безопасности. Хотя сейчас, с распространением контейнеров, не столь актуально.

        Да эта фигня вообще была актуальна только во времена ARPANET.

        Сейчас от неё один вред - почти никакой сервис не должен работать от рута, в итоге приходится морочится с capabilities или запускать софтину от рута и надеятся, что она сумеет грамотно сбросить привилегии.

        ИМХО всюду давно надо sysctl net.ipv4.ip_unprivileged_port_start=0


  1. vesper-bot
    26.05.2026 14:52

    Кстати, тема дверей не раскрыта - кто и когда назвал дополнительное поле в TCP/UDP “портом”? А почему “дверь” - по-латыни “porta” - дверь, и слово “порт” (морской, например) восходит как раз к нему. (Греческое “порта” тоже значит “дверь”, но происходит от латинского)


    1. funca
      26.05.2026 14:52

      Сетевая терминология идёт из телекомов, которые в свою очередь вдохновлялись сантехникой. В этом смысле порт это заглушка на конце трубы. В рабочем состоянии вместо него в сокет (муфту) вворачивают другую трубу и подают воду.


  1. Litemanager_soft
    26.05.2026 14:52

    Интересно)


  1. selivanov_pavel
    26.05.2026 14:52

    Даже не знал про тип DNS записей WKS. Сейчас для такого используют SRV.


  1. leslie500
    26.05.2026 14:52

    В 1972-1992, если у тебя был email, это уже было пропуском на получение номера порта)


  1. Miron_Nikolaevich
    26.05.2026 14:52

    Спасибо, было позновательно. Подписался и буду ждать новых интересных историй)