Принцип работы
Брандмауэр (файрвол) предназначен для фильтрации и обработки
пакетов, проходящих через сеть. Когда пакет прибывает, брандмауэр анализирует
заголовки пакета и принимает решение, "выбросить" пакет (DROP), принять пакет
(ACCEPT, пакет может пройти дальше) или сделать с ним что-то еще более
сложное. В Linux брандмауэр является модулем ядра, его неотъемлемой частью. С
его помощью мы можем делать с пакетами множество хитроумных вещей, но основной
принцип манипуляции трафиком сохраняется: просматриваются заголовки пакетов и
решается их дальнейшая судьба. Интерфейсом для модификации правил, по которым
брандмауэр обрабатывает пакеты, служит iptables. Итак, пребывающий пакет
проходит по цепочке правил. Каждое правило содержит
условие и
цель
(действие). Если пакет
удовлетворяет условию то он
передается на цель, в
противном случае к пакету применяется следующее правило в цепочке. Если пакет
не удовлетворил ни одному из условий в цепочке, то к нему применяется
действие по умолчанию. Например, к нам пришел пакет от адреса 192.168.164.84
для 128.3.4.5, применим цепочку из трех правил к этому пакету:
номер правилаусловиедействиерезультат
1
пакет от адреса 127.2.4.5
пропустить (ACCEPT)
переход к следующему правилу
2
пакет для адреса 234.2.*.5
пропустить (ACCEPT)
переход к следующему правилу
3
пакет от адреса 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. Может быть определен несколькими путями.
- Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
- Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0
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 Все пакеты устанавливающие новое соединение
ESTABLISHED Все пакеты принадлежащие установленному соединению
RELATED Пакеты, не принадлежащие установленному соединению, но связанные с ним.
Например - FTP в активном режиме использует разные соединения для передачи
данных. Эти соединения связанны.
INVALID Пакеты, которые не могут быть по тем или
иным причинам идентифицированны. Например ICMP ошибки не принадлежащие
существующим соединениям
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 -A INPUT -i eth1 --source 192.168.1.0/24 --match state --state NEW,ESTABLISHED -j ACCEPT
Разрешим маршрутизатору отвечать компьютерам во внутренней сети:
iptables -A 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 -A FORWARD -i eth0 --destination 192.168.1.0/24 --match state --state ESTABLISHED -j ACCEPT
Итого: * Маршрутизатор разрешает клиентам внутренней сети устанавливать
соединение с узлами в интернет. * Маршрутизатор имеет возможность удаленного
управления из внутренней сети и только из внутренней сети. * Маршрутизатор
блокирует все попытки установить новое соединение
из сети интернет.
Маршрутизатор не принимает пакеты из сети интернет сам, только
перенаправляет
пакеты во внутреннюю сеть и только принадлежащие
установленным* соединениям.