Это старая версия документа!
Содержание
NFTABLES
nftables заменяет фреймворк iptables
В некоторых дистрибутивах уже установлен, но отключен
Установка пакета nftables
apt install nftables
Запуск nftables при загрузке
systemctl enable nftables.service
Файл настроек
По умолчанию, правила находятся в
/etc/nftables.conf
Содержание:
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority filter; } chain forward { type filter hook forward priority filter; } chain output { type filter hook output priority filter; } }
Просмотр текущих правил nftables
nft list ruleset
Удалить правило
Каждое правило при добавлении получает свой номер (handle).
Чтобы посмотреть эти номера нужно использовать ключ -a
nft -a list ruleset
И затем можно удалить правило по его номеру, указав путь до цепочки (inet filter input)
nft delete rule inet filter input handle 2
Сохранить конфигурацию
echo '#!/usr/sbin/nft -f' > /etc/nftables.conf echo 'flush ruleset' >> /etc/nftables.conf nft list ruleset >> /etc/nftables.conf
После сохранения перезапустить nftables
systemctl restart nftables
Сбросить все правила в nftables, и остановить фильтрацию
nft flush ruleset
Предотвратить запуск nftables при загрузке
systemctl mask nftables.service
Удалить пакет nftables и все его следы в системе
apt purge nftables
Синтаксис
nft <команда> <объект> <путь к объекту> <параметры>
Команда — add, insert, delete, replace, rename, list, flush…
Объект — table, chain, rule, set, ruleset…
Путь к объекту зависит от типа. Например, у таблицы это <семейство> <название>.
У правила — гораздо длиннее: <семейство таблицы> <название таблицы> <название цепочки>. А иногда ещё добавляются handle или index.
Параметры зависят от типа объекта. Для правила это условие отбора пакетов и действие, применяемое к отобранным пакетам.
Создать базовую таблицу IPv4
nft add table inet filter
Создать цепочку для исходящего трафика IPv4
nft add chain inet filter input { type filter hook input priority 0\; }
Правило, для подсчета входящих пакетов (IPv4)
nft add rule inet filter input counter accept
Показать результат предыдущих команд:
nft list table inet filter
Сбросить правила для цепочки filter input
nft flush chain inet filter input
Удалить цепочки filter input
nft delete chain inet filter input
Удалить таблицу filter
nft delete table inet filter
Семейство не обязательных параметров. По умолчанию используется 'ip'
nft add table ip6 filter nft add chain ip6 filter input nft add rule ip6 filter input counter accept
Директория с примерами конфигураций в Debian
/usr/share/doc/nftables/examples/
Подсчет входящего трафика на порт tcp/22
nft add rule inet filter input tcp dport 22 counter
Подсчет и прием трафика на 80/tcp и 443/tcp для новых и существующих соединений
nft add rule inet filter input tcp dport {80, 443} ct state new,established counter accept
Структура
Список таблиц
- filter — здесь пакеты фильтруются, то есть их можно пропустить или отбросить.
- Содержит цепочки: input, forward, output.
- nat — здесь работает NAT (проброс портов, входящий и исходящий NAT).
- Содержит цепочки: prerouting, output, postrouting.
- mangle — позволяет вносить изменения в заголовки ip-пакетов.
- Содержит все цепочки.
- raw — позволяет выборочно пропускать или отбрасывать пакеты перед тем, как они попадут в механизм отслеживания соединения (ct - connection tracking), что значительно снижает нагрузку на процессор.
- Содержит цепочки: prerouting и output.
Таблицы могут быть одного из 6-ти семейств (families):
- ip — для обработки пакетов IPv4
- ip6 — IPv6
- inet — обрабатывает сразу и IPv4 и IPv6 (чтобы не дублировать одинаковые правила)
- arp — пакеты протокола ARP
- bridge — пакеты, проходящие через мост
- netdev — для обработки «сырых» данных, поступающих из сетевого интерфейса (или передающихся в него)
Прохождение цепочки
Пакет, попавший в цепочку, начинает проходить правила указанные в ней сверху вниз. Фаервол сравнивает пакет с первым правилом, затем со вторым и так далее. Если фаервол определит правило для этого пакета, то с пакетом будет выполнено действие:
- drop — пакет будет уничтожен;
- accept — пакет сразу же покинет эту цепочку и пойдет дальше, то есть нижние правила уже не будут рассмотрены.
А если фаервол не найдет в данной цепочке подходящего правила для пакета, то фаервол выполнит действие с пакетом, которое указано в политике (policy accept или policy drop).
Для создания правил
- ip saddr <ip-адрес> — исходящий ip адрес;
- ip daddr <ip-адрес> — ip адрес назначения (в цепочки input является адресом сервера к которому идет подключение);
- tcp sport <порт> — исходящий tcp порт;
- tcp dport <порт> — порт tcp назначения (в цепочки input является портом сервера к которому идет подключение);
- udp sport <порт> — исходящий udp порт;
- udp dport <порт> — порт udp назначения;
- iifname <имя интерфейса> — имя входящего интерфейса;
- oifname <имя интерфейса> — имя исходящего интерфейса.
- counter - счетчик пакетов
Connection tracking — это модуль, который определяет состояния соединений. Соединения могут быть:
- new — пакет устанавливает новое соединение;
- estableshed — пакет является частью существующего соединения (например ответ на ping или ответ на http запрос);
- related — пакет является частью связанного соединения. Например, FTP использует порт 21 для установления соединения, но данные передаются через другой порт. И вот передача данных будет осуществляться по related соединению;
- invalid — пакет не является частью каких-либо соединений в таблице connection tracking.
Смена политик
- nft add chain <семейство> <цепочка> <таблица> { policy accept \; } — разрешающая политика;
- nft add chain <семейство> <цепочка> <таблица> { policy drop \; } — запрещающая политика.
Примеры
Разрешить все подключения к loopback
Интерфейс lo
nft add rule inet filter input iifname lo counter accept
Разрешить ssh с определенного IP
Интерфейс eth0
nft add rule inet filter input iifname eth0 ip saddr 192.168.0.2 tcp dport 22 counter accept
Разрешить PING из подсети
nft add rule inet filter input ip saddr 192.168.0.0/24 icmp type echo-request counter accept
Разрешить ответные соединения estableshed + related
nft add rule inet filter input ct state established,related counter accept
Разрешить порты http, https (80, 443)
nft add rule inet filter input tcp dport {80, 443} counter accept
Смена политики цепочки input
nft chain inet filter input { policy drop \; }