Правила ACL через nftables
Роут-демон работает в отдельном network namespace (в примерах — router), поэтому доступ к rib-интерфейсам нужно ограничивать правилами firewall внутри этого netns. firewalld для этого не подходит: его нельзя запустить вторым экземпляром в другом netns и управлять им через firewall-cmd. Поэтому для netns роутера правила задаются напрямую через nftables. Ниже они загружаются отдельным systemd-юнитом при старте системы.
В качестве бэкенда firewalld должен использоваться nftables: параметр
Все команды выполняются с правами root (через sudo).
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
Была ли полезна эта информация?