{{indexmenu_n>5}}
====== ACL rules with nftables ======
The routing daemon runs in a separate network namespace (''router'' in the examples), so access to rib interfaces must be restricted with firewall rules inside this netns. firewalld is not suitable for this: it cannot be run as a second instance in another netns and managed with ''firewall-cmd''. Therefore, rules for the router netns are set directly with nftables. Below, they are loaded at system startup by a separate systemd unit.
firewalld must use nftables as its backend: the ''FirewallBackend=nftables'' parameter in ''/etc/firewalld/firewalld.conf''.\\
All commands are run as root (via ''sudo'').
===== Step 1. Create the rules file =====
File: ''/etc/nftables/bgp-allow.nft''. The file name can be anything; it is specified later in the systemd unit.
#!/usr/sbin/nft -f
flush ruleset
# IP addresses of BGP peers allowed to connect
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
# Allow all traffic from BGP peers
ip saddr $bgp_ipv4_peers accept
# Stricter option: allow only BGP (TCP 179) from peers
#tcp dport 179 ip saddr $bgp_ipv4_peers accept
}
}
The chain policy is ''drop'': everything that is not explicitly allowed is dropped. If other protocols are used in the router netns, add rules that allow them. For example:
* for OSPF — ''ip protocol ospf accept'';
* for IPv6 — ''meta l4proto ipv6-icmp accept'', otherwise Neighbor Discovery stops working.
The ''flush ruleset'' command clears rules only in the netns where the file is executed. The main system rules are not affected.
===== Step 2. Restrict file permissions =====
chmod 600 /etc/nftables/bgp-allow.nft
===== Step 3. Create a systemd unit =====
File: ''/etc/systemd/system/nftables.netns.service''
[Unit]
Description=nftables rules for netns router
Documentation=man:nft(8)
# Unit that starts the routing daemon in netns router
Wants=bird.netns.service
After=bird.netns.service
[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
# Specify the file name from step 1 and the netns name from the router_netns parameter
ExecStart=/sbin/ip netns exec router /usr/sbin/nft -f /etc/nftables/bgp-allow.nft
ExecReload=/sbin/ip netns exec router /usr/sbin/nft 'flush ruleset; include "/etc/nftables/bgp-allow.nft";'
ExecStop=/sbin/ip netns exec router /usr/sbin/nft flush ruleset
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
===== Step 4. Reload the systemd configuration =====
systemctl daemon-reload
===== Step 5. Start the unit and enable it at startup =====
systemctl enable --now nftables.netns.service
===== Step 6. Check that the rules are loaded in the router netns =====
ip netns exec router nft list ruleset