Виталий Лещенко

Сети для самых маленьких. Часть 4: PPPoE

В первой части канальный уровень был просто «доставить соседу», во второй и третьей мы увидели, как это делают Ethernet и Wi-Fi. Сегодня — протокол, который сидит между Ethernet и IP и встречается почти в каждом домашнем роутере: PPPoE, Point-to-Point Protocol over Ethernet. В настройках роутера это тот самый пункт «Тип подключения: PPPoE», рядом с которым вводят логин и пароль от провайдера.

Чтобы понять PPPoE, нужно понять две вещи: что такое PPP и зачем его понадобилось заворачивать в Ethernet.


Читать дальше
Виталий Лещенко

Сети для самых маленьких. Часть 3: Wi-Fi

Во второй части мы разобрали Ethernet: кадр, MAC-адреса, коммутатор. Для операционной системы Wi-Fi выглядит так же: интерфейс wlan0 с MAC-адресом, те же IP-пакеты внутри, тот же MTU 1500. Точка доступа — это коммутатор, у которого часть портов радио. Но внутри Wi-Fi устроен совсем иначе, и почти все его странности — «иногда тормозит», «один сосед кладёт всю сеть», «ноутбук держится за дальнюю точку» — следуют из физики радио. Разберём, как семейство стандартов IEEE 802.11 с этой физикой справляется.


Чем радио отличается от кабеля

Читать дальше
Виталий Лещенко

Сети для самых маленьких. Часть 2: Ethernet

В первой части мы разобрали, что сетевой стек — матрёшка из заголовков, и что самый внешний слой в ней, канальный, доставляет данные соседу по кабелю. Сегодня — о самом распространённом канальном протоколе: Ethernet. По нему работают и домашняя розетка, и порт коммутатора в стойке, и 400-гигабитные линки между дата-центрами, и даже Wi-Fi притворяется им перед операционной системой.

Ethernet придумал Роберт Меткалф в Xerox PARC в 1973 году для сети из одного толстого коаксиального кабеля, к которому подключались все машины офиса. С тех пор сменилось всё: кабель, скорость, топология, электроника. Не изменился только формат кадра, и это самое поучительное в его истории.


Читать дальше
Виталий Лещенко

Сети для самых маленьких. Часть 1: модели OSI и TCP/IP

Это первая статья серии «Сети для самых маленьких». «Для самых маленьких» — не про возраст читателя, а про точку старта: рассказывать буду с нуля и не буду предполагать ничего, кроме умения открыть терминал. Серия для тех, кто пишет программы, администрирует серверы или просто хочет понять, что происходит между нажатием Enter в адресной строке и появлением страницы.

У серии один принцип: о каждом протоколе — не только зачем он нужен, но и как он работает. Какие байты идут по проводу, кто на них отвечает, что происходит, когда что-то ломается. Поэтому почти в каждой части будут заголовки пакетов, команды и вывод tcpdump. Чтобы повторять примеры, хватит любой Linux-машины (подойдёт и WSL) с установленным tcpdump и Wireshark на рабочем компьютере.

План такой: сначала основа — модели, Ethernet, Wi-Fi и PPPoE; затем IPv4 с ARP и ICMP; транспорт — UDP и TCP; служебные протоколы DHCP и DNS; отдельным блоком IPv6 с Neighbor Discovery, SLAAC и DHCPv6; в конце — VLAN, VXLAN, IPsec с IKEv2 и разговор о том, чем VPN отличается от прокси. Статьи выходят по одной, и в конце каждой написано, что будет в следующей.

Читать дальше
Виталий Лещенко

Бэкапы PostgreSQL из Kubernetes в Object Storage: без CSI, с ключом, который не умеет удалять

В серии про отказоустойчивый Kubernetes на BGP я ни слова не сказал о бэкапах. Исправляюсь. В этой статье — как ночной pg_dump из кластера попадает в закрытый бакет Yandex Object Storage, почему я не стал монтировать бакет через CSI, какие права нужны ключу и на какие грабли я наступил с политикой бакета.

Всё ниже я сделал для двух сервисов, у каждого из которых своё облако и свой бакет. Поэтому схема с самого начала рассчитана на то, что никакого общего ключа «на всё» нет.


Читать дальше
Виталий Лещенко

Секреты в git: sops и age с мастер-ключом в Yandex Cloud KMS или на парольной фразе

Секреты проекта — пароль базы, ключи подписи токенов, секреты OAuth-клиентов, SMTP — хочется держать рядом с кодом: в том же репозитории, с той же историей, в тех же ветках. Но в открытом виде им в git не место. В этой статье — схема, которой я пользуюсь для блога: файлы с секретами лежат в репозитории зашифрованными sops на ключе age, а сам ключ age хранится там же, зашифрованный мастер-ключом. Разберу два варианта мастер-ключа — в Yandex Cloud KMS и без облака, на парольной фразе, — а в конце пройдусь по альтернативам: Google Cloud, AWS, Azure, Vault, аппаратные ключи.

Инструменты

sops (Secrets OPerationS) шифрует не файл целиком, а значения в нём. Ключи YAML, JSON, .env остаются открытыми, и в git diff видно, какой секрет изменился, хотя и не видно, на что. Вот фрагмент зашифрованных значений чарта блога, как он лежит в git:

Читать дальше
Виталий Лещенко

Свой MCP-сервер для блога: сервер авторизации, API и инструменты для модели

У блога появился MCP-сервер: ИИ-ассистент теперь может читать посты, писать черновики, отвечать на комментарии и модерировать — от имени вошедшего пользователя и в пределах его прав. В этой статье я расскажу, как он устроен: что нужно, чтобы ИИ-клиент мог работать с вашим приложением от имени пользователя, как проходит подключение на уровне протокола, и какие API стоит выносить в инструменты, а какие — нет.

Зачем блогу MCP

MCP (Model Context Protocol) — протокол, по которому ИИ-клиент (Claude Code, claude.ai, Cursor и другие) вызывает инструменты внешнего сервера. Сервер описывает инструменты схемой, модель выбирает подходящий и вызывает его с параметрами, результат возвращается в контекст модели. Транспорт для удалённых серверов — Streamable HTTP: обычные POST-запросы с JSON-RPC внутри.

Читать дальше
Виталий Лещенко

Отказоустойчивый Kubernetes на BGP. Часть 8: проверка отказоустойчивости и разбор полётов

Всё построено, пора проверить на прочность. В этой части — какие отказы кто и за какое время замечает, как их воспроизвести, шпаргалка по диагностике BGP и правила обслуживания, которые я вывел из собственных ошибок.

Серия «Отказоустойчивый Kubernetes на BGP»

  1. Схема и план
  2. Готовим узлы Ubuntu 24.04
  3. BGP на роутере (FRR)
  4. kube-vip в режиме BGP и первый мастер
  5. Calico с eBPF и рабочие узлы
  6. Адреса LoadBalancer из Calico по BGP
  7. Traefik за BGP и externalTrafficPolicy Local
  8. Проверка отказоустойчивости и разбор полётов (эта статья)
Читать дальше
Виталий Лещенко

Отказоустойчивый Kubernetes на BGP. Часть 7: Traefik за BGP и externalTrafficPolicy Local

Механизм адресов готов. Осталось повесить на него нагрузку, ради которой всё затевалось: входящий HTTP(S)-трафик. В этой части ставим Traefik и разбираемся, почему для него важна одна строка — externalTrafficPolicy: Local.

Серия «Отказоустойчивый Kubernetes на BGP»

  1. Схема и план
  2. Готовим узлы Ubuntu 24.04
  3. BGP на роутере (FRR)
  4. kube-vip в режиме BGP и первый мастер
  5. Calico с eBPF и рабочие узлы
  6. Адреса LoadBalancer из Calico по BGP
  7. Traefik за BGP и externalTrafficPolicy Local (эта статья)
  8. Проверка отказоустойчивости и разбор полётов
Читать дальше
Виталий Лещенко

Отказоустойчивый Kubernetes на BGP. Часть 6: адреса LoadBalancer из Calico по BGP

Кластер работает, API отказоустойчив. Теперь научим Calico выдавать адреса сервисам type: LoadBalancer и анонсировать их роутеру. Отдельный MetalLB не нужен: Calico умеет и то, и другое.

Серия «Отказоустойчивый Kubernetes на BGP»

  1. Схема и план
  2. Готовим узлы Ubuntu 24.04
  3. BGP на роутере (FRR)
  4. kube-vip в режиме BGP и первый мастер
  5. Calico с eBPF и рабочие узлы
  6. Адреса LoadBalancer из Calico по BGP (эта статья)
  7. Traefik за BGP и externalTrafficPolicy Local
  8. Проверка отказоустойчивости и разбор полётов
Читать дальше