ServerAdmin.ru
28.9K subscribers
303 photos
35 videos
13 files
2.63K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru
Download Telegram
​​Ещё не успел перейти на nftables, а оказывается, что может и не придётся, так как на смену спешит eBPF, который уже много где используется. Например, в cilium.io (одна из реализаций сети для контейнеров в kubernetes). У них подробный материал есть на эту тему - Why is the kernel community replacing iptables with BPF.

Я уже почти созрел и давно запланировал переход на nftables. Уже и примеры конфигураций смотрел, и понял, зачем мне это надо. Nftables действительно удобнее iptables. Рекомендую погуглить различия, если ещё не делали этого. Из того, что сходу помню и на что обратил внимание: единый конфиг для ipv4 и ipv6, более короткий и наглядный синтаксис, больше не нужен ipset, так как nftables умеет быстро работать с огромными списками, экспорт правил в json и т.д.

И вот на сцене появляется ещё один пакетный фильтр bpfilter. Он не новый, но как я понял из некоторых новостей, которые погуглил, его активно развивают и уже много куда внедряют. Его используют в том числе Facebook и Netflix. Понятно, что они много чего используют и это не показатель реальной популярности и скорого роста использования того или иного продукта.

Написал эту заметку не только, чтобы поделиться информацией, но и спросить тех, кто разбирался уже в этом вопросе. Мне сейчас реально не понятно, eBPF это реально наше будущее в Linux и переходить на nftables не имеет большого смысла. Или не всё так однозначно? Если посмотреть презентацию с недавней конфы линуксоидов, то там прям на пальцах объяснили, что bpfilter это будущее. И там же указано, что будет переход From nft to bpfilter. Во разогнались как 😄 Я ещё на nft не перешёл, а они уже на bpfilter переезжают.

#iptables #nftables #bpfilter #firewall
​​Сейчас в большинстве популярных дистрибутивов на базе Linux в качестве файрвола по умолчанию используется nftables. Конкретно в Debian начиная с Debian 10 Buster. Я обычно делаю вот так в нём:

# apt remove --auto-remove nftables
# apt purge nftables
# apt update
# apt install iptables

Но это не может продолжаться вечно. Для какого-нибудь одиночного сервера эти действия просто не нужны. Проще сразу настроить nftables. К тому же у него есть и явные преимущества, про которые я знаю:

◽️ единый конфиг для ipv4 и ipv6;
◽️ более короткий и наглядный синтаксис;
◽️ nftables умеет быстро работать с огромными списками, не нужен ipset;
◽️ экспорт правил в json, удобно для мониторинга.

Я точно помню, что когда-то писал набор стандартных правил для nftables, но благополучно его потерял. Пришлось заново составлять, поэтому и пишу сразу заметку, чтобы не потерять ещё раз. Правила будут для условного веб сервера, где разрешены на вход все соединения на 80 и 443 порты, на порт 10050 zabbix агента разрешены только с zabbix сервера, а на 22-й порт SSH только для списка IP адресов. Всё остальное закрыто на вход. Исходящие соединения сервера разрешены.

Начну с базы, нужной для управления правилами. Смотрим существующий список правил и таблиц:

# nft -a list ruleset
# nft list tables

Очистка правил:

# nft flush ruleset

Дальше сразу привожу готовый набор правил. Отдельно отмечу, что в nftables привычные таблицы и цепочки нужно создать отдельно. В iptables они были по умолчанию.

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0\; }
nft add rule inet filter input ct state related,established counter accept
nft add rule inet filter input iifname "lo" counter accept
nft add rule inet filter input ip protocol icmp counter accept
nft add rule inet filter input tcp dport {80, 443} counter accept
nft add rule inet filter input ip saddr { 192.168.100.0/24, 172.20.0.0/24, 1.1.1.1/32 } tcp dport 22 counter accept
nft add rule inet filter input ip saddr 2.2.2.2/32 tcp dport 10050 counter accept
nft chain inet filter input { policy drop \; }

Вот и всё. Мы создали таблицу filter, добавили цепочку input, закинули туда нужные нам разрешающие правила и в конце изменили политику по умолчанию на drop. Так как никаких других правил нам сейчас не надо, остальные таблицы и цепочки можно не создавать. Осталось только сохранить эти правила и применить их после загрузки сервера.

У nftables есть служба, которая при запуске читает файл конфигурации /etc/nftables.conf. Запишем туда наш набор правил. Так как мы перезапишем существующую конфигурацию, где в начале стоит очистка всех правил, нам надо отдельно добавить её туда:

# echo "flush ruleset" > /etc/nftables.conf
# nft -s list ruleset >> /etc/nftables.conf
# systemctl enable nftables.service

Можно перезагружаться и проверять автозагрузку правил. Ещё полезная команда, которая пригодится в процессе настройки. Удаление правила по номеру:

# nft delete rule inet filter input handle 9

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

# nft add rule inet filter input position 8 tcp dport 22 counter accept

В целом, ничего сложного. Подобным образом настраиваются остальные цепочки output или forward, если нужно. Синтаксис удобнее, чем у iptables. Как-то более наглядно и логично, особенно со списками ip адресов и портов, если они небольшие.

Единственное, что не нашёл пока как делать - как подгружать очень большие списки с ip адресами. Вываливать их в список правил - плохая идея. Надо как-то подключать извне. По идее это описано в sets, но я пока не разбирался.

Документация

#nftables