Содержание

Правила 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