← КурсСамостоятельный просмотрПульт

Пара 7 / октябрь

Сеть: sockets, маршруты, Netfilter и Wi-Fi

Проверить путь HTTP-запроса и различать ошибки DNS, соединения и приложения.

Контекст

Локальный получатель, транзит и локальный отправитель имеют разные пути.

Проверить путь HTTP-запроса и различать ошибки DNS, соединения и приложения.

Адрес и порт

IP выбирает узел, порт — точку приёма на нём.

01IP узла
02Порт
03Сокет процесса
04Обработка

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

DNS и TCP

Имя сначала нужно разрешить, затем установить соединение.

01Имя
02DNS / адрес
03TCP / соединение
04HTTP

Аналогия: справочник может знать адрес магазина, даже если магазин закрыт.

HTTP — запрос и ответ

Статус, заголовки и тело дают разные доказательства.

01Метод + путь
02Заголовки
03Тело
04Статус + ответ

Аналогия: бланк заказа, служебная отметка и результат заказа.

Пакет проходит маршрутизацию и hooks Netfilter

Локальный получатель, транзит и локальный отправитель имеют разные пути.

Netfilter: входящий пакет идёт к локальному процессу или через маршрутизаторИнтерфейсВходящий IP-пакетPREROUTINGДо решения маршрутаRouting decisionЛокальный адрес или другой хостлокальноINPUTЛокальному socketтранзитFORWARDПередача дальшеPOSTROUTINGПосле маршрута, перед выходомЛокально созданные пакеты проходят OUTPUT. nft и iptables — интерфейсы настройки, не отдельные сетевые стеки.

Локальный HTTP-сервис нужен в INPUT-пути, router-трафик — в FORWARD. Адрес/порт приложения всё равно проверяются отдельно.

iptables и nftables — способы настроить правила

Важен реальный backend, а не только имя команды.

nftables и iptables работают с инфраструктурой Netfilter в ядреnftНативный nftables rulesetiptables-nftСовместимый CLI → nft backendiptables-legacyLegacy xtables backendNetfilter hooks в LinuxФильтрация / NAT / connection trackingНе смешиваем менеджеры правил без понимания backend. DROP отличается от REJECT; NAT не равен firewall.

Ubuntu: nft --version; iptables --version; sudo nft list ruleset — только чтение. WSL2 имеет также сетевые ограничения Windows-хоста.

wlo1 — имя интерфейса, managed — режим

Radio-возможности определяются PHY, драйвером и поддержанными сочетаниями.

Имя wlo1 не задаёт режим Wi-Fi: возможности определяют адаптер и драйверManaged / stationКлиент подключается к APAPТочка доступа для клиентовMonitorНаблюдение радио-кадровiw dev / iw listПроверяем interface type, supported modes, допустимые сочетания и возможности драйвераWSL2 обычно видит виртуальный Ethernet, а не Wi-Fi PHY ноутбука. Monitor не гарантирует чтение шифрованного трафика.

Kali не создаёт аппаратную возможность monitor. Используется тот же Linux wireless stack и поддержка конкретного драйвера.

Наблюдение механизмов

ip -brief address
ip route
ss -lnt
getent hosts example.com
nft --version
iptables --version
# Physical Linux with iw and a supported wireless adapter
iw dev
iw list | head -n 40
# Isolated user + network namespace; no host rules changed
Полный разбор команд в конспекте →

Команды и наблюдения

Ubuntu / Bash, два терминала

mkdir -p ~/devops-course/web
cd ~/devops-course/web
printf "hello from Ubuntu
" > index.html
python3 -m http.server 8080 --bind 127.0.0.1
# In another Ubuntu terminal
curl -i http://127.0.0.1:8080/
curl -i http://127.0.0.1:8080/missing
ss -ltnp | grep :8080
getent hosts example.com

Разбор результата

Для / ответ 200, для /missing — 404; ss показывает слушающий 127.0.0.1:8080.

Демонстрационный http.server не используем как production-сервер. Останавливаем Ctrl+C в первом терминале.

На macOS

curl и Python-команды одинаковы при наличии Python. Вместо ss — lsof; вместо getent hosts — dscacheutil для системного разрешения имени. DNS, TCP и HTTP объясняются одинаково, но инструменты и сетевые режимы ОС отличаются.

python3 -m http.server 8080 --bind 127.0.0.1
# In another Terminal window
curl -i http://127.0.0.1:8080/
lsof -nP -iTCP:8080 -sTCP:LISTEN
dscacheutil -q host -a name example.com

Три диагноза одного симптома

  1. Запустите учебный HTTP-сервер и получите нормальный ответ.
  2. Запросите несуществующий путь и запишите HTTP-статус.
  3. Остановите сервер и повторите запрос: сравните ошибку соединения с 404.
  4. Проверьте несуществующее имя учебного домена с getent; составьте порядок диагностики.

Что должно получиться

Таблица DNS / TCP / HTTP с командой и наблюдаемым результатом.

Студент не лечит 404 изменением DNS; соединение и ответ различаются.

Ошибка для диагностики

localhost одного компьютера ошибочно используется как адрес другого.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Нет, он не выполняет HTTP-запрос.
  2. Сам контейнер, а не соседний сервис.

После пары

Проверить публичную учебную презентацию через curl -I; объяснить HTTPS и статус без сканирования посторонних портов.

Конспект, команды и разбор →

localhost зависит от точки зрения

Prometheus хочет прочитать метрики app.

prometheus→ ?app
Выберите адрес внутри сети Compose

Пара 8 / октябрь

Пакеты, зависимости, Python и конфигурация

Создать venv, запустить StudyPulse и отделить конфигурацию от исходного кода.

Контекст

Пакеты системы, Python venv и контейнерный образ управляют разными слоями.

Создать venv, запустить StudyPulse и отделить конфигурацию от исходного кода.

Пакеты ОС и библиотеки проекта

apt и pip управляют разными слоями.

01Ubuntu / apt
02Python
03venv / pip
04Приложение

Аналогия: ремонт здания и инвентарь отдельной лаборатории имеют разных владельцев.

Виртуальное окружение

venv изолирует Python-библиотеки, но не всю ОС.

01Проект A / .venv
02Проект B / .venv
03Общее ядро и файлы

Аналогия: разные ящики инструментов в одной мастерской.

Код, конфигурация, артефакт

Меняем поведение без редактирования программы под каждый ноутбук.

01Код
02Окружение
03Артефакт JSON
04Проверенный запуск

Аналогия: рецепт, настройки духовки и партия ингредиентов.

Менеджер пакетов связывает версии зависимостей

Пакеты системы, Python venv и контейнерный образ управляют разными слоями.

Сборка системы включает репозитории, зависимости и политику обновленийРепозиторийМетаданные и подписиapt / dnf / pacmanРешает зависимостиПакетыБинарники + libs + configУстановленная ОСВерсии должны сочетатьсяLinux-дистрибутивы различаются не только обоямиlibc, package format, defaults, init, release model и сроки поддержкиНе подключаем репозитории другого дистрибутива ради одного файла .so. Python venv решает другой слой.

Ремонт dependency начинается с определения активного interpreter и источника пакета, а не с установки всего подряд.

Наблюдение механизмов

command -v python3
python3 -c 'import sys; print(sys.executable); print(sys.version)'
dpkg -S /usr/bin/ls
apt-cache policy python3
python3 -m venv .venv
.venv/bin/python -c 'import sys; print(sys.executable)'
Полный разбор команд в конспекте →

Команды и наблюдения

Ubuntu / Bash, папка lab из комплекта

sudo apt update
sudo apt install -y python3-venv curl git
cd ~/devops-course/lab
python3 -m venv .venv
.venv/bin/python -c "import sys; print(sys.executable)"
HOST=127.0.0.1 PORT=8000 MODEL_VERSION=v1 .venv/bin/python app.py
# In another terminal
curl -i http://127.0.0.1:8000/healthz

Разбор результата

Сервис возвращает JSON со status=ok и model_version=v1; путь интерпретатора находится в .venv.

Скопируйте предоставленную папку lab в ~/devops-course/lab заранее. apt требует sudo, сам сервис — нет.

На macOS

Установите поддерживаемый Python из python.org; если Homebrew уже выбран и установлен, допустим brew install python git. apt на macOS отсутствует. venv и конфигурация курса работают одинаково; не используйте sudo pip для системной среды.

python3 --version
python3 -m venv .venv
.venv/bin/python -c "import sys; print(sys.executable)"
HOST=127.0.0.1 PORT=8000 .venv/bin/python app.py

Один код, два запуска

  1. Запустите StudyPulse локально и проверьте /healthz.
  2. Отправьте POST /predict с hours=4 через пример из lab/README.md.
  3. Остановите сервис; измените PORT и MODEL_VERSION только через окружение.
  4. Передайте недопустимый PORT и объясните, почему ранний отказ лучше странного поведения.

Что должно получиться

Два ответа /healthz и запись проверки неверной конфигурации.

Исходный app.py не редактируется ради порта; неверная конфигурация не запускается.

Ошибка для диагностики

pip и python относятся к разным окружениям.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Python-окружение и библиотеки, а не ядро, сеть или права ОС.
  2. Связывает менеджер пакетов с выбранным интерпретатором.

После пары

Написать README запуска и перечислить все настройки StudyPulse.

Конспект, команды и разбор →