Личный суверенный интернет: самостоятельная настройка DNS, CA и TLS

Личный суверенный интернет: самостоятельная настройка DNS, CA и TLS
Собственный Интернет

Меня зовут Олег Юрчик, я — старший разработчик в компании Cloud.ru. Интернет сегодня — это не только крупные корпорации и облачные платформы. Под поверхностью глобальной сети скрыты базовые механизмы, которые вполне доступно воспроизвести на практике. В этой статье мы сначала кратко пройдёмся по истории и устройству Интернета, а затем шаг за шагом создадим собственную мини-сеть с собственными DNS-серверами, центром сертификации и веб-сервисами.

Происхождение сети Интернет

История Интернет уходит корнями в 1969 год, когда DARPA при Минобороны США запустила исследовательский проект ARPANET. Первые узлы сети располагались в университетах UCLA, UCSB, исследовательском центре SRI и Университете Юты. Идея децентрализованной системы с пакетной коммутацией была предложена Полом Бараном и Дональдом Дэвисом. Пакеты разбивались на мелкие фреймы, которые самостоятельно находили оптимальный маршрут до получателя. В 1983 году внедрение протоколов TCP/IP объединило разрозненные сети в единую «сеть сетей», а изобретение World Wide Web сделало её доступной широкой аудитории.

План сети ARPANET
Схема сети ARPANET
Разница между «интернет» и «Интернет»

Интернет (с заглавной) — это уникальная глобальная сеть, наследница ARPANET, объединяющая компьютеры по всему миру по стандартам TCP/IP.

интернет (со строчной) — общее название для любой большой сети, работающей по тем же принципам (например, «корпоративный интернет» или «интернет вещей»).

Пол Баран и Дональд Дэвис
Пол Баран и Дональд Дэвис

Принципы работы сети

Цели, стоявшие перед авторами протоколов TCP/IP:

  1. Обеспечить устойчивость сети при выходе узлов из строя.
  2. Рационально использовать ограниченные каналы связи.
  3. Гарантировать совместимость разных вычислительных систем.
  4. Сохранять целостность и доставляемость данных при изменении топологии.
  5. Обеспечить надёжную и корректную доставку пакетов.

Каждый пакет в TCP/IP не имеет фиксированного маршрута. Узлы принимают решение о следующей пересылке на основании локальных таблиц маршрутов. В случае отказа одного из узлов, пакеты перенаправляются по альтернативным путям, что обеспечивает высокую живучесть сети.

Для более глубокого понимания работы TCP/IP-стека рекомендуем посмотреть видео от AlekOS.

Стек протоколов TCP/IP
Стек протоколов TCP/IP

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

Наглядную динамику разрастания сети можно увидеть здесь.

Современный Интернет

Сейчас большинство пользователей проводят время в экосистемах крупных IT-компаний: почта Google, соцсети VK и Telegram, облачные хранилища. Малые проекты и независимые сайты отодвинулись на периферию, а порог для запуска собственного ресурса серьёзно вырос. Ранее достаточно было настроить веб-сервер Apache, а теперь необходим целый комплекс шагов для публикации надёжного и безопасного сервиса.

Карта интернета
Карта Интернета

Интерактивную карту сети смотрите на internet-map.net.

Что нужно для собственного сервиса

Для запуска сайта или веб-приложения сегодня необходимы:

  1. Надёжный канал связи с постоянной пропускной способностью.
  2. Статический IP-адрес, который провайдеры зачастую предлагают за дополнительную плату.
  3. Доменное имя, без которого пользователи запутаются в числовых адресах.
  4. TLS-сертификат для HTTPS — без него современные браузеры блокируют соединение.

Эти задачи берут на себя сторонние сервисы:

  1. Хостинг-провайдеры — предлагают серверы, каналы и IP-адреса «под ключ».
  2. Доменные регистраторы — регистрируют и продлевают домены.
  3. Центры сертификации — выпускают TLS-сертификаты (например, Let’s Encrypt предлагает бесплатные сертификаты с автопродлением).

Однако если глобальные DNS или CA окажутся недоступны, сервисы выйдут из строя или часть пользователей потеряет доступ из-за кэширования. Именно поэтому крупные организации устанавливают собственные корневые сертификаты, чтобы в критических ситуациях сохранять работоспособность сервисов без компромиссов.

Предложение об установке сертификата
Установка корневого сертификата
Безопасность корневого сертификата Минцифры

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

Создаём «суверенный» сегмент сети

Суверенный Интернет
Концепция суверенного Интернета

Можно ли обойтись без внешнего хостинга, DNS-регистраторов и публичных CA? Частично — да. Полностью стать собственным провайдером крайне сложно, но мы можем арендовать виртуальную машину с публичным IP, развернуть на ней собственные DNS и CA, а также прокси-сервер и приложение.

«Простой» гайд по тому, как стать интернет-провайдером, можно найти здесь.

Подготовка сервера

Рекомендуется использовать Ubuntu Server и Docker. Создайте файл .env:

# Домен
DOMAIN=example.com
# Публичный IP
PUBLIC_IP=123.45.67.89
# Название CA
CA_NAME="My CA"
# Пароль CA
CA_PASSWORD=P@ssw0rd
# E-mail админа
ADMIN_EMAIL=admin@example.com

1. Настройка DNS

DNS переводит доменные имена в IP-адреса.

Остановите systemd-resolved и замените /etc/resolv.conf:

systemctl disable --now systemd-resolved
rm /etc/resolv.conf
tee /etc/resolv.conf <<EOF
nameserver 127.0.0.1
search lan
EOF

Создайте сеть Docker и volume:

docker network create internet
docker volume create ca-certificates-data

Файл dns.yaml:

version: "3.8"
services:
  dnsmasq:
    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

Запуск:

docker compose -f dns.yaml up -d

2. Установка собственного CA

Центр сертификации выпускает TLS-сертификаты и формирует доверие в сети.

Файл ca.yaml:

version: "3.8"
services:
  step-ca:
    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 -d

3. Обратный прокси на Traefik

Файл gateway.yaml:

version: "3.8"
services:
  traefik:
    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.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

Запуск:

docker compose -f gateway.yaml up -d

4. Разворачиваем веб-сервис

В примере — OpenSpeedTest. Файл speed.yaml:

version: "3.8"
services:
  openspeedtest:
    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.tls.certresolver=ca"
networks:
  internet:
    external: true

Запуск:

docker compose -f speed.yaml up -d

5. Настройка клиента

Чтобы устройства использовали ваш DNS и CA:

  • В Windows — в свойствах адаптера IPv4 укажите ваш сервер в «Предпочитаемый DNS».
  • В Linux/MacOS — в /etc/resolv.conf добавьте строку nameserver IP_вашего_DNS, а в качестве резервного укажите, например, 1.1.1.1.

При первом заходе на https://speed.${DOMAIN} браузер выдаст предупреждение о недоверенном сертификате. Чтобы исправить это, скопируйте корневой сертификат из контейнера:

docker cp ca-step-ca-1:/home/step/certs/root_ca.crt ~/root_ca.crt

Установите сертификат в систему:

  • Windows/MacOS — откройте файл и следуйте подсказкам.
  • Debian/Ubuntu:
    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-серверами;
  • Центром сертификации;
  • Обратным прокси на Traefik;
  • Рабочим веб-сервисом с HTTPS.

Этот пример иллюстрирует принципы работы Интернета «под капотом» и показывает, как легко применить их в собственных проектах.

 

Источник

Читайте также