Содержание первой части: Создание лаборатории, архитектура Netfilter, символьное устройство, sysfs 1.1 — Создание виртуальной лаборатории (чтобы нам было где работать, я покажу, как создать виртуальную сеть на вашем компьютере.
Сеть будет состоять из 3-х машин с Linux ubuntu).
1.2 — Написание простого модуля в Linux. Знакомство с Netfilter и перехватом трафика с его помощью.
Собираем все вместе и тестируем.
1.3 – Написание простого символьного устройства.
Добавляем виртуальную файловую систему — sysfs. Написание пользовательского интерфейса.
Собираем все вместе и тестируем.
Содержание второй части: 2.1 — Введение во вторую часть.
Давайте посмотрим на сеть и протоколы.
Вайршарк.
2.2 - Таблицы межсетевого экрана.
Транспортный уровень.
Структуры TCP, UDP. Расширение брандмауэра.
2.3 — Мы расширяем функционал.
Мы обрабатываем данные в пользовательском пространстве.
libnetfilter_queue. 2.4 - Бонус.
Мы изучаем настоящую атаку переполнения буфера и предотвращаем ее с помощью нашего межсетевого экрана.
Правила брандмауэра.
Теория.
В этой части мы почти закончили изучать достаточно, чтобы реализовать простой брандмауэр, но прежде чем мы это сделаем (при условии, что читатель обладает некоторыми знаниями в области сетевых технологий или прочитал часть 2.1), необходимо посмотреть, как брандмауэр принимает решения.
Данная таблица правил загружается пользователем (администратором) в память межсетевого экрана.
Именно они при получении посылок определяют, что с ними делать – принять или отклонить.
Важный! Когда межсетевой экран получает пакет, он обязательно просматривает его поля (что мы и делали в уроке 2.1) и сравнивает их с правилами из таблицы в том порядке (!), в котором эти правила в ней записаны (сверху вниз! ).
Другими словами, есть принципиальная разница, какое правило будет выше в таблице, а какое ниже.
Важный! Любой странный пакет не должен попасть в сеть или устройство, которое мы защищаем.
Кроме того, если мы не знаем, можно ли его пропустить или нет, то ответ НЕТ.
Мы разрешаем только те пакеты, которые разрешены правилами брандмауэра.
Отсюда и принцип построения и работы файрвола: во внутреннюю сеть (для нас это хост1) могут (и должны) попадать только те пакеты, которые мы разрешили.
Теперь например.
В таблице выше определены пять правил.
Когда мы получаем каждый пакет, мы должны убедиться, что только в том случае, если мы нашли для него подходящее правило, и в Действие изложены - принимать , только тогда мы позволяем этому пройти.
Если после проверки каждого из них мы не находим подходящее правило, то выбрасываем пакет независимо от его содержимого.
Для этой цели существует последнее правило по умолчанию, которое определяет, что любой пакет, не подпадающий ни под одно из правил, должен быть отброшен.
Он должен быть в самом конце (на самом деле все фаерволлы добавляют его автоматически, даже если он не указан).
Теперь подробнее о полях направление И подтверждение .
Направление – определяет, входит ли пакет в нашу сеть или выходит из нее.
Например, мы можем захотеть отключить все пакеты протокола smtp (почты), чтобы избежать утечки информации по электронной почте.
Или наоборот — мы захотим запретить любой входящий пакет по протоколу telnet, чтобы запретить любую попытку подключения к нашей сети.
В практической части мы рассмотрим, как определить направление пакета в коде в нашем случае.
Первые два правила называются пародия , и они выполняют тривиальную защиту от тривиальных попыток атаки.
Так, пародия1 означает «любой входящий пакет ( направление = внутрь ) с адресом нашей сети (10.0.1.1=host1) для любых номеров портов, протоколов и т.п.
- выбрасываем.
" Логика этого правила в том, что пакет не может прийти на межсетевой экран в нашу сеть, а на в то же время он указывает, что оно было отправлено из нашей сети ( исходный ip = 10.0.1.1 ).
Другими словами, это означает, что кто-то его подделал и пытается замаскироваться под одного из пользователей (в данном случае хост1) — мы не хотим пропустить такой пакет. Симметричное правило и пародия2 — мы не хотим выпускать пакеты из внутренней сети, если там написано, что она изначально была с IP, отличным от внутренних адресов (т.е.
НЕТ 10.0.1.1).
Скорее всего, это тоже какой-то вирус.
ПОДТВЕРЖДЕНИЕ – это флаг (один бит), который используется для установления соединения при использовании протокола TCP и дальнейшего поддержания его «надежности».
Каждое TCP-соединение начинается с тройного рукопожатия (3-х стороннее рукопожатие, статьи на русском нет, но анимация на английском языке есть здесь: https://en.wikipedia.org/wiki/Handshaking#TCP_three-way_handshake Нам важно понимать, что при каждом новом открытии TCP-сессии только в первом пакете ACK = 0, во всех остальных пакетах созданной сессии — ACK > 0 ( https://ru.wikipedia.org/wiki/TCP ).
Благодаря этому факту мы можем отличить уже существующее соединение от попытки его открытия.
Если ACK=0, то это попытка создания TCP-соединения (первый пакет в тройном рукопожатии), если ACK=1, то соединение должно было быть создано раньше (а если это не так, то оно логично не допускать попадания таких пакетов в сеть).
Теперь давайте посмотрим на правило http_in , http_out :
http_in означает следующее: если пакет приходит ( направление = в ), с любого IP ( Исходный IP = любой , обратите внимание, что приведенные выше правила подделки на этом этапе гарантируют нам, что это не IP-адрес внутренней сети), предназначенный для нашей сети ( Целевой IP == хост1 == 10.0.1.1 ), отправленный по протоколу TCP, на порт 80 (то есть всем известный http-сервер), с любого порта (> 1023 означает любой незарезервированный порт, который мы получаем от операционной системы при создании соединения и в дальнейшем используется для идентификации именно этого соединения, как описано в части 2.1), Подтверждение = Любой это значит, что мы разрешаем компьютеру извне запросить открытие соединения (в первом пакете ack=0, а в следующем ack> 0).
И мы принимаем такие пакеты и передаем их дальше в сеть( действие = принять ).
http_out симметрично, с той разницей, что мы не будем пропускать пакеты с ack=0, только ack> 0, то есть мы не позволим создать http-соединение с нашего компьютера в интернет, но при этом сможем ответить на уже созданное http-соединение.
Другими словами, правила http разрешают доступ к нашей сети через http извне, но запрещают пользователям нашей сети использовать http (то есть доступ к интернет-сайтам).
Правила брандмауэра.
Упражняться.
Возвращаясь к нашему модулю, напомню, вот как выглядит функция перехвата:
Давайте посмотрим на параметры: номер крючка — номер перехвата, мы это уже проходили const struct net_device *вход, выход – указатели на структуры сетевого интерфейса структура sk_buff *skb — самое интересное для нас — это указатель, содержащий нужные нам данные СКБ – буфер сокета , это базовая структура сети Linux. Он имеет множество полей и может стать отдельной темой для написания статьи.unsigned int hook_func_forward(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *));
Я нашел пару хороших ссылок для тех, кто хочет погрузиться глубже: http://vger.kernel.org/~davem/skb.html https://people.cs.clemson.edu/~westall/853/notes/skbuff.pdf
Мы заинтересованы в: union {
Теги: #linux #модуль ядра #брандмауэр #char устройство #netfilter #sysfs #VirtualBox #информационная безопасность #C++ #разработка Linux
-
Что Такое Интернет-Факс?
19 Oct, 24 -
Мини-Dv-Видеокамеры
19 Oct, 24 -
Аль-Каида Запускает Проект Мобильного Видео
19 Oct, 24 -
Проверка Правильности Ввода Капчи На Лету
19 Oct, 24 -
Хабракаст В Эфире!
19 Oct, 24 -
Советы По Защите Диссертации. Часть 1
19 Oct, 24