В этой статье я приведу примеры настройки 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