Данная конфигурация nftables предназначена для Linux-хоста, выполняющего роль пограничного маршрутизатора и сервера контейнеризации.
Реализуется следующий функционал:
- Stateful firewall с политикой DROP по умолчанию;
- Фильтрация INPUT / FORWARD / OUTPUT;
- NAT и маршрутизация для WireGuard, IKEv2/IPsec и ZeroTier;
- Проброс портов (DNAT) к сервисам внутри LXC-сети;
- Базовая защита loopback и invalid-пакетов.
Файл рассчитан на загрузку через /etc/nftables.conf и использование совместно с systemd.
Полное содержимое файла nftables
#!/sbin/nft -f
flush ruleset
##
## VARIABLES
##
define wan_ip = X.X.X.X
define wan = "wan_if"
define lxc = "lxc_bridge"
define wg = "wg0"
define ike_net = 10.1.1.0/24
define wg_net = 10.1.2.0/24
define lxc_net = 10.0.3.0/24
define monitoring_hosts = { A.A.A.A, B.B.B.B }
##
## FILTER TABLE
##
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state invalid counter drop comment "drop invalid packets"
ct state { established, related } counter accept comment "allow established/related"
iif lo accept comment "allow loopback"
iif != lo ip daddr 127.0.0.0/8 counter drop
iif != lo ip6 daddr ::1/128 counter drop
ip protocol icmp counter accept
ip6 nexthdr icmpv6 counter accept
tcp dport 22 ip daddr $wan_ip counter accept comment "SSH"
tcp dport 5201 ip daddr $wan_ip counter accept comment "iperf3"
udp dport 59841 ip daddr $wan_ip counter accept comment "wireguard"
tcp dport 10050 ip saddr $monitoring_hosts ip daddr $wan_ip counter accept comment "monitoring"
counter comment "count dropped packets"
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state invalid counter drop
ct state { established, related } counter accept
ip saddr $ike_net oifname $wan counter accept comment "ikev2 forward"
ip daddr $lxc_net iifname $wan oifname $lxc counter accept comment "wan -> lxc"
iifname $lxc oifname $wan counter accept comment "lxc -> wan"
iifname $lxc oifname $lxc counter accept comment "lxc intra"
iifname $wg oifname $wan counter accept comment "wireguard forward"
counter comment "count dropped packets"
}
chain output {
type filter hook output priority 0; policy accept;
counter
}
}
##
## NAT TABLE
##
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
ip daddr $wan_ip tcp dport 80 counter dnat to 10.0.3.2:80 comment "web"
ip daddr $wan_ip tcp dport 443 counter dnat to 10.0.3.2:443 comment "web"
ip daddr $wan_ip udp dport 500 counter dnat to 10.0.3.7:500 comment "ipsec"
ip daddr $wan_ip udp dport 4500 counter dnat to 10.0.3.7:4500 comment "ipsec"
}
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
ip saddr $ike_net oifname $wan masquerade comment "ikev2 nat"
ip saddr $wg_net iifname $wg oifname $wan masquerade comment "wg nat"
ip saddr $lxc_net oifname $wan masquerade comment "lxc nat"
}
}
TAGS: nftables, firewall, NAT, LXC, WireGuard, IPsec, Linux