Iptables in linux ubuntu

Утилита 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 ) — установить действие по умолчанию для цепочки
Читайте также:  Почему пропал wifi windows 10

Имеются следующие дополнительные опции:

  • -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 .
Читайте также:  Установка шрифта eangnivc windows 10

Явные критерии — требуют явной подгрузки модулей расширения с помощью опции -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-коммуникацию между хостами:

Читайте также:  Настройка служб удаленных рабочих столов windows server 2019

Сохранение изменений

Внесенные в цепочки правил изменения пропадут при перезагрузке, так что их нужно сохранить с в файл помощью команды:

После перезагрузки правила можно восстановить из файла /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 — подмена адреса получателя):

Источник

Оцените статью