Основы использования iptables
Принцип работы
Брандмауэр (файрвол) предназначен для фильтрации и обработки пакетов, проходящих через сеть. Когда пакет прибывает, брандмауэр анализирует заголовки пакета и принимает решение, “выбросить” пакет (DROP), принять пакет (ACCEPT, пакет может пройти дальше) или сделать с ним что-то еще более сложное.
В Linux брандмауэр является модулем ядра, его неотъемлемой частью. С его помощью мы можем делать с пакетами множество хитроумных вещей, но основной принцип манипуляции трафиком сохраняется: просматриваются заголовки пакетов и решается их дальнейшая судьба. Интерфейсом для модификации правил, по которым брандмауэр обрабатывает пакеты, служит iptables.
Итак, пребывающий пакет проходит по цепочке правил. Каждое правило содержит условие и цель (действие). Если пакет удовлетворяет условию то он передается на цель, в противном случае к пакету применяется следующее правило в цепочке. Если пакет не удовлетворил ни одному из условий в цепочке, то к нему применяется действие по умолчанию.
Например, к нам пришел пакет от адреса 192.168.164.84 для 128.3.4.5, применим цепочку из трех правил к этому пакету:
условие | действие | результат -------------------------------------------------------------------------------------------------- пакет от адреса 127.2.4.5 | пропустить (ACCEPT) | переход к следующему правилу пакет для адреса 234.2.*.5 | пропустить (ACCEPT) | переход к следующему правилу пакет от адреса 192.168.* | выбросить пакет (DROP) | пакет выброшен
Как видно, пакет не удовлетворил первым двум условиям цепочки, зато удовлетворил третьему правилу, которое заставило брандмауэр выбросить этот пакет.
Цепочки собраны в три основные таблицы (при желании можно добавить свои):
- filter - Таблица, используемая по-умолчанию,
- nat - Эта таблица используется, когда встречается пакет, устанавливающий новое соединение.
- mangle - Эта таблица используется для специальных изменений пакетов.
Основными цепочками являются следующие:
- FORWARD: для проходящих (пересылаемых) пакетов
- INPUT: для входящих/получаемых пакетов
- OUTPUT: для исходящих/отправляемых пакетов
Действие может быть именем цепочки, определенной пользователем, или одной из специальных целей: ACCEPT, DROP, QUEUE, RETURN или MASQUERADE.
ACCEPT означает принять пакет. DROP означет проигнорировать (выбросить) пакет. MASQUERADE означает скрыть (маскировать) IP. (ниже будет рассмотрено подробно)
Схематично обработку пакета можно изобразить следующим образом:
PACKET IN --->---PREROUTING---[ маршрутизация ]--->----FORWARD---->---POSTROUTING--->--- PACKET OUT - mangle | - mangle - mangle - nat (dst) | - filter - nat (src) | | | | INPUT OUTPUT - mangle - mangle - filter - nat (dst) | - filter | | `---->----[ приложение ]---->----'
Входящий пакет начинает обрабатываться брандмауэром с цепочки PREROUTING в таблице mangle. Затем он обрабатывается правилами цепочки PREROUTING таблицы nat. На этом этапе проверяется, не требуется ли модификация назначения пакета (DNAT). Важно сменить назначение сейчас, потому что маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING. После этого он будет отправлен на цепочку INPUT (если целью пакета является этот компьютер) или FORWARD (если его целью является другой компьютер в сети).
Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUARADE (подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть
Если назначением пакета является сам компьютер с брандмауэром, то, после маршрутизации, он обрабатывается правилами цепочек INPUT таблиц mangle и filter. В случае прохождения цепочек пакет передается приложению.
Когда приложение, на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблицы filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется-ли использовать DNAT (модификация назначения), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING которая может использовать SNAT и QoS. В случае успешного прохождения POSTROUTING пакет выходит в сеть.
Для добавления правила в цепочку используется ключ -A
iptables -A INPUT правило
добавит правило в цепочку INPUT таблицы filter (по умолчанию). Для указания таблицы, в цепочку которой следует добавить правило, используйте ключ -t:
iptables -t nat -A INPUT правило
добавит правило в цепочку INPUT таблицы nat.
Цель по умолчанию задается с помощью ключа -P:
iptables -P INPUT DROP
Условия для отбора пакетов
Теперь мы знаем как пакеты проходят сквозь различные таблицы и цепочки iptables. Пришло время разъяснить принципы, по которым строятся условия накладываемые на пакеты:
Немного о протоколе TCP/IP
TCP/IP является протоколом, в котором соединение устанавливается в 3 фазы. Если компьютер А пытается установить соединение с компьютером Б они обмениваются специальными TCP пакетами.
A: SYN пакет (првыед Б!) Б: ACK пакет, SYN пакет (Ога!, как оно?) A: ACK пакет (дык, ничего)
После чего соединение считается установленным (ESTABLISHED).
iptables различает эти состояния как NEW и ESTABLISHED.
Опции отбора пакетов
опция | описание | пример |
---|---|---|
—protocol (сокращено -p) | Определяет протокол. Опции tcp, udp, icmp, или любой другой протокол определенный в /etc/protocols | iptables -A INPUT —protocol tcp |
—source | IP адрес источника пакетаs. Может быть определен несколькими путями.
|
iptables -A INPUT —source 10.10.10.3 |
—destination | IP адрес назначения пакета. Может быть определен несколькими путями - смотри —source | iptables -A INPUT —destination 192.168.1.0/24 |
—source-port | Порт источник, возможно только для протоколов —protocol tcp, или —protocol udp | iptables -A INPUT —protocol tcp —source-port 25 |
—destination-port | Порт назначения, возможно только для протоколов —protocol tcp, или —protocol udp | iptables -A INPUT —protocol udp —destination-port 67 |
—state | Состояние соединения. Доступно, если модуль ‘state’ загружен с помощью ‘-m state’. Доступные опции: NEW
|
iptables -A INPUT -m state —state NEW,ESTABLISHED |
—in-interface (сокращенно -i) |
Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами | iptables -t nat -A PREROUTING —in-interface eth0 |
—out-interface (сокращенно -o) |
Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами | iptables -t nat -A POSTROUTING —in-interface eth1 |
—tcp-flags | Определяет TCP флаги пакета. Содержит 2 параметра: Список флагов которые следует проверить и список флагов которые должны быть установлены | |
—syn | Сокращение для ‘—tcp-flags SYN,RST,ACK SYN’. Поскольку проверяет TCP флаги, используется с —protocol tcp. В примере показан фильтр для пакетов с флагом NEW, но без флага SYN. Обычно такие пакеты должны быть выброшены (DROP). |
iptables -A INPUT —protocol tcp ! —syn -m state —state NEW |
Определение цели
Чтобы определить действие, которое брандмауэр выполнит, если пакет в одной из цепочек удовлетворяет условию, iptables использует цели, устанавливаемые с помощью ключа —jump (или просто -j).
Целью может быть любая другая цепочка, куда будет передан пакет, или одно из следующих действий:
-
ACCEPT Пропускает удовлетворяющий условию пакет (пакет покидает данную цепочку и передается дальше).
-
DROP Выбрасывает удовлетворяющий условию пакет (молча, как будто он и не приходил).
-
REJECT Отклоняет пакет, сообщая об этом передавшему. Имеет дополнительный параметр ‘—reject-with’ определяющий сообщение которое будет передано отправившему пакет, это может быть: icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable (по умолчанию), icmp-proto-unreachable, icmp-net-prohibitedor и icmp-host-prohibited. Сообщение (по умолчанию “порт недоступен”) возвращется отправившему пакет компьютеру..
-
LOG Заносит в журнал информацию о пакете. Полезно в комбинации с DROP и REJECT для отладки.
-
RETURN Возвращает пакет в ту цепочку, из которой он прибыл.
-
SNAT Применяет source NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы nat.
-
DNAT Применяет destination NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочке POSTROUTING таблицы nat.
-
MASQUERADE Может применяться только в цепочке POSTROUTING таблицы nat. Используется при наличии соединения с динамическим IP. Похож на SNAT, однако имеет свойство забывать про все активные соединения при потере интерфейса. Это полезно при наличии соединения, на котором время от времени меняется IP-адрес, но при наличии постоянного IP это только доставит неудобства. В том числе поэтому рекомендуется для статических IP использовать SNAT.
Примеры
Настроим простейший шлюз для раздачи интернета для дома или малого офиса (SOHO). Допустим, что внутрь сети смотрит интерфейс eth1 с ip адресом 192.168.1.1, а в интернет интерфейс eth0:
eth1 eth0 Внутрнняя сеть --------------------[ маршрутизатор ]---------------------- Internet 192.168.1.0/24 192.168.1.1 внешний ip-адрес 0.0.0.0/0
Разрешим пропуск трафика через шлюз (в противном случае трафик не проходит цепочку FORWARDING):
sysctl -w net.ipv4.ip_forward="1"
Добавим правило, для маскировки ip в цепочку POSTROUTING таблицы nat
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Теперь клиенты внутренней сети могут получить возможность доступа в интернет установив в качестве шлюза адрес 192.168.1.1 .
Теперь попробуем нечто более интересное: запретим возможность установки новых соединений с маршрутизатором из интернета, а также форвардинг из сетей отличных от 192.168.1.0/24 .
Установим политики по умолчанию для цепочек в DROP, запретив все соединения кроме тех, которые будут разрешены:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP
Разрешим входящие соединения на маршрутизатор с внутренней сети (для управления)
iptables -А INPUT -i eth1 --source 192.168.1.0/24 --match state --state NEW,ESTABLISHED -j ACCEPT
Разрешим маршрутизатору отвечать компьютерам во внутренней сети:
iptables -А OUTPUT -o eth1 --destination 192.168.1.0/24 --match state --state NEW,ESTABLISHED -j ACCEPT
Разрешим перенаправление пакетов из внутренней сети во внешнюю для установки соединений и установленных соединений:
iptables -A FORWARD -i eth1 --source 192.168.1.0/24 --destination 0.0.0.0/0 --match state --state NEW,ESTABLISHED -j ACCEPT
Разрешим перенаправление пакетов из интернета во внутреннюю сеть только для установленных соединений:
iptables --append FORWARD -i eth0 --destination 192.168.1.0/24 --match state --state ESTABLISHED -j ACCEPT
Итого:
-
Маршрутизатор разрешает клиентам внутренней сети устанавливать соединение с узлами в интернет.
-
Маршрутизатор имеет возможность удаленного управления из внутренней сети и только из внутренней сети.
-
Маршрутизатор блокирует все попытки установить новое соединение из сети интернет.
-
Маршрутизатор не принимает пакеты из сети интернет сам, только перенаправляет пакеты во внутреннюю сеть и только принадлежащие установленным соединениям.
Операции с документом