Настройка nftables

Логирование

Действие полезно для логирования пакетов, когда к нему применяется правило. В отличие от других действий вроде или , ничего не делает с пакетом, он просто продолжает свое продвижение по цепочке. Обычно условия для правила с действием полностью дублируют условия какого-нибудь другого правила, которое следует логировать, а само логирующее правило идет непосредственно перед ним. Это значит, что, например, если вы хотите включить логирование всех отброшенных пакетов, вам следует добавить правило с действием перед каждым правилом с . Это не слишком удобно и плохо влияет на эффективность, поэтому вы можете вместо этого создать пользовательскую цепочку, скажем, :

# iptables -N logdrop

И добавить в нее следующие правила:

# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
# iptables -A logdrop -j DROP

В разделе дано разъяснение опций и .
Теперь, когда мы захотим отбросить пакет и добавить запись в лог об этом, мы просто выполним переход на цепочку :

# iptables -A INPUT -m conntrack --ctstate INVALID -j logdrop

Ограничение скорости логирования

Цепочка из предыдущего раздела использует модуль , который служит для предотвращения разрастания лога и падения эффективности при частых операциях записи на диск, ограничивая скорость логирования. Без этого, недобросовестный пользователь может быстро заполнить все свободное пространство вашего диска (как минимум, раздела ), посылая вам мусорные пакеты.

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

# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG

добавляет правило в цепочку , которое логирует все проходящие через него пакеты. За короткое время только 10 пакетов будут добавлены в лог, а затем максимальная скорость логирования не будет превышать 5 пакетов в минуту. Если скорость приходящих пакетов станет ниже 5 в минуту, со временем возможность принять 10 пакетов в пике восстановится. Эти опции работают подобно бассейну с постоянной скоростью оттока, но переменной скоростью притока. Если вода заливается очень быстро, бассейн переполняется и приток приходится сокращать (скорость логирования становится ограниченной значением , то есть, скорости оттока). Но, если дать возможность бассейну опустеть, он снова сможет принять большое количество воды за раз (равное значению ), пока вновь не заполнится.

Просмотр логированных пакетов

Логированные пакеты сохраняются как сообщения ядра в журнале systemd.

Чтобы отобразить все пакеты, которые были залогированы с момента последнего перезапуска, выполните

# journalctl -k | grep "IN=.*OUT=.*" | less

syslog-ng

Если вы используете syslog-ng, вы можете настроить куда будут попадать записи лога iptables. Замените:

filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };

на

filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };

Это предотвратит попадание вывода iptables в .

Если вы также хотите чтобы лог iptables записывался в какой-нибудь другой файл вместо , вы можете просто изменить путь назначения здесь же ():

destination d_iptables { file("/var/log/iptables.log"); };

Добавление правил в iptables

iptables -L INPUT -n --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
2    f2b-sshd   tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 2200
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:10050
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:2200
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Добавить правило в начало списка:

iptables -I INPUT -p tcp -m multiport --dports 2200 -j f2b-sshd

Добавить правило в конец списка:

iptables -A INPUT -p tcp -m multiport --dports 2200 -j f2b-sshd

Добавить правило между 2 и 3 строкой:

iptables -I INPUT 3 -p tcp -m multiport --dports 2200 -j f2b-sshd

Основные понятия

iptables используется для проверки, модификации, перенаправления и отбрасывания пакетов. Код для фильтрации пакетов IPv4 уже встроен в ядро. Он основан на наборе таблиц, каждая из которых служит конкретной цели. Таблицы составляют набор предопределенных цепочек, которые, в свою очередь, содержат список правил, организованных в определенном порядке. Каждое правило состоит из критерия (набора условий) и действия, которое применяется к пакетам, подпадающим под этот критерий, то есть, если все условия выполнены. iptables является утилитой, которая позволяет вам работать с этими цепочками и правилами. Большинство пользователей находят IP маршрутизацию в Linux сложной и запутанной, однако, на практике наиболее распространенные варианты использования (NAT и/или межсетевой экран для интернета) являются значительно менее сложными.

В подавляющем большинстве случаев вам не придется использовать таблицы raw, mangle и security. Приведенная ниже схема изображает упрощенный вариант прохождения пакета через iptables:

                               XXXXXXXXXXXXXXXXXX
                             XXX      Сеть      XXX
                               XXXXXXXXXXXXXXXXXX
                                       +
                                       |
                                       v
+---------------+             +-------------------+
|таблица: filter| <---+       |таблица: nat       |
|цепочка: INPUT |     |       |цепочка: PREROUTING|
+-------+-------+     |       +--------+----------+
        |             |                |
        v             |                v
   |         ***************          +----------------+
        |             +-------+  Маршрутизация  +------> |таблица: filter |
        v                       ***************          |цепочка: FORWARD|
 ***************                                         +-------+--------+
  Маршрутизация                                                  |
 ***************                                                 |
        |                                                        |
        v                       ***************                  |
+---------------+     +------>   Маршрутизация   <---------------+
|таблица: nat   |     |         ***************
|цепочка: OUTPUT|     |                +
+------+--------+     |                |
        |             |                v
        v             |      +---------------------+
+---------------+     |      | таблица: nat        |
|таблица: filter| +---+      | цепочка: POSTROUTING|
|цепочка: OUTPUT|            +---------+-----------+
+---------------+                      |
                                       v
                               XXXXXXXXXXXXXXXXXX
                             XXX      Сеть      XXX
                               XXXXXXXXXXXXXXXXXX

Таблицы

iptables содержит пять таблиц:

Скорее всего, вам нужно будет использовать только две из них: filter и nat. Остальные таблицы используются в сложных конфигурациях затрагивающих множество маршрутизаторов и точек маршрутизации и в любом случае выходят за рамки данной статьи.

Цепочки

Описания стандартных цепочек для других таблиц вы можете найти в руководстве .

По умолчанию, все цепочки пустые и не содержат каких-либо правил. Ваша задача в том, чтобы добавить правила в цепочки, которые вы хотите использовать. У цепочек, однако, есть стандартное правило (политика), которое в основном имеет действие , но может (и должно) быть изменено на , если вы хотите быть уверены в том, что даже если пакет проскочит сквозь набор ваших правил, он будет отброшен. Стандартное правило применяется к пакетам только тогда, когда они достигают конца цепочки, пройдя по остальным правилам.

Пользовательские цепочки могут быть добавлены для упорядочивания наборов правил, а также для повышения эффективности работы iptables. Пример создания таких цепочек вы можете найти на странице Простой межсетевой экран с внутренним состоянием.

Правила

Фильтрация пакетов основана на правилах, каждое из которых задается набором условий и целевым действием. Если пакет соответствует всем условиям, к нему будет применено указанное действие. Типовые условия могут проверять, например, с какого интерфейса пришел пакет (например, eth0 или eth1), какого он типа (ICMP, TCP или UDP), или на какой порт пакет направляется.

Модули

Существует множество модулей которые могут использоваться для расширения возможностей iptables, такие как connlimit, conntrack, limit и recent. Эти модули дополняют iptables новой функциональностью для того, чтобы были возможны более сложные правила фильтрации.

EXTRA EXTENSIONS

—ttl ttl

Matches the given TTL value.

mangle

—ttl-set ttl

Set the TTL to the given value.
—ttl-dec ttl

Decrement the TTL by the given value.
—ttl-inc ttl

Increment the TTL by the given value.

ULOG

netlink

—ulog-nlgroup <nlgroup>

This specifies the netlink group (1-32) to which the packet is sent.
Default value is 1.
—ulog-prefix <prefix>

Prefix log messages with the specified prefix; up to 32 characters
long, and useful fro distinguishing messages in the logs.
—ulog-cprange <size>

Number of bytes to be copied to userspace. A value of 0 always copies
the entire packet, regardless of its size. Default is 0
—ulog-qthreshold <size>

Number of packet to queue inside kernel. Setting this value to, e.g. 10
accumulates ten packets inside the kernel and transmits them as one
netlink multipart message to userspace. Default is 1 (for backwards
compatibility)

iptables-services в CentOS/RHEL системах

В CentOS существует утилита управления правилами iptables, делающая все вышеописанное, она создает файл для записи, сохраняет изменения, загружает правила при запуске системы. Эта утилита называется iptables-services.

# Устанавливаем
yum -y install iptables-services

# Добавляем в автозагрузку и запускаем
systemctl start iptables.service
systemctl enable iptables.service

После установки в директории /etc/sysconfig появляются файлы iptables и ip6tables, в эти файлы производится запись правил. В файл iptables производится запись правил для протокола IPv4, в файл ip6tables для протокола IPv6.

Конфигурационный файл находится в /etc/sysconfig/iptables-config. Здесь нас интересуют два параметра:

  • IPTABLES_SAVE_ON_STOP=»no» — сохранение текущих правил при остановке демона iptables, по умолчанию отключено.
  • IPTABLES_SAVE_ON_RESTART=»no» — сохранение текущих правил при перезапуске/перезагрузке системы, по умолчанию отключено.

Включим сохранение текущих правил, нужно заменить значения с «no» на «yes». Правила будут сохраняться автоматически в файл /etc/sysconfig/iptables, при перезагрузке системы/службы iptables. Также правила можно сохранять командой restart.

service iptables restart

Остальные параметры оставляем по умолчанию, без веской причины трогать их не следует.

  • IPTABLES_MODULES=»» — здесь указываются дополнительные модули iptables, которые будут загружаться при старте.
  • IPTABLES_MODULES_UNLOAD=»yes» — выгрузка модулей iptables, при перезагрузке или остановке межсетевого экрана.
  • IPTABLES_SAVE_COUNTER=»no» — сохранение счетчиков правил и цепочек, при остановке или перезагрузке.
  • IPTABLES_STATUS_NUMERIC=»yes» — вывод значений ip-адресов и портов в числовом виде.
  • IPTABLES_STATUS_VERBOSE=»no» — расширенный вывод информации.
  • IPTABLES_STATUS_LINENUMBERS=»yes» — вывод информации в пронумерованных строках.
  • #IPTABLES_SYSCTL_LOAD_LIST=».nf_conntrack .bridge-nf» — перезагрузка параметров ядра при старте или перезапуске.

Применение и восстановление правил iptables

Правило добавленное через консоль, применяется в фаерволе, но не сохраняется в дальнейшем, поэтому сохранять правила нужно вручную.

iptables-save > /path to file/filename

Если правило добавлено сразу в файл, то оно не применяется в фаерволе и его надо применить.

iptables-restore < /path to file/filename

Для восстановления правил после перезагрузки или включения системы необходимо применять iptables-restore. Чтобы не проделывать процедуру восстановления правил каждый раз, правила можно добавить в автозагрузку.

CentOS

В CentOS добавить правила в автозагрузку можно посредством правки файла rc.local.

# Редактируем файл:
nano /etc/rc.d/rc.local

# Добавляем в конец файла:
/sbin/iptables-restore < /root/iptables_rules

# Сохраняем и выходим.

# Делаем файл исполняемым:
chmod +x /etc/rc.d/rc.local

Теперь правила будут применяться в фаерволе при запуске системы. Для того чтобы запретить загрузку через rc.local, уберите добавленную строку или закомментируйте ее.

#/sbin/iptables-restore < /root/iptables_rules

Debian & Ubuntu

В Debian & Ubuntu все работает также, только rc.local расположен в каталоге /etc, загрузку можно прописать здесь. Можно сделать иначе, в Debian & Ubuntu запуск правил удобнее прописать в конф. файле сетевых интерфейсов /etc/network/interfaces.

# Редактируем файл:
nano /etc/network/interfaces

# Добавляем строку в конец раздела eth0:
pre-up iptables-restore < /root/iptables_rules

Теперь правила будут стартовать совместно с сетевым интерфейсом. Можно делать перезапуск правил путем перезагрузки сетевого интерфейса, для применения внесенных правок.

ifdown eth0 && ifup eth0

Можно пойти дальше и прописать команду для сохранения текущего состояния правил при выключении/перезапуске компьютера или при перезапуске интерфейса.

# Редактируем файл:
nano /etc/network/interfaces

# Добавляем строку в конец раздела eth0:
post-down iptables-save > /root/iptables_rules

Теперь, даже если вы забудете сохранить внесенные изменения в правила, система сделает это автоматически. Файл интерфейсов должен выглядеть примерно так:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.7
netmask 255.255.255.0
gateway 192.168.1.1
network 192.168.1.0
broadcast 192.168.1.255

# Сохранение правил iptables
post-down iptables-save > /root/iptables_rules

# Старт правил iptables
pre-up iptables-restore < /root/iptables_rules

Данные схемы рабочие, но неудобные, делать сохранение и восстановление правил можно по другому, при помощи специальных утилит. Теперь когда мы знаем механизм работы, можно переходить к изучению утилит помогающих управлять правилами iptables.

Сохранение и восстановление правил фильтрации iptables

В заключении, настроим автозагрузку правил, после перезагрузки сервера. Для этого должен быть установлен пакет iptables-services и активирован сервис. Установим пакет через yum:

Проверим статус службы iptables:

Параметр автозагрузки установлен в enabled (включена), параметр active указывает, что служба запущена.

При загрузке сервис будет читать содержимое файла /etc/sysconfig/iptables, и восстанавливать сохраненные правила. Чтобы сохранить в него наши правила, воспользуемся командой:

Можно восстановить правила из файла командой:

Теперь можно перезагрузить сервер, и убедиться, что правила файервола восстановились при загрузке.

В следующей статье мы покажем, как использовать iptables для создания NAT правил перенаправления трафика для шлюза-доступа на базе CentOS из / во внутренюю сеть организации.

Анализируем трафик с OpenDPI

Межсетевые экраны, работающие на втором и третьем уровнях, давно уже перестали удовлетворять современным требованиям обеспечения безопасности. Например, блокировка портов, используемых ICQ, ничего не даст. Пользователь может обойти запрет, подключившись через прокси, работающий на разрешенных портах вроде 80. Только поднявшись выше, проанализировав данные прикладного уровня, можно действительно ограничить нежелательный трафик. Стандартными средствами iptables этого добиться нельзя, поэтому юниксоиды взяли на вооружение L7-filter и IPP2P. Но говорить о них не будем, так как им на смену пришло более интересное решение — OpenDPI (opendpi.org, code.google.com/p/opendpi).

Распространяемый под лицензией LGPLv3, OpenDPI построен на коде коммерческого продукта PACE, который разрабатывается компанией Ipoque. То есть основа солидная, так как PACE позиционируется как средство классификации трафика и управления пропускной способностью сетей уровня интернет-провайдера. Все возможности по определению протоколов перешли от PACE к OpenDPI: P2P, Skype, VoIP, IM, потоковое видео и аудио, сетевые игры и прочее.

Ставим необходимые для сборки пакеты:

Скачиваем с сайта проекта opendpi-1.2.0.tar.gz и opendpi-netfilterwrapper1.1.tar.gz, а затем устанавливаем в соответствии с инструкциями внутри, не забыв наложить два патча:

Устанавливаем переменную среды:

Но здесь есть проблемы. В документации сказано, что поддерживается ванильное ядро (2.6.27-33), в остальных случаях OpenDPI может не собраться или работать не так. На форуме проекта можно найти патчи для некоторых новых версий кернела. Например, по адресу clck.ru/DWl8 доступен патч для 2.6.35 (такое ядро используется в последнем LTS Ubuntu). Кроме этого в ядре должны быть установлены опции CONFIG_ NF_CONNTRACK_EVENTS и CONFIG_NF_CT_NETLINK. В большинстве современных дистрибутивов так сделано по умолчанию. В Ubuntu и некоторых других .config-файл лежит в каталоге /boot. Можно легко проверить. Берем патч, копируем его в opendpi-netfilter-wrapper, применяем, а затем выполняем сборку:

Если все равно получаем ошибку, тогда пробуем ванильное ядро версии 2.6.33. Ставим модуль:

Загружаем и можем использовать:

Все доступные параметры можно получить, введя:

Выбираем нужный протокол (они также описаны в файле ipq_protocols_osdpi.h) и блокируем его:

Это самый простой вариант, можно маркировать нужный трафик, чтобы затем использовать в шейпере.

List Rules as Tables

Listing the iptables rules in the table view can be useful for comparing different rules against each other,

To output all of the active iptables rules in a table, run the command with the option:

This will output all of current rules sorted by chain.

If you want to limit the output to a specific chain (, , , etc.), you can specify the chain name directly after the option.

Let’s take a look at an example INPUT chain:

The first line of output indicates the chain name (INPUT, in this case), followed by its default policy (DROP). The next line consists of the headers of each column in the table, and is followed by the chain’s rules. Let’s go over what each header indicates:

  • target: If a packet matches the rule, the target specifies what should be done with it. For example, a packet can be accepted, dropped, logged, or sent to another chain to be compared against more rules
  • prot: The protocol, such as , , , or
  • opt: Rarely used, this column indicates IP options
  • source: The source IP address or subnet of the traffic, or
  • destination: The destination IP address or subnet of the traffic, or

The last column, which is not labeled, indicates the options of a rule. That is, any part of the rule that isn’t indicated by the previous columns. This could be anything from source and destination ports, to the connection state of the packet.

Show Packet Counts and Aggregate Size

When listing iptables rules, it is also possible to show the number of packets, and the aggregate size of the packets in bytes, that matched each particular rule. This is often useful when trying to get a rough idea of which rules are matching against packets. To do so, simply use the and option together.

For example, let’s look at the INPUT chain again, with the option:

Note that the listing now has two additional columns, and .

Now that you know how to list the active firewall rules in a variety of ways, let’s look at how you can reset the packet and byte counters.

Вывод статистики

iptables -L -n -v --line-numbers

где:

Аттрибут Описание
-L Вывести текущие правила
-v Вывести более детальную информацию
-n Вывести IP-адрес и порт в цифровом формате
—line-numbers Отобразить номер строки с правилом
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      197 11040 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
2    20008 1639K f2b-sshd   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 2200
3     385K   23M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:10050
4      104  6192 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:2200
5    3161K  345M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6      313 17673 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
7    14446  867K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
8     330K  149M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 658K packets, 45M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain f2b-sshd (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1    20008 1639K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

Вывести информацию по конкретной цепочке:

iptables -L INPUT -n -v --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      197 11040 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
2    20013 1639K f2b-sshd   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 2200
3     385K   23M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:10050
4      104  6192 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:2200
5    3162K  345M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6      313 17673 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
7    14449  867K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
8     330K  149M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *