Настройка nftables

В этой статье я приведу примеры настройки nftables, на замену устаревшему iptables.

Переключимся на root пользователя чтобы не писать sudo:

sudo -i

Команда установки в Ubuntu (если еще не установлено):

apt install nftables
systemctl is-enabled nftables.service
systemctl enable nftables.service

Пример предотвращения загрузки при запуске операционной системы (mask сильнее чем disable):

systemctl mask nftables.service
systemctl unmask nftables.service

Полное удаление nftables из операционной системы:

apt purge nftables

Пример очистки правил:

nft flush ruleset
nft delete table inet filter

Просмотр текущих правил и таблиц:

nft -a list ruleset
nft list tables

Пример создания таблицы:

nft add table inet filter

Ограничение или открытие доступу к порту http:

nft add rule inet filter input tcp dport 80 drop
nft add rule inet filter input tcp dport 80 accept

Указание политики DROP для цепочки INPUT:

nft add chain inet filter input '{ policy drop; }'

Разрешим приложениям подключаться к интерфейсу localhost:

nft add rule inet filter input iifname lo counter accept

Пример удаления правила по номеру:

nft -a list ruleset
nft delete rule inet filter input handle 8

Можно воспользоваться iptables-translate чтобы перевести правила iptables в правила nftables:

iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
nft add rule ip filter INPUT tcp dport 22 ct state new counter accept

iptables-translate -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
nft add rule ip nat POSTROUTING oifname eth0 ip saddr 10.0.0.0/24 counter masquerade

ip6tables-translate -A FORWARD -i eth0 -o eth1 -p udp -m multiport --dports 123,456 -j ACCEPT
nft add rule ip6 filter FORWARD iifname eth0 oifname eth1 meta l4proto udp udp dport { 123,456} counter accept

Пример конвертации правил из iptables в nftables через файл:

iptables-save > save.txt
iptables-restore-translate -f save.txt > ruleset.nft
nft -f ruleset.nft

Пример сохранения правил nftables в файл и восстановление из файла:

nft list ruleset > ixnfo.com.conf 
nft -f ixnfo.com.conf

В Debian можно найти пример конфигураций тут /usr/share/doc/nftables/examples/

Открываем порт NTP сервера:

nft add rule inet filter input ip saddr 10.0.0.0/22 udp dport 123 accept

Открываем порт Syslog сервера:

nft add rule inet filter input position 22 ip saddr { 10.20.30.5/32, 10.30.10.5/32 } udp dport 514 accept
nft add rule inet filter input position 22 ip saddr { 10.20.30.5/32, 10.30.10.5/32 } tcp dport 514 accept

Открываем порт Asterisk сервера:

nft add rule inet filter input position 33 ip saddr { 10.20.30.5/32, 10.30.10.5/32 } udp dport 5060 accept
nft add rule inet filter input position 34 ip saddr { 10.20.30.5/32, 10.30.10.5/32 } udp dport 10000-20000 accept

После всех разрешающих правил обязательно запретим все остальное (или можно сделать политику по умолчанию DROP для входящих соединений):

nft add rule inet filter input counter drop

Пример добавления правила после правила под номером 22 (например чтобы оно было перед запрещающим правилом, так как после запрещающего оно не будет работать):

nft -a list ruleset
nft add rule inet filter input position 22 ip saddr 10.0.0.0/16 tcp dport 514 accept

Проверить открыт ли порт можно с другого сервера запустив сканер nmap:

nmap -p 514 10.20.30.40

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

nft add rule inet filter input iifname eth0 ip saddr 10.0.0.0/16 udp dport {137, 138, 123} counter accept
nft add rule inet filter input iifname eth0 ip saddr 10.0.0.0/16 tcp dport {445, 139, 80, 443} counter accept

Разрешим ICMP только для определенных сетей:

nft add rule inet filter input position 10 ip saddr { 10.20.30.0/22, 10.30.20.0/22 } ip protocol icmp icmp type { destination-unreachable, echo-request, router-advertisement, router-solicitation, time-exceeded, parameter-problem } accept

Журналирование пакетов:

nft add rule inet filter input log

Сохраним правила чтобы они не сбросились после перезапуска операционной системы (или просто внесем новые правила в существующий файл /etc/nftables.conf):

echo '#!/usr/sbin/nft -f' > /etc/nftables.conf
echo 'flush ruleset' >> /etc/nftables.conf
nft list ruleset >> /etc/nftables.conf

Проверим:

systemctl restart nftables
nft list ruleset

Смотрите также мою статью:
Настройка IPTables

Оставьте комментарий

Добавить комментарий