VPN debian 12 probleme avec nftables

Bonjour,

Suite a la migration du serveur qui gère le vpn de notre chaton (a usage strictement interne) vers debian 12, le dit VPN n’est plus fonctionnel.

Comme je voulais de toute façon passer a WireGuard j’en ai profité pour monter un nouveau serveur vpn et la c’est la tuile. Autant la partie VPN marche très bien (pas de soucis pour me connecter dessus et l’utiliser pour me connecter en SSH au serveur a travers celui-ci) autant la partie routeur ne marche pas du tout (impossible de me connecter a une autre machine du réseau).

Je soupçonne fortement (mais sans avoir trouvé de moyen de le prouver) que le problème est la MASQUERADE ne fonctionne pas. Toutes les documentations que j’ai trouvé sont pour iptables sauf que debian 12 utilises nftables (avec une couche de compatibilité pour manger les commandes iptables). J’ai essayé aussi bien avec les commandes iptables (qui ne fonctionnent pas) qu’en essayant d’écrire une conf nftables qui me semblait cohérente (mais la documentation de ces outils est assez horrible si on ne sait pas déjà s’en servir) mais rien n’y fait je ne peux pas ping un serveur du réseau.

ci joint la conf nftable que j’ai mis en place:

table ip wg-quick-wg0 {
	chain preraw {
		type filter hook prerouting priority raw; policy accept;
		iifname != "wg0" ip daddr 192.168.153.1 fib saddr type != local drop
	}

	chain premangle {
		type filter hook prerouting priority mangle; policy accept;
		meta l4proto udp meta mark set ct mark
	}

	chain postmangle {
		type filter hook postrouting priority mangle; policy accept;
		meta l4proto udp meta mark 0x0000ca6c ct mark set meta mark
	}

	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
		oif "ens18" masquerade
	}
}

et la conf nftables généré avec els commandes iptables:

table ip wg-quick-wg0 {
	chain preraw {
		type filter hook prerouting priority raw; policy accept;
		iifname != "wg0" ip daddr 192.168.153.1 fib saddr type != local drop
	}

	chain premangle {
		type filter hook prerouting priority mangle; policy accept;
		meta l4proto udp meta mark set ct mark
	}

	chain postmangle {
		type filter hook postrouting priority mangle; policy accept;
		meta l4proto udp meta mark 0x0000ca6c ct mark set meta mark
	}
}
# Warning: table ip nat is managed by iptables-nft, do not touch!
table ip nat {
	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
		oifname "ens18" counter packets 0 bytes 0 masquerade
	}
}

Du coup si quelqu’un a l’aise avec nftables peut m’aider, la j’avoue que je suis un peu paumé.

PS: bien entendu j’ai configuré net.ipv4.ip_forward = 1

Par curiosité que donne: iptables-save ?

dans le premier cas rien (probablement parceque je ne passe pas iptables-nft pour générer les regles mais directement par nft)
dans le second:

# Generated by iptables-save v1.8.9 (nf_tables) on Tue Jul 11 20:12:59 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens18 -j MASQUERADE
COMMIT
# Completed on Tue Jul 11 20:12:59 2023

Comme je l’ai dit iptables n’existe plus dans debian 12, il y a juste une compatibilité (probablement partielle) fournie a travers iptables-nft

La config de nftables et de wireguard est normalement assez simple.
Après cela dépends essentiellement de la configuration de base et de ce que l’on veut réellement faire.

Dans cet exemple de config partielle :

  • wg0 correspond à l’interface Wireguard
  • 10.1.2.0/24 correspond à la plage réseau défini pour le réseau Wireguard
  • enp1s0 correspond à l’interface connectée à internet
table inet filter {
    chain input {
        # --- Rejeter tout le traffic par défaut
        type filter hook input priority filter; policy drop;
        
        # Wireguard en accord avec le endpoint configurer dans wireguard
        udp dport 51820 accept
        # Wireguard dns
        iifname wg0 udp dport 53 ip saddr 10.1.2.0/24 accept
    }
    chain output {
        # --- Rejeter tout le traffic par défaut
        type filter hook output priority filter; policy drop;

        # Wireguard en accord avec le endpoint configurer dans wireguard
        udp dport 51820 accept
        # Wireguard dns
        iifname wg0 udp dport 53 ip daddr 10.1.2.0/24 accept
    }
    chain forward {
         # --- Rejeter tout le traffic par défaut
         type filter hook forward priority filter; policy drop;

        # Wireguard transfert traffic to wan internet
        iifname wg0 oifname enp1s0 accept
    }
}
table inet nat {
    chain POSTROUTING {
        type nat hook postrouting priority 100;

        # Wireguard faire passer le traffic comme si provenant de l'interface internet
        oifname enp1s0 ip saddr 10.1.2.0/24  masquerade
    }
}

EDIT 14/07 : mise à jour pour préciser que dans la partie Input, output et forward j’ouvrais les flux car je suis en policy drop par défaut et ajout des accept que j’avais oublié sur certaines lignes que j’ai vu en relisant.

1 « J'aime »

Merci, je le teste ce weekend.

Tu pourrais m’expliquer la différence entre ip et inet ? parce que toute la partie

table ip wg-quick-wg0 {
	chain preraw {
		type filter hook prerouting priority raw; policy accept;
		iifname != "wg0" ip daddr 192.168.153.1 fib saddr type != local drop
	}

	chain premangle {
		type filter hook prerouting priority mangle; policy accept;
		meta l4proto udp meta mark set ct mark
	}

	chain postmangle {
		type filter hook postrouting priority mangle; policy accept;
		meta l4proto udp meta mark 0x0000ca6c ct mark set meta mark
	}
}

(donc dans ip) est généré par wp-quick et n’a rien a voir avec ce que je peux entrer comme conf.

Oui c’est très simple ip correspond à ipv4, ip6 à ipv6 et inet à ipv4 et ipv6

Un des gros avantages de nftables est d’unifier la dual stack ipv4 et ipv6. Ce qui est un énorme gain en temps de cerveau disponible :smiley_cat:
Qui d’entre vous sera au camp chaton ? Pour présenter|proposer un atelier nftables ?

1 « J'aime »

Oui et beaucoup d’autres éléments/

La documentation est assez bien faite, on y trouve pas mal d’information dont le schéma présent sur cette page Netfilter hooks - nftables wiki pour présenter la partie Ingress mais qui permet en fait de voir tout le fonctionnement de chaque couche.

Je ne serais pas au Camp mais il serait effectivement intéressant qu’il y ai un atelier sur ce sujet.

1 « J'aime »

Merci pour les infos (et le lien vers la doc) mais le problème n’était pas là du tout. J’avais mal configuré le client (j’avais fait une typo dans un range d’adresses à faire passer dans le vpn).

Je finis de faire propre dans les fichiers de confs et je le rajoutes a ce message (au cas ou quelqu’un aurait le même problème)