- Утилита iptables в Ubuntu
- Цепочки правил
- Таблицы iptables
- Принцип работы
- Утилита iptables
- Поведение по умолчанию
- Действия с соединениями
- Критерии для пакетов
- Критерий состояния соединения
- Сохранение изменений
- Автозагрузка правил
- Удаление всех правил
- Пример настройки web-сервера
- 1. Политика ACCEPT для OUTPUT
- 2. Политика DROP для OUTPUT
- Настройка маршрутизатора
- Доступ в интернет (SNAT)
- Доступ внутрь сети (DNAT)
Утилита iptables в Ubuntu
Утилита iptables — это межсетевой экран для операционных систем Linux. С помощью правил iptables можно разрешать или блокировать прохождение трафика. Когда происходит попытка установления соединения с текущей машиной, iptables просматривает список правил в списке, чтобы понять, как нужно поступить в этом случае. Если правила нет, то выполняется действие по умолчанию.
Цепочки правил
Набор правил формируется в цепочки, существуют базовые и пользовательские цепочки. Список базовых цепочек:
- PREROUTING — правила в этой цепочке применяются ко всем пакетам, которые поступают на сетевой интерфейс извне
- INPUT — применяются к пакетам, которые предназначаются для самого хоста или для процесса на данном хосте
- FORWARD — правила, которые применяются к транзитным пакетам, проходящим через хост, не задерживаясь
- OUTPUT — применяются к пакетам, которые сгенерированы самим хостом или процессами на данном хосте
- POSTROUTING — применяются к пакетам, которые должны покинуть сетевой интерфейс данного хоста
Таблицы iptables
Над цепочками правил в iptables есть еще один уровень абстракции — таблицы. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации:
- raw — предназначена для работы с сырыми пакетами, пока они еще не прошли обработку
- mangle — предназначена для модификации различных заголовков пакета
- nat — обеспечивает работу NAT, если сервер используется в качестве маршрутизатора
- 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 пакет выходит в сеть.
Утилита iptables
Синтаксис утилиты iptables :
Если таблица не указана, подразумевается таблица filter . Команды могут быть:
- -A (или —append ) — добавить правило в цепочку
- -D (или —delete ) — удалить правило из цепочки
- -I (или —insert ) — вставить правило в цепочку под указанным номером
- -L (или —list ) — вывести все правила для заданной цепочки
- -F (или —flush ) — очистить все правила для заданной цепочки (таблицы)
- -N (или —new-chain ) — создать новую цепочку
- -X (или —delete-chain ) — удалить цепочку
- -P (или —policy ) — установить действие по умолчанию для цепочки
Имеются следующие дополнительные опции:
- -v (или —verbose ) — увеличить подробность сообщений, при указании с командой —list будет выводиться имя интерфейса, параметры правил и маски TOS.
- -n (или —numeric ) — выводить ip-адреса и номера портов в числовом виде, предотвращая попытки преобразовать их в символические имена.
- —line-numbers — показывать номера строк при отображении списка правил командой —list (номер строки соответствует позиции правила в цепочке).
Примеры использования утилиты:
Поведение по умолчанию
Прежде чем приступать к настройке межсетевого экрана, следует определиться с тем, каким должно быть поведение цепочек правил по умолчанию. Другими словами, что iptables нужно делать в том случае, если соединение не подпадает ни под одно из сконфигурированных правил?
Изначально все три цепочки таблицы filter по умолчанию разрешают прием трафика:
Если же что-то менялось, а теперь нужно вернуть прежние настройки, то сделать это можно с помощью команд:
Можно пойти по другому пути и сначала запретить весь трафик, а затем выборочно разрешать его:
Действия с соединениями
После настройки поведения по умолчанию, можно переходить к созданию правил обработки трафика, чтобы iptables понимал, что делать с конкретным пакетом.
- ACCEPT — пакет покидает данную цепочку и передается в следующую
- DROP — отбросить пакет, пакет не передается в следующую цепочку
- REJECT — отбросить пакет, сообщить отправителю пакета об ошибке
- SNAT — замена ip-адреса источника в пакете, в цепочках POSTROUTING и OUTPUT таблицы nat
- DNAT — замена ip-адреса назначения в пакете, в цепочке PREROUTING таблицы nat (изредка — в OUTPUT )
- LOG — записать пакет в лог-файл (отправляется демону syslog ) и обработать остальными правилами
- MASQUERADE — как SNAT , но для соединений с динамическим ip-адресом, в цепочке POSTROUTING таблицы nat
- MARK — установить метку на пакет и обработать остальными правилами
Критерии для пакетов
Общие критерии — допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения:
- -p (или —protocol ) — используется для указания типа протокола ( all , icmp , tcp , udp )
- -s (или —source ) — используется для указания ip-адреса источника; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)
- -d (или —destination ) — используется для указания ip-адреса места назначения; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)
- -i (или —in-interface ) — интерфейс, с которого был получен пакет, допускается только в цепочках INPUT , FORWARD и PREROUTING ; при отсутствии этого критерия предполагается любой интерфейс
- -o (или —out-interface ) — интерфейс, с которого будет отправлен пакет, допускается только в цепочках OUTPUT , FORWARD и POSTROUTING ; при отсутствии этого критерия предполагается любой интерфейс
Неявные критерии — неявно подгружают модули расширений и становятся доступны при указании критерия —protocol . Рассмотрим некоторые из них:
- -p tcp —sport (или —source-port ) — исходный порт, с которого был отправлен TCP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле /etc/services . Номера портов могут задаваться в виде интервала из минимального и максимального номеров.
- -p tcp —dport (или —destination-port ) — порт или диапазон портов, на который адресован TCP-пакет. Аргументы задаются в том же формате, что и для —source-port .
- -p udp —sport (или —source-port ) — исходный порт, с которого был отправлен UDP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле /etc/services . Номера портов могут задаваться в виде интервала из минимального и максимального номеров.
- -p udp —dport (или —destination-port ) — порт или диапазон портов, на который адресован UDP-пакет. Аргументы задаются в том же формате, что и для —source-port .
Явные критерии — требуют явной подгрузки модулей расширения с помощью опции -m или —match . Например, если планируется использовать критерий state , то нужно явно указать -m state левее используемого критерия. Рассмотрим некоторые из них:
- -m conntrack —ctstate STATES — проверяет признак состояния соединения: NEW , ESTABLISHED , RELATED и INVALID . Состояние NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению, через которое пакеты идут в обеих направлениях. Состояние RELATED указывает на то, что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение. Состояние INVALID подразумевает, что пакет связан с неизвестным потоком или соединением и, возможно содержит ошибку в данных или в заголовке.
- -m state —state STATES (устарел, не рекомендуется) — проверяет признак состояния соединения: NEW , ESTABLISHED , RELATED и INVALID .
- -m multiport —source-port PORTS — служит для указания списка исходящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями -p tcp или -p udp . Главным образом используется как расширенная версия обычного критерия —source-port .
- -m multiport —destination-port PORTS — служит для указания списка входящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями -p tcp или -p udp . Главным образом используется как расширенная версия обычного критерия —destination-port .
- -m multiport —port PORTS — проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию —source-port и —destination-port . Данный критерий проверяет порты обоих направлений, если задан критерий -m multiport —port 80 — под него попадают пакеты, идущие с порта 80 на порт 80.
- -m mac —mac-source MAC — MAC адрес сетевого узла, передавшего пакет, в формате XX:XX:XX:XX:XX:XX . Имеет смысл только в цепочках PREROUTING , FORWARD и INPUT и нигде более.
- -m iprange —src-range IP-IP — позволяет указать диапазон ip-адресов источника, например 192.168.1.10-192.168.2.20
- -m iprange —dst-range IP-IP — позволяет указать диапазон ip-адресов места назначения, например 192.168.1.10-192.168.2.20
Критерий состояния соединения
Как сказано выше, многие протоколы требуют двусторонних коммуникаций. Например, если нужно разрешить соединения по SSH, то добавить правила надо будет и в цепочку INPUT и в цепочку OUTPUT . Но что, если нужно разрешить только входящие SSH-соединения на сервер (т.е. только возможность подключиться к серверу по SSH)? Разрешит ли добавление правила в цепочку OUTPUT и исходящие SSH-соединения (т.е. с сервера можно будет подключиться по SSH к другому хосту)?
Для таких случаев используются состояния соединений. Они позволяют описывать двусторонние коммуникации, в которых разрешается установка только соединений определенной направленности. В примере ниже разрешены SSH-соединения, поступающие от хоста 10.10.10.10, но SSH-соединения к этому хосту запрещены. Однако, системе разрешается отправка информации по SSH в случае уже установленного соединения, что делает возможной SSH-коммуникацию между хостами:
Сохранение изменений
Внесенные в цепочки правил изменения пропадут при перезагрузке, так что их нужно сохранить с в файл помощью команды:
После перезагрузки правила можно восстановить из файла /etc/iptables.rules с помощью команды:
Автозагрузка правил
Понятно, что восстанавливать правила вручную после каждой перезагрузки неудобно. Поэтому устанавливаем пакет iptables-persistent :
При установке пакета будет предложено сохранить текущие правила iptables :
- в файл /etc/iptables/rules.v4 для протокола IPv4
- в файл /etc/iptables/rules.v6 для протокола IPv6
Теперь, после каких-либо изменений правил, надо сохранить текущее состояние в файл /etc/iptables/rules.v4 , чтобы это состояние восстановилось после перезагрузки:
После установки пакета будет добавлена новая служба netfilter-persistent.service , которая при загрузке системы будет восстанавливать правила iptables :
Удаление всех правил
Для удаления всех сконфигурированных правил таблицы filter можно использовать команду:
Для удаления всех сконфигурированных правил таблицы nat можно использовать команду:
Пример настройки web-сервера
1. Политика ACCEPT для OUTPUT
Первым делом задаем политику по умолчанию:
Разрешаем трафик через интерфейс loopback (будет работать ping для localhost ):
Если подходить к настройке не очень фанатично, то можно разрешить работу протокола ICMP (будут работать ping и traceroute ):
ICMP (протокол межсетевых управляющих сообщений) — сетевой протокол, входящий в стек протоколов TCP/IP. В основном ICMP используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных.
Утилита ping , служащая для проверки возможности доставки IP-пакетов, использует ICMP-сообщения с типом 8 (эхо-запрос) и 0 (эхо-ответ). Утилита traceroute , отображающая путь следования IP-пакетов, использует ICMP-сообщения с типом 11.
Разрешаем нашему серверу получать ответы от DNS-серверов:
Разрешаем входящие подключения к портам HTTP, HTTPS и SSH:
Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt :
Теперь можно проверить добавленные правила командой:
2. Политика DROP для OUTPUT
В этом случае все правила для цепочки INPUT будут такими же, но надо еще добавить правила для цепочки OUTPUT . Итак, первым делом задаем политику по умолчанию:
Разрешаем трафик через интерфейс loopback :
Разрешаем работу протокола ICMP (будут работать ping и traceroute ):
Разрешаем нашему серверу отправлять запросы DNS-серверам:
Разрешаем нашему серверу получать ответы от DNS-серверов:
Разрешаем входящие подключения к портам HTTP, HTTPS и SSH:
Разрешаем отправлять пакеты с портов HTTP, HTTPS и SSH:
Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt :
Теперь можно проверить добавленные правила командой:
Настройка маршрутизатора
Есть компьютер с двумя сетевыми интерфейсами. Первый интерфейс eth0 смотрит в интернет и имеет белый ip-адрес 128.68.35.23 . Второй интерфейс eth1 смотрит в локальную сеть и имеет ip-адрес 192.168.100.1 .
Доступ в интернет (SNAT)
Этот компьютер должен обеспечивать выход в интернет для всех компьютеров из локальной сети 192.168.100.0/24 . По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf :
Чтобы настройки вступили в силу:
Теперь настраиваем iptables :
Тем самым разрешили ходить транзитным пакетам для нашего диапазона ip адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам сети выходить в интернет, используя единственный ip-адрес 128.68.35.23 .
Доступ внутрь сети (DNAT)
Внутри сети есть компьютер с ip-адресом 192.168.100.2 , к которому нужен доступ по RDP из интернета. Все запросы в нашу локальную сеть приходят на интерфейс eth0 с ip-адресом 128.68.35.23 . Мы может отобрать те их них, которые идут на порт 3389 и отправить их на 192.168.100.2 (DNAT — подмена адреса получателя):
Источник