{{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