Bonjour,
Je viens de me porter acquéreur du FriendlyElec R6C : cela ressemble à Raspeberry 5 avec 8Go de RAM + 32 emmc + une interface M2 PCIe pour y mettre un SSD et surtout 2 interfaces RJ45 ce qui est parfait pour faire, entre autre, un routeur.
Ayant lu à plusieurs reprises que nftables était dessiné à remplacer iptables, je me suis lancé dans l’exercice de transposer des règles iptables existantes, mises en place de la cadre de clients OpenVPN par exemple, en nftables.
Actuellement chez Free, j’envisage de passer ma Freebox en mode bridge, mais avant de traiter le sujet spécifique à la Freebox : ipv6, tunnelling ipv4 dans ipv6, next hop, router advertissement et autres joyeusetés, je souhaitais dans un premier temps voir avec vos avis éclairés, la construction des règles ci-après.
J’avoue au passage d’être à un niveau juste au-dessus de la quiche et de la buse dans ce domaine, donc tout bon conseil sera le bienvenu.
Quelques explications / indications :
-
wan0 est l’interface vers internet
-
lan0 est l’interface vers le réseau local
-
Mise en place de règles anti-DDOS reprises de règles iptables
-
On accepte les connexions entrantes pour de l’https et d’autres ports qui seront pour certains redirigés vers un haproxy et d’autres vers des @ip avec port
-
On masque le NetBios et les adresses du lan en sortie
-
On ne filtre rien en sortie pas top en termes de sécurité mais la mise en place d’un proxy n’est pas à l’ordre du jour d’une part et j’ai aussi par ailleurs des services de téléphonie sur @IP, donc avant de filter en sortie il y aurait un taff d’inventaire à faire (…)
Rien de plus pour le moment, je voudrais juste passer ma Freebox et que le R6C fasse le job de filtrage et de routage
#!/usr/sbin/nft -f
flush ruleset
add table filter
table net filter {
chain input {
type filter hook input priority 0; # Hook for incoming packets
# Accept established and related connections
ct state established,related accept
# Accept loopback interface traffic
iifname "lo" accept
# ICMP rate limiting to prevent DDoS
icmp type echo-request limit rate 10/second burst 5 packets accept
# Filtrer les dapeaux TCP bidons
tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn drop
tcp flags & (fin|syn|rst|psh|ack|urg) == syn|rst drop
tcp flags & (fin|syn|rst|psh|ack|urg) == fin|rst drop
tcp flags & (fin|syn|rst|psh|ack|urg) == fin|ack drop
tcp flags & (fin|syn|rst|psh|ack|urg) == urg drop
tcp flags & (fin|syn|rst|psh|ack|urg) == psh drop
tcp flags & (fin|syn|rst|psh|ack|urg) == none drop
# Limite le nombre de nouvelles connexions TCP
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new limit rate 60/second burst 20 accept
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new drop
# Limiter les TCP RST
tcp flags & (fin|syn|rst|psh|ack|urg) == rst limit rate 2/second burst 2 accept
tcp flags & (fin|syn|rst|psh|ack|urg) == rst drop
# Limite le nombre de nouvelles connexions TCP
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new limit rate 60/second burst 20 accept
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new drop
# Limiter les TCP RST
tcp flags & (fin|syn|rst|psh|ack|urg) == rst limit rate 2/second burst 2 accept
tcp flags & (fin|syn|rst|psh|ack|urg) == rst drop
# Bloquer les connexions entrantes sur wan0 avec des @ip invalides
iifname "wan0" ip saddr { 224.0.0.0/4, 192.168.0.0/16, 192.0.2.0/24, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16 } drop
# Atténuation des attaques SYN Flood (méthodes avec SYNPROXY)
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new tcp option maxseg size set 1460 hashseed mask 0xff,0x00 counter packets 0 bytes 0 accept
tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new tcp option maxseg size set 1460 hashseed mask 0xff,0x00 tcp flags & (fin|syn|rst|psh|ack|urg) == syn ct state new tcp flags & (fin|syn|rst|psh|ack|urg) == syn hashseed 0x00,0x00 counter packets 0 bytes 0 accept
# Rejeter les paquets ct state invalides et logguer
ct state invalid log prefix "nftables_ct.state.invalid : " drop
# Rejeter les paquets non autorisés et logguer
log prefix "nftables_Dropped.Packet : " drop
}
chain prerouting {
type nat hook prerouting priority 0; # Hook for incoming packets
# Redirection des ports
tcp dport { 443, 65327 } dnat to 192.168.1.170
tdp dport 1413 dnat to 192.168.1.16:22
tcp dport 1405 dnat to 192.168.1.15:22
# Log accepted HTTPS connections
tcp dport 443 accept log prefix "nftables_https: "
# log ssh connexions
tcp dport {1413, 1405} accept log prefix "nftables_ssh: "
# log sftp connexions
tcp dport 65327 accept log prefix "nftables_sftp: "
}
chain forward {
type filter hook forward priority 0; policy accept;
# Autoriser le trafic sortant du réseau local vers Internet
ip saddr 192.168.1.0/24 oif wan0 ct state new,related,established accept
}
chain output {
type filter hook output priority 0; policy accept;
# Bloquer les paquets sortants NetBIOS
tcp dport { 137, 138, 139 } drop
udp dport { 137, 138, 139 } drop
}
chain postrouting {
type nat hook postrouting priority 0; policy accept;
ip saddr 192.168.1.0/24 oif "wan0" masquerade
}
}