{{indexmenu_n>5}} ====== Правила ACL через nftables ====== Роут-демон работает в отдельном network namespace (в примерах — ''router''), поэтому доступ к rib-интерфейсам нужно ограничивать правилами firewall внутри этого netns. firewalld для этого не подходит: его нельзя запустить вторым экземпляром в другом netns и управлять им через ''firewall-cmd''. Поэтому для netns роутера правила задаются напрямую через nftables. Ниже они загружаются отдельным systemd-юнитом при старте системы. В качестве бэкенда firewalld должен использоваться nftables: параметр ''FirewallBackend=nftables'' в ''/etc/firewalld/firewalld.conf''.\\ Все команды выполняются с правами root (через sudo). ===== Шаг 1. Создать файл с правилами ===== Файл: ''/etc/nftables/bgp-allow.nft''. Имя файла может быть любым, оно указывается дальше в systemd-юните. #!/usr/sbin/nft -f flush ruleset # IP-адреса BGP-пиров, с которых разрешён доступ define bgp_ipv4_peers = { 172.16.25.168 } table inet filter { chain INPUT { type filter hook input priority filter; policy drop; ct state established,related accept iif lo accept # Разрешить весь трафик от BGP-пиров ip saddr $bgp_ipv4_peers accept # Вариант строже: разрешить от пиров только BGP (TCP 179) #tcp dport 179 ip saddr $bgp_ipv4_peers accept } } Политика цепочки — ''drop'': всё, что явно не разрешено, отбрасывается. Если в netns роутера используются другие протоколы, добавьте для них разрешающие правила. Например: * для OSPF — ''ip protocol ospf accept''; * для IPv6 — ''meta l4proto ipv6-icmp accept'', иначе перестанет работать Neighbor Discovery. Команда ''flush ruleset'' очищает правила только в том netns, в котором выполняется файл. Правила основной системы не затрагиваются. ===== Шаг 2. Ограничить права на файл ===== chmod 600 /etc/nftables/bgp-allow.nft ===== Шаг 3. Создать systemd-юнит ===== Файл: ''/etc/systemd/system/nftables.netns.service'' [Unit] Description=nftables rules for netns router Documentation=man:nft(8) # Юнит, запускающий роут-демон в netns router Wants=bird.netns.service After=bird.netns.service [Service] Type=oneshot ProtectSystem=full ProtectHome=true # Укажите имя файла из шага 1 и имя netns из параметра router_netns ExecStart=/sbin/ip netns exec router /sbin/nft -f /etc/nftables/bgp-allow.nft ExecReload=/sbin/ip netns exec router /sbin/nft 'flush ruleset; include "/etc/nftables/bgp-allow.nft";' ExecStop=/sbin/ip netns exec router /sbin/nft flush ruleset RemainAfterExit=yes [Install] WantedBy=multi-user.target ===== Шаг 4. Перечитать конфигурацию systemd ===== systemctl daemon-reload ===== Шаг 5. Запустить юнит и добавить его в автозапуск ===== systemctl enable --now nftables.netns.service ===== Шаг 6. Проверить, что правила загружены в netns роутера ===== ip netns exec router nft list ruleset