Здравствуйте. Я занимаюсь написанием диплома. Мне необходимо написать о работе утилиты iptables максимально подробно. Я прочитал уже довольно большое количество статей, но нигде не нашел, как именно устроена эта утилита. Везде пишут, как она работает( что она проверяет условие и отбрасывает\принимает пакет, описаны цепочки и таблицы) но нигде не написано, как именно это происходит. Какие файлы задействованы. Что именно обрабатывает каждый пакет.
Посоветуйте пожалуйста, как мне максимально подробно изучить работу Iptables. Что прочитать или как посмотреть код\отследить все, что происходит с пакетом. ОС Ubuntu 14.
Заранее большое спасибо.
iptables дергает API ядра (netfilter) и создает правила, по которым работают ядерные модули. На каждый протокол чих есть соответствующий ядреный модуль - например, если хочешь фильтровать по диапазону портов, нужен модуль xt_multiport. Если модуль есть - он загружается автоматически. если нет - печаль (
Некоторое время назад разработчиков достала необходимость писать кучу модулей и они сделали nftables. Он устроен по-другому: на уровне ядра есть конечный автомат, который исполняет байт-код и с помощью этого байт-кода фильтрует пакеты. Пользовательская утилита просто компилирует правила в байт-код и загружает его в ядро.
Я правильно понял: в главных файлах, таких как iptables.c прописан код, который посредствам API "Netfilter" вызывает определенные модули ядра. Модули ядра, в свою очередь, обрабатывают пакеты на уровне машинного кода. Верно?
Александр: iptables занимается только управлением правилами: конвертирует набор правил между текстовым форматом, с которым работает пользователь, и бинарным форматом, с которым работает ядро. Текстовые правила парсятся и из них создаётся бинарное представление, которое через сокет передаётся ядру. Блоб содержит описания правил в бинарном формате (какие сопоставления (match) необходимо делать и с какими параметрами, и что делать с теми пакетами, которые подходят под правила). Ядро получает этот блоб и сохраняет у себя в памяти. При обработке сетевых пакетов, для каждого пакета на определённом этапе вызываются функции подсистемы netfilter, которая уже вызывает функции x_tables, которые занимаются тем, что прогоняют пакет по правилам из сохранённого блоба, и выполняют над ними действия, если пакеты подходят по правилам. Это в самом упрощённом виде.