Введение в межсетевые экраны
МЭ — обработка сетевого трафика (вообще говоря, на всех уровнях):
- ограничение
- перенаправление
- преобразование
- учёт (в первую очередь для последующего анализа)
МЭ интерфейсного уровня
в Linux:
TODO пример, если останется время
МЭ сетевого и транспортного уровней
Обычно оба уровня, потому что задачи МЭ общие.
В Linux:
nftables (хорошая статья на Арчевики и её перевод
Попробуем nftables.
Принцип: https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks:
- Ничего страшного, нам нужна только зелёненькая часть ☺
- Обратите внимание на то, что она называется «IP Layer», но она же и транспортная
- Стрелочки — это поуть пакета сквозь nftables
- «Local Process» наверху — это получатель и отправитель
Правила, хуки, цепочки, таблицы
- Проходя по стрелочкам, пакет, в зависимости от принятия решений (обозначены ромбами) проходит контрольные точки (обозначены зелёными боксами и для уровня TCP/IP называютюся «Hook», а для интерфейсного — «Bridge»)
Кто придумал такую терминологию, был большой оригинал ☹
В процессе прохождения пакет обрабатывается правилами
Однотипные правила объединяются в цепочки
Типы цепочек: nat (преобразование), filter (фильтрация), route (перенаправление)
- Цепочка может быть «закреплена» на какой-нибудь контрольной точке (или «зацеплена за крюк») — это базовая цепочка.
- Проходя через контрольную точку, пакет «перепрыгивает» на базовую цепочку: по очереди обрабатывается правилами из неё.
- Если при контрольной точке имеется несколько цепочек, сравнивается их приоритет,
- Пакет из цепочки может не выйти — если его выбросят или попросят уйти (goto) на конкретную цепочку, указанную в правиле
- В противном случае пакет доходит до конца цепочки (или правила «покинуть цепочку»), и обработка пакета продолжается в том месте, откуда он перепрыгнул на неё.
- …например, переход в следующую базовую цепочку или по стрелочке на следующую контрольную точку
Цепочки и данные к ним группируются в таблицы — наборы правил для решения определённых пользовательских задач. Единственная роль таблицы, помимо информационной — её можно целиком удалить или заменить.
Имена таблиц и цепочек могут быть любыми.
Типы данных
В справочнике:
Работа nftables — это интерпретация некоторого байт-кода, в который компилируются правила
- Простая арифметика
Множества, в том числе IP-адресов с диапазонами и с исключением элементов по тайм-ауту (например, для временной блокировки)
Словари (map) вида «данные:данные»
Словари вердиктов (vmap) вида «данные:команда»
- …
Наборы данных можно изменять без изменения правил в цепочке (а ещё в них логарифмический поиск)
Кстати, есть ещё «ARP Level» — потому что он межуровневый и там свои задачи.
Высокоуровневые оболочки
Использование NFTables
Примеры из Арчевики
Команды утилиты nft
- Упростим NAT из прошлой лекции:
table ip do_masq { chain do_postmasq { type nat hook postrouting priority srcnat; policy accept; ip saddr 10.1.1.0/24 masquerade } }
- Разрешим принимать TCP только на определённые порты, остальное запретим
- Проброс портов
- Ограничение скорости передачи
- Счётчик и временный отказ флудерам
- …
МЭ прикладного уровня
Это какого? ☺
- Для каждого протокола правила свои
- Например, антиспам, DPI, родительский контроль и т. п.
Д/З
Про просьбам трудящихся публикую vbconnect и vbsnap
Напоминаю, что чёрную XTerm-магию в vbconnect надо отключить (или использовать, да ☺)
Новое в образе
Настроена автогенерация /etc/machine-id на основании UUID виртуалки
Задание 10
Воспроизвести (модифицированный) пример из лекции:
- Суть:
Настроить сеть на server с помощью systemd-networkd, включить маршрутизацию, но не NAT
Настроить общий SNAT на server с помощью nftables
- «выход в интернет» должен работать на всех трёх машинах
Настроить сеть и маршрутизацию на router с помощью systemd-networkd
Настроить на router с помощью nftables:
Проброс порта (подключение с server к router на порт порт1 должно приводить к подключению к client на порт2)
- Чёрный список IP (ко всем можно подключиться, а к этим — нельзя)
Ограничение по количеству TCP-соединений к server по порту3 за определённый период времени
Настроить сеть на client с помощью systemd-networkd
Отчёт (вместо курсива могут быть числа, IP-адреса и т. п.):
report 10 server:
networkctl status
nft list ruleset
cal | netcat router порт1 (дождаться, пока отработает)
report 10 router:
networkctl status
nft list ruleset
report 10 client:
netcat -l порт2
date | netcat ya.ru 80 (должно работать)
date | netcat сайт-из-чёрного-списка 80 (не должно)
server (продолжение)
Принимать одновременно все подключения с форком обработчика (socat c параметром TCP-LISTEN:порт3,reuseaddr,fork
client (продолжение)
for i in $(seq число ); do date | netcat server порт3 ; done
- Должен отработать в рамках ограничения (сколько положено по квоте), а дальше зависнуть
router (продолжение)
Посмотреть множество нарушителей квоты по подключением (там должен быть client)
Остановить зависшие команды на client и server
Три отчёта(названия сохранить, должно быть: report.10.server, report.10.router и report.10.client) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru