
Всем привет, меня зовут Олег Юрчик, я старший разработчик в Cloud.ru. Современный интернет — это не только IT-гиганты и готовые облачные сервисы. Под капотом глобальной сети скрываются базовые принципы, которые может воспроизвести любой технический специалист. В этой статье сначала вспомним, как появился Интернет и как он работает, а затем разберем, как создать его уменьшенную, но полностью управляемую копию с собственными DNS, центром сертификации и веб-сервисами.
Краткая история появления сети Интернет
История Интернета ведет отсчет с 1969 года, когда Агентство перспективных исследовательских проектов (ARPA) при Министерстве обороны США, занимавшееся высокотехнологичными военными разработками, создало сеть ARPANET. Первыми узлами этой сети стали Калифорнийский университет в Лос-Анджелесе (UCLA), Стэнфордский исследовательский институт (SRI), Калифорнийский университет в Санта-Барбаре (UCSB) и Университет Юты.

Идея устойчивой децентрализованной сети, способной сохранять связь при повреждении отдельных участков, была разработана Полом Бараном и Дональдом Дэвисом. Ее устойчивость обеспечивала технология пакетной коммутации, которая разбивала данные на блоки и позволяла им самостоятельно находить путь к цели по любым доступным каналам. Ключевым принципом было равноправие всех узлов (peer-to-peer) — в сети не было главного центра, что и делало её такой живучей. В 1983 году принятие набора протоколов TCP/IP позволило объединять разные сети в единую «сеть сетей». Позднее, благодаря изобретению Всемирной паутины (WWW), Интернет стал общедоступным глобальным явлением.
Чем отличается интернет и Интернет?
Интернет с заглавной буквы — имя собственное, уникальное название глобальной сети, наследницы проекта ARPANET, которая объединяет компьютеры по всему миру с помощью стандартных протоколов (TCP/IP).
Со строчной буквы слово интернет стало нарицательным и описывает любую крупную сеть, построенную по аналогичным принципам — например, «внутренний интернет завода» (интранет) или «интернет вещей». Таким образом, «Интернет» — это одна конкретная всемирная сеть, а «интернет» — общий термин для технологии связи.

Основы работы сети интернет
При проектировании протоколов подключения и передачи информации в сети основной фокус был на задаче устойчивости сети в целом:
Как сохранить работоспособность сети, если один или несколько узлов сети будут недоступны (возможно, вообще уничтожены без возможности быстрого восстановления)?
Как снизить затраты на передачу данных по сети в условиях ограниченного количества физических каналов связи?
Как сделать так, чтобы различные ЭВМ могли быть полноценной частью сети (универсальный язык общения, протокол)?
Как в процессе изменения сети сделать так, чтобы пакеты не терялись и доходили до адресата?
Как гарантировать, что данные будут доставлены полностью и без искажений в различных физических каналах связи?
В процессе решения этих вопросов был создан набор протоколов TCP/IP, следуя которым любой компьютер мог быть подключен к сети. При этом при передачи данных у пакета нет заранее проложенного маршрута. Каждый узел сети, через который проходит трафик, основываясь на своей актуальной таблице маршрутов, определяет следующий кратчайший доступный путь к адресату. Если какой-либо узел на первоначальном пути отключается, это обнаруживается сразу и пакеты перенаправляются по обходному маршруту (если таковой имеется), обеспечивая доставку даже в условиях изменяющейся конфигурации сети.
Подробнее о работе сети Интернет можно посмотреть видео от AlekOS.

Такая отказоустойчивость заложила в основу сети принцип равноправия: влияние узла определялось не его статусом, а количеством связей с другими узлами. Каждый участник сети получил возможность не только отправлять и получать данные, но и быть ретранслятором для чужих сообщений.
Со времен создания протоколов TCP/IP более 50 лет назад, интернет, который мы знаем сейчас... фундаментально не изменился. Понимание принципов работы технологии — ключ к созданию собственной сети. Децентрализация, отказоустойчивость и равноправие узлов, заложенные в ARPANET, мы можем воплотить на практике сегодня. Давайте посмотрим, как устроен современный интернет, а затем создадим свой собственный «суверенный» сегмент, следуя тем же фундаментальным идеям.
Посмотреть, как сеть охватывала новые территории можно на этом сайте.
Какой интернет сейчас?
Большую часть времени в сети мы проводим внутри экосистем IT-гигантов: почта Google, соцсети VK и Telegram, облачные хранилища. Эти платформы монополизируют наше внимание. В противовес этому, ресурсы, созданные и поддерживаемые небольшими командами или даже одиночками, оказываются на периферии нашего цифрового опыта. Столкновение с ними стало редкостью, что наглядно показывает, куда сместился центр тяжести всемирной сети.

Карту Интернета можно посмотреть на этом сайте.
Означает ли это, что в интернете не осталось места для личных страниц и тематических форумов? Безусловно, осталось. Однако технический порог входа серьезно возрос. Если раньше для публикации сайта было достаточно иметь выход в интернет и запущенный веб-сервер вроде Apache, то сегодня к этому добавился целый ряд обязательных этапов. Сам принцип остался прежним, но путь от идеи до работающего ресурса стал сложнее и требует больше подготовительных шагов.
Основные требования к запуску своего сервиса в интернете
Что требуется для запуска интернет-сервиса сегодня:
Постоянный канал связи: необходимо гарантированное интернет-подключение с достаточной пропускной способностью и стабильностью.
Статический IP-адрес: из-за ограниченности IPv4-адресов провайдеры выдают их как отдельную платную услугу, часто недоступную для частных лиц.
Доменное имя: это обязательный элемент — пользователи не будут запоминать цифровые адреса.
TLS-сертификат: cовременные браузеры блокируют сайты без HTTPS. Сертификат подтверждает подлинность домена и шифрует соединение, защищая от перехвата данных.
К счастью, появились сервисы, которые берут эти задачи на себя:
Хостинг-провайдеры: предоставляют готовую инфраструктуру: серверы, каналы связи и статические IP-адреса.
Доменные регистраторы: позволяют закрепить за собой доменное имя на нужный срок.
Центры сертификации: выпускают TLS-сертификаты. Let's Encrypt предлагает полностью бесплатное решение с автоматическим обновлением каждые 90 дней.
Но что будет, если, например, DNS станет недоступен? Или центр авторизации отзовет сертификаты? В этой ситуации придется срочно искать альтернативы, скорее всего будет явный даунтайм всего сервиса и частичная недоступность для некоторых пользователей из-за кеширования.
Именно по этой причине, например, важные инфраструктурные системы, такие как Сбер, предлагают установку корневых сертификатов от Минцифры, чтобы в критической ситуации вам все равно были доступны эти сервисы без рисков компрометации информации.

Насколько безопасно устанавливать сертификат Минцифры РФ
Установка корневого сертификата Минцифры РФ сама по себе не означает возможность прямого «чтения» всего HTTPS-трафика, однако создает для этого серьезные предпосылки. Главная опасность заключается в том, что этот центр сертификации может выпускать поддельные, но технически доверенные браузерами сертификаты для любых интернет-ресурсов. В сочетании с контролем Роскомнадзора над операторами связи, который позволяет незаметно перенаправлять трафик пользователей через прокси-серверы, создаются условия для проведения атаки «человек посередине». Таким образом, основная угроза — не прямое дешифрование, а возможность тотального мониторинга и модификации трафика под видом легитимных сайтов. Реализация такой системы технически возможна для государственных структур, но требует развертывания сложной инфраструктуры.
Свой суверенный интернет

Можно ли стать полноправной частью сети без зависимости от провайдеров, хостингов, DNS и центров сертификации? Или наоборот, построить свой изолированный аналог всемирной паутины? Конечно можно (но частично), и сейчас я расскажу, как это сделать.
К сожалению, отказаться от интернет-провайдера вам не удастся. Точнее, теоретически это возможно, но для этого вам надо самим стать провайдером, а это крайне сложная задача.
Вот «простой» гайд, как стать интернет-провайдером.
Также дополнительные сложности может создать попытка получить статический IP-адрес. Лично мне очень везет по жизни и каждый провайдер готов предоставить мне статический IPv4-адрес за 100-200 рублей в месяц, но у моих знакомых и коллег часто были проблемы с получением такой услуги. Самый простой вариант — арендовать адрес у облачного провайдера или хостинга, где он будет стоить примерно таких же денег. Например, в Cloud.ru есть возможность получить бесплатную виртуальную машину и арендовать для нее публичный IP-адрес за 149 рублей в месяц.
Но вот самому зарегистрировать себе домен и выпускать сертификаты под него — вполне возможно. Для начала давайте попробуем установить DNS.
На сервере желательно установить Ubuntu Server — так вы можете быть уверены, что все команды и конфигурации из статьи будут работать. Также все сервисы для простоты будем поднимать через Docker, как его установить — можно прочесть здесь.
Заранее подготовим файл .env с переменными окружения, в которых укажем:
# Домен сервера
DOMAIN=example.com
# IP адрес сервера
PUBLIC_IP=123.45.67.89
# Имя центра авторизации
CA_NAME="My CA"
# Пароль центра авторизации
CA_PASSWORD=P@ssw0rd
# Email администратора
ADMIN_EMAIL=admin@example.com
Установка DNS
DNS (Domain Name System) — это «адресная книга» интернета. Когда вы вводите название сайта (например, google.com) в браузере, DNS преобразует это понятное человеку имя в числовой IP-адрес (например, 142.250.185.78), который компьютеры используют для поиска друг друга в сети. Без этой системы нам пришлось бы запоминать длинные последовательности цифр для посещения любых сайтов.
Перед развертыванием собственного DNS-сервера в Ubuntu необходимо освободить порт 53, занятый встроенной службой systemd-resolved. Эта служба обеспечивает кеширование DNS-запросов для всей системы, поэтому ее отключение без готовой замены приведет к потере доступа в интернет.
Внимание: Следующие ниже команды, особенно касающиеся отключения systemd-resolved, выполняются только на тестовом сервере или в виртуальной машине. Их выполнение на рабочей машине может привести к потере доступа в интернет.
# Останавливаем и отключаем встроенный DNS-резолвер
systemctl disable --now systemd-resolved
# Заменяем конфигурацию DNS на локальный сервер
rm /etc/resolv.conf
tee /etc/resolv.conf > /dev/null <<EOF
nameserver 127.0.0.1
search lan
EOF
Теперь можно приступить к развертыванию собственного DNS-сервера. Для начала создадим в Docker общую сеть, чтобы обеспечить взаимодействие между контейнерами независимо от способа их развертывания:
docker network create internet
Также нам пригодятся общие volumes, чтобы между контейнерами можно было обмениваться файлами:
docker volume create ca-certificates-data
Создадим конфигурационный файл dns.yaml для развертывания DNS-сервера на основе dnsmasq. Вместо стандартного подхода с конфигурационным файлом dnsmasq.conf все настройки передаются через аргументы командной строки, что обеспечивает централизованное и прозрачное управление конфигурацией.
version: "3.8"
services:
app:
image: andyshinn/dnsmasq:2.83
hostname: dns.${DOMAIN}
networks:
- internet
ports:
- "53:53/udp"
- "53:53/tcp"
command:
- "--domain-needed"
- "--bogus-priv"
- "--expand-hosts"
- "--server=1.1.1.1"
- "--server=8.8.8.8"
- "--address=/.${DOMAIN}/${PUBLIC_IP}"
networks:
internet:
external: true
Конфигурация открывает порты 53 TCP/UDP для DNS-запросов и использует созданную ранее сеть internet. Ключевая опция address сопоставляет все поддомены указанного домена (${DOMAIN}) с IP-адресом ${PUBLIC_IP}, обеспечивая перенаправление DNS-запросов.
Запустим DNS с помощью команды:
docker compose -f dns.yaml up
Установка центра сертификации
Центр сертификации (Certificate Authority, CA) — это доверенная организация, которая выполняет роль «цифрового нотариуса» в интернете. Его основная задача — подтверждать подлинность владельцев сайтов и выпускать для них цифровые TLS-сертификаты. Когда вы видите замок рядом с адресом сайта в браузере, это означает, что центр сертификации проверил этот сайт и гарантирует, что соединение с ним зашифровано, а данные передаются именно на нужный сервер, а не злоумышленнику. Таким образом, CA формируют основу системы доверия в сети, позволяя браузерам и пользователям безопасно обмениваться информацией.
В качестве центра сертификации мы будем использовать step-ca - легковесный и простой в установке и настройки сервис для выпуска TLS-сертификатов.
Создадим файл ca.yaml с содержимым:
version: "3.8"
services:
app:
image: smallstep/step-ca:0.28.4
hostname: ca.${DOMAIN}
dns:
- dns
environment:
DOCKER_STEPCA_INIT_NAME: ${CA_NAME}
DOCKER_STEPCA_INIT_DNS_NAMES: ca.${DOMAIN}
DOCKER_STEPCA_INIT_PASSWORD: ${CA_PASSWORD}
DOCKER_STEPCA_INIT_ACME: "true"
networks:
- internet
volumes:
- ca-certificates-data:/home/step
volumes:
ca-certificates-data:
external: true
networks:
internet:
external: true
Так же запустим его с помощью команды:
docker compose -f ca.yaml up
Установка пользовательских сервисов
Теперь, когда настроены DNS и центр сертификации, можно развернуть веб-сервис с SSL-сертификатом от нашего CA. В качестве примера используем OpenSpeedTest — сервис для проверки скорости интернета. Для начала настроим обратный прокси на Traefik, создав файл gateway.yaml:
version: "3.8"
services:
app:
image: traefik:v3.5
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- app-certificates-data:/certificates
- ca-certificates-data:/ca:ro
networks:
- internet
ports:
- 80:80
- 443:443
entrypoint:
- "/bin/sh"
- "-c"
- |
cp /ca/certs/root_ca.crt /usr/local/share/ca-certificates/ca-root.crt &&
chmod 644 /usr/local/share/ca-certificates/ca-root.crt &&
update-ca-certificates &&
exec traefik "$@"
command:
- "--log.level=INFO"
- "--providers.docker=true"
- "--providers.docker.network=internet"
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true"
"--entrypoints.websecure.address=:443"
- "--certificatesresolvers.ca.acme.httpchallenge=true"
- "--certificatesresolvers.ca.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.ca.acme.email=${ADMIN_EMAIL}"
- "--certificatesresolvers.ca.acme.storage=/certificates/ca-acme.json"
- "--certificatesresolvers.ca.acme.caserver=https://ca.${DOMAIN}:9000/acme/acme/directory"
- "--serversTransport.rootCAs=/ca/certs/root_ca.crt"
volumes:
ca-certificates-data:
external: true
networks:
internet:
external: true
Ключевые элементы конфигурации:
Volumes: Монтирование директории центра сертификации для доступа к корневому сертификату
Entrypoint: Установка корневого сертификата в систему перед запуском Traefik
Docker Provider: Настройка автоматического обнаружения сервисов в сети
internetHTTP→HTTPS: Автоматическое перенаправление с порта 80 на 443
Certificate Resolver: Интеграция с нашим центром сертификации через ACME-протокол для автоматического выпуска TLS-сертификатов
Запускаем сервис привычной командой
docker compose -f gateway.yaml up
Добавим конфигурацию сервиса OpenSpeedTest в файле speed.yaml
version: "3.8"
services:
app:
image: openspeedtest/latest:v0.0.1
networks:
- internet
labels:
- "traefik.enable=true"
- "traefik.docker.network=internet"
- "traefik.http.services.openspeedtest-app.loadbalancer.server.port=3000"
- "traefik.http.routers.openspeedtest-app.rule=Host(`speed.${DOMAIN}`)"
- "traefik.http.routers.openspeedtest-app.entrypoints=websecure"
- "traefik.http.routers.openspeedtest-app.service=openspeedtest-app"
- "traefik.http.routers.openspeedtest-app.tls.certresolver=ca"
networks:
internet:
external: true
Запустим:
docker compose -f speed.yaml up
Настройка клиента
Отлично, сторона сервера настроена. Теперь нужно сделать так, чтобы клиент (компьютер или мобильный телефон) могли использовать ваш DNS и поддерживали сертификаты, выпущенные вашим CA.
Чтобы использовать собственный DNS-сервер на компьютере, необходимо изменить настройки сетевого подключения.
В Windows это делается через «Параметры сети» → «Настройка параметров адаптера», где в свойствах IPv4 нужно указать предпочитаемый и альтернативный DNS-адреса.
В Linux/MacOS редактируется файл
/etc/resolv.conf, где указывается директиваnameserverс IP-адресом вашего DNS. Для надежности рекомендуется прописать основной и резервный DNS-серверы (например, 1.1.1.1 и 8.8.8.8), чтобы сохранить доступ к интернету при сбое вашего сервера.
Теперь, переходя по домену speed.${DOMAIN}, вы фактически соединяетесь с приложением OpenSpeedTest, но получаете предупреждение сообщение о том, что сертификат невалиден и невозможно попасть на сайт.

Так и должно быть. Браузер блокирует запрос, так как не распознаёт сертификат. Для того, чтобы браузер стал доверять сайту, надо добавить корневой сертификат центра сертификации в систему. Находится он в volume центра сертификации по пути /home/step/certs/root_ca.crt
Выгрузите его из контейнера:
docker cp ca-app-1:/home/step/certs/root_ca.crt ~/root_ca.crt
Теперь загрузите его на свой компьютер и установите.
В Windows и MacOS для установки сертификата нужно открыть файл crt и следовать инструкциям программы.
В Linux надо от имени суперпользователя (или через sudo) выполнить следующие команды:
Для Debian
sudo cp root_ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
Для RHEL/CentOS:
sudo cp root_ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
Итог
Поздравляю! Вы только что создали «островок» в сети, который полностью подконтролен вам. Ваши внутренние сервисы не зависят от блокировок публичных DNS, отзывов сертификатов глобальными CA или политик IT-гигантов. Этот небольшой эксперимент наглядно показывает, как работает интернет «под капотом», возможно даже вы используете это в работе или личных проектах. Весь указанный выше код можно также скачать из репозитория.
Что у нас получилось:
Собственный DNS-сервер, который мы контролируем.
Собственный Центр Сертификации, выпускающий доверенные для нас TLS-сертификаты.
Обратный прокси-сервер (Traefik), который автоматически управляет сертификатами и маршрутизацией.
Рабочий веб-сервис (OpenSpeedTest), доступный по HTTPS с нашим сертификатом.
Эта статья — лишь один из подходов. Наверняка у кого-то из читателей уже работает кластер на Raspberry Pi с собственным DNS и CA. Если вы из таких — поделитесь в комментариях, с какими сложностями столкнулись и какой стек технологий используете.
ki11j0y
Почти, держать уц на сервере так себе решение, лучшим решением будет держать бд уц у себя, выписывать сертификаты или wildcard на сервис, выстроить полноценную цепочку, root > sub > fqdn.crt, использовать crl списки, сроки любые год, два, три и тд. Я пользуюсь для этого XCA и OpenVPN веду там в другом sub, а дальше просто подключаешь сертификат как обычно, маршрутизация и все работает. Для сертификатов сайта кривая prime256v1 для openvpn secp384r1.
На примере mTLS будет не сложно выпустить для сайта https://habr.com/ru/articles/904038/