Ce post fera un peu guise de présentation en détaillant mon problème et le pourquoi du comment.
Depuis de nombreuses années je fais de l’hébergement de mail, de nextcloud, de site web… en utilisant un serveur dédié qui a une IPv4 et une IPv6, config réseau très basique. C’est pour cette raison que je ne suis pas un grand connaisseur du routage IP. En gros, je sais qu’une gateway est nécessaire pour passer d’un réseau à un autre, ça s’arrête là.
Comme le prix des dédiés augmentent j’ai décidé d’héberger tout ces petits services chez moi derrière ma connexion free. Sauf que free (ou n’importe quel autre BOFS d’ailleurs) et le mail, c’est pas top. C’est pourquoi j’ai décidé de prendre un vpn chez ARN.
Je souhaite n’utiliser ce VPN que pour le transport du mail. En attendant d’avoir déménagé tous les services chez moi, j’ai voulu mettre en place le vpn sur le serveur dédié. Ça fera une chose de faite.
J’ai déjà fait des tests qui semblent concluants dans le sens où j’ai trouvé la bonne conf à postfix pour qu’il envoie le mail depuis les IP du vpn. Mais je n’avais pas vu que, quand le vpn est actif, seules ses IP sont routées. En effet, je ne peux plus pinguer ou accéder à mon serveur en utilisant les IP dédiées depuis l’extérieur.
Sauriez-vous me dire comment je pourrais configurer le VPN de telle sorte que mon serveur soit accessible via les IP du vpn et celles dédiées svp ?
Salut et bienvenu,
Si tu utilises un VPN wireguard, ton soucis c’est qu’une route par défaut est ajoutée pour rediriger tous les paquets à destinations d’une IP dans le range 0.0.0.0/0 (c’est à dire toute) à travers l’interface du tunnel.
Pour éviter ça, il faut que tu édites le fichier de configuration pour retirer:
Merci pour ta réponse. J’ai donc testé en supprimant cette ligne, malheureusement il devient impossible de contacter le serveur de l’extérieur via les IP du VPN. Merci pour ces précieux liens que je continue de potasser.
Je continue de chercher, il semblerait qu’en fait la suppression de “AllowedIPs” est bien un début de réponse. Ensuite il faudrait marquer les paquets spécifiques pour les router vers la bonne interface. Si je comprends le principe, je patauge complètement… mais je trouverai tôt ou tard
Je n’ai toujours pas trouvé mais je trouve des pistes.
Finalement je pourrais me passer de marquer des paquets. À la place je peux simplement les router en fonction de la source (voir cet article). L’idée serait tout simplement que toutes les connexions entrantes sur l’ip du vpn, ressortent par la même ip.
Voilà ce que j’ai fait pour l’instant:
echo "100 smtp25" >> /etc/iproute2/rt_tables
ip rule add to $ip_vpn table smtp25
Mais mon cerveau ayant déjà un peu de mal avec le routage, a encore plus de mal avec les commandes liés au routage. Je ne sais donc pas quelles commandes je dois saisir ensuite pour poursuivre. Peut-être même que ma commande ‘ip’ n’est pas la bonne. Si jamais l’un·e d’entre vous le saurait, ce serait super
PS: je précise que j’ai activé le vpn en commentant la ligne ‘AllowedIPs’.
Problème résolu grâce notamment à pbd sur chan irc de #fdn, merci à lui et à gratador. Merci à toi aussi @ljf
Maintenant place aux explications:
Tout d’abord le vrai souci est que j’activais le vpn par la commande “wg-quick” qui ajoute ses propres règles de filtrages et impose ses routes par défaut. Alors qu’en réalité ‘AllowedIPs’, absolument nécessaire, ne change en lui-même rien à la route, c’est vraiment wg-quick qui les manipulent.
Grâce à pdb, j’ai rédigé ce script maison qui, j’espère, pourra vous aider:
#!/bin/bash
vpn_ip4="<ipv4 du vpn>/32"
vpn_ip6="<ipv6 du vpn>/128"
vpn_if="wgID"
vpn_table="vpnID"
wg_conf=/etc/wireguard/wgID.conf
mtu=1450
vpn_start() {
echo -n "Starting VPN... "
if [ ! -f /etc/iproute2/rt_tables ] || [ -z "$(grep $vpn_table /etc/iproute2/rt_tables)" ]; then
echo "La table ${vpn_table} n’existe pas:"
echo "echo \"100 ${vpn_table}\" >> /etc/iproute2/rt_tables"
exit 1
fi
# On prépare l'interface
ip link add dev ${vpn_if} type wireguard
# On spécifie les IP
ip -4 address add ${vpn_ip4} dev ${vpn_if}
ip -6 address add ${vpn_ip6} dev ${vpn_if}
# On ajoute la conf wireguard
wg setconf ${vpn_if} ${wg_conf}
# C'est parti
ip link set mtu ${mtu} up dev ${vpn_if}
# Les routes par défaut ne sont pas changées,
# donc rien ne passe par les IP du vpn par défaut.
# C'est pourquoi on ajoute des règles pour que tout
# ce qui transite par le vpn soit routé vers le vpn.
ip -4 rule add from ${vpn_ip4} lookup ${vpn_table}
ip -6 rule add from ${vpn_ip6} lookup ${vpn_table}
ip -4 route add default dev ${vpn_if} table ${vpn_table}
ip -6 route add default dev ${vpn_if} table ${vpn_table}
echo "done."
}
vpn_stop() {
echo -n "Stopping VPN... "
ip -4 rule delete table ${vpn_table}
ip -6 rule delete table ${vpn_table}
ip addr flush dev ${vpn_if}
ip link del dev ${vpn_if}
echo "done."
}
case $1 in
start) vpn_start ;;
stop) vpn_stop ;;
restart) vpn_stop ; sleep 1 ; vpn_start ;;
*) echo "$0 start|stop|restart|status"
esac
Notez qu’en n’utilisant pas wg-quick, il est nécessaire de commenter les lignes “Address” et “MTU” du fichier de conf.
Grâce à ce script, tous les paquets sortants ou entrants par le vpn seront automatiquement routés vers le vpn. Les autres utiliseront la route par défaut.
Et mon serveur de mail passe maintenant nickel par le VPN
Pour faire simple, avec ce script, les routes par défaut ne changent pas, donc les paquets transitent via les IP de l’interface eth0. En revanche tous les paquets qui transitent par les IP du VPN ont pour route ces mêmes IP. Quand des paquets entrent sur l’IPv4 du VPN, les paquets en réponse sortiront par cette même IPv4 au lieu d’utiliser la route par défaut.