Введение в межсетевые экраны

МЭ — обработка сетевого трафика (вообще говоря, на всех уровнях):

МЭ интерфейсного уровня

в Linux:

TODO пример, если останется время

МЭ сетевого и транспортного уровней

Обычно оба уровня, потому что задачи МЭ общие.

В Linux:

Попробуем nftables.

Принцип: https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks:

../../LinuxNetwork2022/10_FireWalls/NFTables_Hooks.svg

Правила, хуки, цепочки, таблицы

../../LinuxNetwork2022/10_FireWalls/NFTables_Flow.svg

  1. Проходя по стрелочкам, пакет, в зависимости от принятия решений (обозначены ромбами) проходит контрольные точки (обозначены зелёными боксами и для уровня TCP/IP называютюся «Hook», а для интерфейсного — «Bridge»)
    • Кто придумал такую терминологию, был большой оригинал ☹

  2. В процессе прохождения пакет обрабатывается правилами

  3. Однотипные правила, решающие общую подзадачу, объединяются в цепочки

    • Типы цепочек: nat (преобразование), filter (фильтрация), route (перенаправление)

    • Цепочка может быть «закреплена» на какой-нибудь контрольной точке (или «зацеплена за крюк») — это базовая цепочка.
    • Проходя через контрольную точку, пакет «перепрыгивает» на базовую цепочку: по очереди обрабатывается правилами из неё.
    • Если при контрольной точке имеется несколько цепочек, сравнивается их приоритет,
    • Пакет из цепочки может не выйти — если его выбросят или попросят уйти (goto) на конкретную цепочку, указанную в правиле
    • В противном случае пакет доходит до конца цепочки (или правила «покинуть цепочку»), и обработка пакета продолжается в том месте, откуда он перепрыгнул на неё.
      • …например, переход в следующую базовую цепочку или по стрелочке на следующую контрольную точку
  4. Цепочки и данные к ним группируются в таблицы — наборы правил для решения определённых пользовательских задач. Единственная роль таблицы, помимо информационной — её можно целиком удалить или заменить.

Имена таблиц и цепочек могут быть любыми.

Типы данных

В справочнике:

Работа nftables — это интерпретация некоторого байт-кода, в который компилируются правила

Наборы данных можно изменять без изменения правил в цепочке (а ещё в них логарифмический поиск)

Кстати, есть ещё «ARP Level» — потому что он межуровневый и там свои задачи.

Высокоуровневые оболочки

Это необъятная тема, со спецификой каждого инструмента

Использование NFTables

Площадка: client[12]routersrv

Примеры из Арчевики

Source NAT

Упростим NAT из прошлой лекции:

Фильтрация портов

Разрешим принимать TCP только на определённые порты, остальное запретим

Проброс портов

Ограничение частоты соединений

Отказ при превышении лимитов по частоте подключения ( <!> это не шейпинг)

Простой вариант: собственно ограничение частоты соединений

Сложный вариант со списком временно забаненных хостов. Таблицу создавать не будем (хотя бы для того, чтобы показать, как это неудобно ☺): впишем всё прямо в имеющиеся таблицу filter, а правила — в её цепочку input (которая висит на контрольной точке input)

Для того, чтобы настройки стали постоянными, их надо складывать в /etc/nftables/nftables.nft, или include-ить оттуда файлы из того же каталога, куда скопипастить фрагменты выдачи nft list ruleset.

МЭ прикладного уровня

Это какого? ☺

TODO упомянуть https://github.com/crowdsecurity/crowdsec

Д/З

Образ не изменился

Задание 10

TODO задать строгий адрес клиента

Воспроизвести (модифицированный) пример из лекции:

  1. clientrouterserver

    • «выход в интернет» должен работать на всех трёх машинах через server

      • DNS разрешается настраивать вручную при помощи 8.8.8.8 в /etc/resolv.conf

        • Если ваш провайдер не даёт доступа к 8.8.8.8, впишите адрес DNS-сервера этого вредного провайдера.

      • Все сетевые настройки выполняются перманентно с помощью sytemd-networkd

        • (маршрут по умолчанию, маршрут с srv на client и обратно)

      • SNAT на srv должен быть настроен перманентно с помощью /etc/nftables/nftables.nft

    • Настроить на router перманентно с помощью /etc/nftables/nftables.nft (руками вводить не надо):

      • Проброс порта 2222 → client:22 (подключение с server к router на порт 2222 должно приводить к подключению к client на 22)

      • Ограничение по количеству входящих TCP-соединений к server по ssh за определённый период времени с записью нарушителей в счётчик

        • как в «сложном примере» из лекции,
        • но поскольку обрабатываются не принятые, а пересылаемые пакеты, точка привязки (hook) должна быть другая

    • <!> Настройка в отчёт не входит.

  2. Отчёт (вместо курсива могут быть числа, IP-адреса и т. п.):

    1. report 10 server:

      • networkctl status eth0

      • networkctl status eth1

      • nft list ruleset

      • ssh router -p 2222 (должен привести к входу на client!)

        • выполнить там ip a

    2. report 10 router:

      • networkctl status eth1

      • networkctl status eth2

      • nft list ruleset

      • date | netcat ya.ru 80 (должно показать 414)

    3. report 10 client:

      • date | netcat ya.ru 80 (должно показать 414)

      • for i in $(seq число ); do date | netcat server 22; done

        • Должен отработать в рамках ограничения (сколько положено по квоте), а дальше зависнуть
    4. router (продолжение)

      • Посмотреть множество нарушителей квоты по подключениям (там должен быть client)

    5. Остановить зависшие команды на client и server

  3. Три отчёта (названия сохранить, должно быть: report.10.server, report.10.router и report.10.client) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2024

LecturesCMC/LinuxNetwork2024/10_FireWalls (последним исправлял пользователь FrBrGeorge 2024-05-19 20:29:57)