Просмотров: 4443 шт.
*****
Что такое netfilter и iptables?
Netfilter — межсетевой экран (брандмауэр если угодно), встроен в ядро Linux версий 2.4 и 2.6.
Он выполняет следующие функции:
- Фильтрация трафика
- NAT
Грубо говоря, netfilter это встроенный фаервол в ядре linux'а.
iptables - утилита для управления этим самым netfilter'ом.
Что происходит с пакетом, попавшим в сетевую подсистему linux?
Итак, есть некая программа которая генерирует трафик, т.е. обращается к каким либо ресурсам в сети (лкольной или Internet). Второй вариант - этот трафик к нам поступает извне - подключение удаленных пользователей к нашему почтовому серверу, хакерская атака на SSH и т.д. Либо, третий вариант: проходящий через нашу linux-машину трафик в Internet от компьютеров в локальной сети и обратно. В данном случае - наша linux машина выполняет функцию маршрутизатора. Во всех трех случаях, пакет проходит через netfilter. На данном этапе, мы можем выполнять множество операций с пакетом - отклонить или пропустить его, произвести подмену IP-адреса, для NAT'а, и многое другое.
iptables (IP-таблицы) управляет таблицами и цепочками, которые содержат определнные нами правила, под обработку которых попадет каждый пакет данных. Например, есть таблица NAT, в которой содержатся правила NAT'а. Есть таблица FILTER, в которой содержатся правила фильтрации трафика.
Весь путь пакета выглядит так:
1. Пакет данных поступает в ядро (от другого компьютера в сети, запущенной у нас программы, e.t.c.)
2. Происходят действия, называемые пре-маршрутизацией. Используется таблица NAT.
3. Происходит фильтрация - ряд правил, по которым пакет будет либо отброшен, либо пропущен дальше. Используется таблица FILTER.
4. Происходят действия, называемые пост-маршрутизацией. Используется таблица NAT.
5. Пакет передается в пункт назначения.
Пункты 2 и 4, нам интересны если наша машина является маршрутизатором и мы используем NAT. Пункт 3 - интересен для фильтрации трафика. Теперь попробуем разложить все по полочкам.
Основы iptables
Как было сказанно - iptables управляет набором таблиц (table). В каждой таблице есть набор цепочек (chain). Каждая цепочка - упорядоченный набор правил обработки пакета. В каждой linux-системе существует четыре таблицы:
FILTER
NAT
MANGLE
RAW
Таблица FILTER служит для фильтрации трафика, и состоит из трех стандартных цепочек:
INPUT - служит для фильтрации входящего трафика
на нашу машину. К примеру в эту цепочку попадает трафик из Internet, на наш, к примеру почтовый, сервер.
OUTPUT - служит для фильтрации исходящего трафика
от нашей машины. В эту цепочку попадет трафик от нашего сервера в Internet. Представляет интерес, если нужно ограничить пользователей компьютера от посещения определенных ресурсов, и т.д.
FORWARD - служит для фильтрации проходящего трафика
через нашу машину. Представляет интерес, если наша машина является маршрутизатором.
Все эти цепочки заполняются правилами. При попадании пакета в цепочку, пакет проходит сверху вниз, пока не найдет правила, которому он отвечает. Правило - набор условий и действие, которое следует выполнить, в случае соответствия пакета всем условиям.
К примеру, эти условия подошли бы для цепочки INPUT таблицы FILTER:
*Запретить доступ с компьютера 192.168.0.1 на мой компьютер, на порты 25, 80 и 110.
*Полностью запретить доступ с компьютера 10.0.0.1 на мой компьютер
*Разрешить доступ
Эти простые правила будут рассматриваться сверху вниз - сначала проверяется, не старается ли злобный 192.168.0.1 проникнуть в наши web и mail системы? Нет? А не тот ли это злобый h4x0r 10.0.0.1 который вчера мне пароль к SSH пытался подобрать? Нет, не он? Ну тогда проходи.
А эти правила, для цепочки FORWARD таблицы FILTER:
*Запретить проход любого трафика из сети 192.168.2.0/24 на сервер ICQ
*Разрешить проход любого трафика из интернета на компьютеры из сети 192.168.2.0/24
*Разрешить проход любого трафика с компьютеров 192.168.2.0/24 в интернет
*Запретить проход любого трафика
Опять - сверху вниз. Не старается ли ленивый сотрудник поболтать в ICQ? Старается? Ну тогда не дадим ему этого. Ну, остальное то своим сотрудникам мы разрешим? Разрешим... пусть все остальное юзают. А вот другим сетям, особенно злобной бухгалтерии и складовщикам фигушки а не интернет. Никому больше ничего не дадим!
Фильтрация трафика
Что нам остается? Перевести наши умозаключения из человеческой формы, в язык iptables.
Каждое правило добаляется запуском одной комманды, имеющей следующий вид:
iptables -t таблица -A цепочка правило -j действие
Разберем. Здесь "iptables" - бинарник. "-t" - от table, указание таблицы, с которой мы хотим работать. "-A" сокращение от append - добавить в такую то цепочку, такое то правило. "-j" - от jump, выполнить такое-то действие. Если вам нужна таблица FILTER, ее можно не указывать, так как она подразумевается по умолчанию.
К примеру, добавим такие правила:
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 25 -j DROP
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.0.1 -p tcp --dport 110 -j DROP
iptables -A INPUT -s 10.0.0.1 -i eth1 -j DROP
iptables -A INPUT -j ACCEPT
Разберем детально. Первыми тремя правилами, мы блокируем (-j DROP, отбросить) доступ к нам с (-s, от source, источник) 192.168.0.1 на tcp (-p tcp, от protocol, протокол) порты (--dport, от destination port, порт назначения) 25,80,110. Четвертым правилом, мы не указываем протокол, порты, но указываем сетевой интерфейс, по которому пришел пакет (-i eth1, от interface, интерфейс). Неважно что это, но если оно с eth1 и адреса 10.0.0.1 - оно должно быть отброшено. Пятым правилом, мы не задаем условий, мы просто разрешаем (-j ACCEPT, позволить) весь остальной трафик.
Посмотреть на результаты наших усилий можно следующей коммандой:
iptables -L -n --line-numbers
Разберем и эту комманду. "-L" - вывести список правил. "-n" - не производить DNS-резолвинг. "--line-numbers" - вывести рядом с каждым правилом его порядковый номер.
Вы спросите - а что если пакет дойдет до самого низа цепочки, и так не ответит ни одному из правил? Все очень просто - у каждой цепочки есть действие по умолчанию. ACCEPT, DROP, либо аналогичное. В выводе списка правил, вы можете его заметить (policy, рядом с названием цепочки).
Управлять правилами в таблице тоже очень просто.
Добавить некое правило в конец цепочки INPUT:
iptables -A INPUT -s 10.0.0.2 -j ACCEPT
Вставить некое правило в позицию 3 цепочки INPUT:
iptables -I INPUT 3 -s 10.0.0.2 -j ACCEPT
Удалить правило номер 2 из цепочки INPUT:
iptables -D INPUT 2
Очистить целиком всю цепочку INPUT:
iptables -F INPUT
Внимательный читатель этой статьи и man-а, уже догодался как управлять маршрутизацией трафика. Все тоже самое, только уже не в цепочке INPUT, а в цепочке FORWARD. К примеру, создадим ряд правил:
iptables -A FORWARD -s 192.168.2.0/24 -d login.icq.com -o eth0 -j DROP
iptables -A FORWARD -s 192.168.2.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.2.0/24 -o eth1 -j ACCEPT
iptables -A FORWARD -j DROP
Все просто. Допустим, что в сетевой карте eth1 мы имеем подключенную локальную сеть, а в карте eth0 - интернет от провайдера. Первым правилом мы запрещаем проход с нашей сети (-s 192.168.2.0/24) трафика на сервер icq (-d login.icq.com) в сетевую карту eth0 (-o eth0, от output). Вторым и третим правилом, мы разрешаем проход трафика с нашей (-s 192.168.2.0/24) сети в интернет (-o eth0), и с интернета в нашу сеть (-d 192.168.2.0/24 -o eth1). В конце, мы запрещаем маршрутизацию любого другого трафика.
Но, не забываем, что для функционирования маршрутизации, система должна быть настроена должным образом, а именно должена быть включена функция IP-форвардинга:
echo 1 > /proc/sys/net/ipv4/ip_forward
Трансляция сетевых адресов (NAT)
С фильтрацией и маршрутизацией разобрались. Приступим к NAT'у. Как и было сказано, таблица FILTER, содержащая цепочки INPUT,FORWARD,OUTPUT - для фильтрации трафика. Для NAT'а - мы прибегнем к одноименной таблице NAT, которая содержит цпочки PREROUTING, POSTROUTING и OUTPUT. Все, что нам нужно для NAT'а, мы будем делать в них.
Суть не меняется, есть правила в цепочках, состоящие из уловия и действия.
Цепочка POSTROUTING (пост-маршрутизация), служит для хранения правил, проход по которым будет выполнятся после процесса маршрутизации (выбора маршрута, прохода по цепочке FORWARD). Цепочка PREROUTING (пре-маршрутизация)- наоборот, до процесса маршрутизации. Для обычного NAT'а пользователей нам интересна цепочка POSTROUTING.
Рассмотрим правило:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
Во первых, мы указали, что хотим работать с таблицей NAT, так как по умолчанию используется таблица FILTER. Затем, в цепочку POSTROUTING мы добавили правило, что с пакетами из сети 192.168.0.0/24 мы хотим сделать некий MASQUERADE (макскарад). Маскарад пакетов в linux'е - самый простой и быстрый способ соорудить NAT. Когда компьютеры из сети 192.168.0.0/24 будут обращатся к ресурсам интернета, в пакетах будет меняться адрес источника, на адрес самого маршрутизатора, и наоборот.
Реальный пример от начала до конца
Есть некая организация, которая имеет linux-сервер, с установленным на нем web и почтовым сервером. Интерфейс eth0 - смотрит в интернет, eth1 - в локальную сеть. Доступ на POP3 должен быть только из локальной сети клиента - 192.168.1.0/24. При этом, у всех компьютеров кроме вахтового (192.168.1.59) должен быть доступ в интернет.
Все, что нам нужно выполнить для получения этой цели, можно объеденить в один скрипт:
#!/bin/sh
# Включаем маршрутизацию
echo 1 > /proc/sys/net/ipv4/ip_forward
# Очищаем все правила iptables
iptables -F -t nat
iptables -F -t filter
# Заполням таблицы фильтра правилами
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j DROP
iptables -A INPUT -j ACCEPT
iptables -A FORWARD -o eth0 -s 192.168.1.59 -j DROP
iptables -A FORWARD -o eth0 -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -j DROP
# Включаем NAT для локальной сети
iptables -t nat POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
На последок
Как сохранить настройки iptables, чтобы они не потерялись после перезагрузки.
iptables-save > /etc/firewall.conf
Восстановление:
iptables-restore < /etc/firewall.conf
-----
Спасибо господину Imple за вразумления, разъяснения и примеры.