logo rss

Mozilla VPN - Comment créer une passerelle VPN

⚠️ Depuis la version 2.4.1, le Mozilla VPN ajoute automatiquement des règles nftables qui bloquent le trafic routé. ⚠️

Logo Mozilla VPN

J'ai récemment acheté une licence du tout nouveau VPN Mozilla principalement car je trouve que c'est un bon moyen de soutenir la fondation.

Pour le moment le client VPN est compatible avec Windows 10, macOS, Android, iOS et Ubuntu. Ce qui est déjà pas si mal mais pas suffisant pour moi dans le sens ou j'utilise ArchLinux. J'ai donc créé dans mon réseau une passerelle VPN sous Ubuntu pour me permettre d'utiliser le VPN avec des machines non compatibles.

⚠️ La licence Mozilla VPN permet de connecter jusqu'à 5 périphériques. Le but ici n'est pas de contourner cette limite. ⚠️

Architecture Réseau

Architecture Passerelle VPN
Mon architecture réseau.

Ubuntu (Passerelle VPN)

logo Ubuntu

⚠️ Le VPN Mozilla fonctionne sur les versions d'Ubuntu Focal Fossa 20.04 et Bionic Beaver 18.04 uniquement.

Installation du client Mozilla VPN

  • Ajouter les dépots mozilla et lancer l'installation :
user@ubuntu:~$ sudo add-apt-repository ppa:mozillacorp/mozillavpn
user@ubuntu:~$ sudo apt-get update
user@ubuntu:~$ sudo apt-get install mozillavpn
  • Lancer le client Mozilla VPN :
user@ubuntu:~$ mozillavpn
  • Activer Mozilla VPN :
Mozilla VPN | Activer le VPN

IPv4

Activer l'ip forwarding

  • De façon Temporaire :
user@ubuntu:~$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
  • Pour le faire de façon permanente, éditer le fichier /etc/sysctl.conf et décommenter cette ligne :
net.ipv4.ip_forward=1
  • Charger les modifications :
user@ubuntu:~$ sudo sysctl -p

Créer une règle masquerade netfilter

  • Créer une règle NAT qui va masquer le trafic sortant ipv4 au niveau de l'interface moz0 :
user@ubuntu:~$ sudo iptables -t nat -A POSTROUTING -o moz0 -j MASQUERADE

IPv6

Récupérer l'adresse ipv6 locale

  • Noter l'adresse ipv6 :
user@ubuntu:~$ ip -6 addr sh
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet6 2001:db8::/64 scope global dynamic mngtmpaddr 
       valid_lft 86187sec preferred_lft 14187sec
    inet6 fe80::fe80::aaff:874a:dead:beef/64 scope link 
       valid_lft forever preferred_lft forever

Activer l'ip forwarding

  • De façon Temporaire :
user@ubuntu:~$ echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/forwarding
  • Pour le faire de façon permanente, éditer le fichier /etc/sysctl.conf et décommenter cette ligne :
net.ipv6.conf.all.forwarding=1
  • Charger les modifications :
user@ubuntu:~$ sudo sysctl -p

Créer une règle masquerade netfilter

  • Créer une règle NAT qui va masquer le trafic sortant ipv6 au niveau de l'interface moz0 :
user@ubuntu:~$ sudo ip6tables -t nat -A POSTROUTING -o moz0 -j MASQUERADE

ArchLinux (Client)

Logo Archlinux

IPv4

Ici on pourra au choix router l'intégralité du trafic ou utiliser le Port Based Routing, qui consiste à ne router uniquement que certains protocoles à passer par notre passerelle Ubuntu.

Port Based Routing

PBR consiste à marquer les trames que l'on veut router sur vers notre passerelle VPN. Seules les trames marquées avec la valeur 0x80 passeront par le VPN.

VPN table
  • Création d'une table vpn :
root@arch:~# echo "200	vpn" >> /etc/iproute2/rt_tables
root@arch:~# ip rule add fwmark 0x80 table vpn
  • Ajouter la passerelle par défault pour notre table vpn :
root@arch:~# ip route add default via 172.31.0.200 dev ens160 table vpn
  • Vérifier l'entrée de notre table vpn :
root@arch:~# ip route list table vpn
default via 172.31.0.200 dev ens160
règles nftables

Pour cet exemple nous marquerons les flux http et https.

  • Créer une chaine nftables MANGLE :
root@arch:~# nft add chain ip filter MANGLE { type route hook output priority -150\; policy accept \; }
  • Marquer toutes les trames http et https sauf celles destinées à notre LAN (172.31.0.0/24, 10.0.0.0/24) :
root@arch:~# nft add rule ip filter MANGLE tcp dport { 80, 443 } ip daddr \!= { 172.31.0.0/24, 10.0.0.0/24 } meta mark set 0x80 counter
  • Exemple si l'on souhaite marquer également toutes les trames tcp sortantes :
root@arch:~# nft add rule ip filter MANGLE tcp sport \>= 1024 ip daddr \!= { 172.31.0.0/24, 10.0.0.0/24 } meta mark set 0x80 counter
  • Exemple si l'on souhaite marquer également toutes les trames udp sortantes :
root@arch:~# nft add rule ip filter MANGLE udp sport \>= 1024 ip daddr \!= { 172.31.0.0/24, 10.0.0.0/24  } meta mark set 0x80 counter

Router l'ensemble du traffic

Plus simple, on peut simplement router tout le traffic vers la passerelle VPN :

  • Supprimer la route par défaut :
root@arch:~# route del default
  • Ajouter la route par défaut :
root@arch:~# route add default via 172.31.0.200 dev ens160

Vérification

  • Afficher l'adresse ipv4 actuelle :
root@arch:~# curl ipinfo.io/ip

IPv6

Changer la route par défaut

  • Supprimer la route par défaut :
root@arch:~# ip -6 route del default
  • Ajouter la route par défaut :
root@arch:~# ip -6 route add default via fe80::aaff:874a:dead:beef dev ens160 metric 1

Vérification

  • Afficher l'adresse ipv6 actuelle :
root@arch:~# telnet -6 ipv6.telnetmyip.com

Récupérer les adresses ips grace à une WebExtension

  • J'ai développé une petite WebExtension pour récupérer en un coup d'œil les adresses ipv4 et ipv6, elle peut être téléchargé ici :
shebangtheip webextension to get current ipv4 and ipv6 addresses
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact