Déclarer un VLAN sur raspberry PI OS/Debian

J’ai eu besoin récemment d’avoir plusieurs subnets sur mes petites boites. Pour ce faire, plutot que de faire du de l’IP multinetting, j’ai isolé chaque subnet sans un VLAN.

voici comment rajouter un VLAN:

  1. Installer le package “vlan”
  2. Créer une interface virtuelle sur l’interface réseau physique pour le VLAN (ici le VLAN 200 sur eth0)
  3. Configurer l’IP sur l’interface virtuelle eth0.200
  4. Démarrer l’interface virtuelle ou rebooter le serveur.
### étape 1
pi@abcd-happy-2:~ $ sudo apt-get install vlan
Reading package lists… Done
...

### étape 2
pi@abcd-happy-2:~ $ sudo vi /etc/network/interfaces.d/vlans

auto eth0.200
iface eth0.200 inet manual
vlan-raw-device eth0

### étape 3
pi@abcd-happy-2:~ $ sudo vi /etc/dhcpcd.conf
interface eth0.200
static ip_address=192.168.1.247/24
static routers=192.168.1.2
static domain_name_servers=208.67.222.222 208.67.220.220

### étape 4
pi@abcd-happy-2:~ $ sudo ifup eth0.200

Discussion sur l’étape 4:
j’ai perdu la main sur le serveur en montant l’interface. Cela dit, j’ai pu accéder à ma nouvelle IP en terminant ma configuration réseau. Depuis mon serveur, j’ai pu accéder à la gateway de mon réseau “par défaut” et après à mon IP “par défaut” depuis mon réseau… bref… je ne sais pas trop pourquoi. Un reboot aurait sans doute eu un effet plus… déterministe.

Configuration passerelle VPN

Introduction

Cet article explique comment monter une passerelle VPN PPTP (très simple à mettre en oeuvre) sur Linux Debian. Il y a pleins d’article sur le sujet sur internet. Pour une raison x ou y, il a fallu que j’en consulte beaucoup pour avoir une solution fonctionnelle de bout en bout.

Une passerelle vous permet de router le traffic de votre périphérique au travers de la passerelle. la passerelle n’est pas un point terminal. elle doit donc être capable de faire suivre (forwarder) le traffic au prochain “saut” (HOP)

Trois éléments sont importants:

  • installation et configuration du serveur de tunnel PPTP
  • configuration du serveur pour l’autoriser a forwardé le traffic entre deux interfaces réseau
  • configuration du firewall

Installation et configuration du serveur PPTP

Installez le package du serveur pptpd depuis un compte utilisateur autorisé ou depuis de compte root.

compteadmin@vps123456:~$ sudo apt-get install pptpd
....
compteadmin@vps123456:~$

Editez le fichier de configuration /etc/pptpd.conf pour ajouter la configuration réseau a appliquer. Ici, on autorise la creation de 10 tunnels. Les IP d’interconnection seront sur le reseau 192.168.5.0/25 dans notre exemple. Attention: le subnet a choisir doit etre différents de celui du reseau du PC et du réseau de la gateway. c’est une interconnection. Donc n’importe quel subnet pourrait etre mis. Cela dit, on préfere utiliser des IP dans les réseaux “brulés” 10.0.0.0/8 ou 192.168.0.0/16. Mais ils sont souvent utilisés par les box ou les réseaux d’entreprise.

compteadmin@vps123456:~$ sudo vi /etc/pptpd.conf
....

localip 192.168.5.5-14
remoteip 192.168.5.235-244

compteadmin@vps123456:~$ 

Editez le fichier de configuration /etc/ppp/pptpd-options pour modifier les options des tunnels

compteadmin@vps123456:~$ sudo vi /etc/ppp/pptpd-options
....
ms-dns 8.8.8.8
ms-dns 8.8.4.4
nobsdcomp
noipx
mtu 1490
mru 1490


compteadmin@vps123456:~$ 

Certaines configurations sur internet indiquent que l’on peut indiquer des valeurs pour mtu et mru. cela dit, en fonction des configurations des réseaux ou est configuré votre client VPN, ces valeurs ne sont pas adéquates.

Les comptes utilisateurs sont créés dans le fichier /etc/ppp/chap-secrets. les droits de ce fichier sont réservés uniquement a root, sinon cela représenterait une faille de sécurité. Il est important de respecter le format: les champs doivent être séparés par un caractère de tabulation ou un/des espaces Voici un exemple de compte:

compteadmin@vps123456:~$ sudo vi chap-secrets
....
# client        server  secret                  IP addresses

nomutilisateur  *       motdepasseutilisateur   *

compteadmin@vps123456:~$ sudo pptpd restart

compteadmin@vps123456:~$

Autoriser le serveur à forwarder les données

Par défaut, un serveur ne se compte pas comme un routeur et les packets ne sont pas forwardable d’une interface vers une autre:

compteadmin@vps123456:~$ sudo cat /proc/sys/net/ipv4/ip_forward
0
compteadmin@vps123456:~$ 

Vous pouvez écrire la valeur 1 dans le fichier up_forward pour activer le routage mais cela ne sera par persistent: au prochain redémarrage du serveur, la valeur sera de nouveau écrasées. Pour cela, nous allons modifier les paramètres du serveur et les appliquer:

compteadmin@vps123456:~$ sudo vi /etc/sysctl.conf
.....
net.ipv4.ip_forward=1
compteadmin@vps123456:~$ sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1
compteadmin@vps123456:~$

Configurer le firewall

Le firewall a un role essentiel: celui de natter le traffic provenant du tunnel avant d’être envoyé vers la route par defaut du serveur. Sans cela, point de salut: il serait impossible de recevoir les packets en réponse.

Voici les commandes necessaires pour la configuration du firewall dans notre exemple de configuration. Le traffic est natté vers l’interface ens3 de mon serveur. Cela pourrait être eth0. Utilisez ifconfig pour récupérer la bonne valeur.

compteadmin@vps123456:~$ sudo iptables -I INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT
compteadmin@vps123456:~$ sudo iptables -I INPUT -p gre -j ACCEPT
compteadmin@vps123456:~$ sudo iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
compteadmin@vps123456:~$ sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -s 192.168.5.0/24 -j TCPMSS  --clamp-mss-to-pmtu

compteadmin@vps123456:~$ 

La première règle autorise le traffic entrant sur le port 1723 de pptp.

la seconde règle autorise le traffic GRE pour les tunnels.

La troisième règle natte le traffic vers l’inteface réseau ens3

La quatrième règle … mystère.

Pour les rendre persistente, ajoutez les a votre script de configuration du firewall trouvée sur internet et modifiée.

#!/bin/sh

### BEGIN INIT INFO
# Provides:          start and stop iptable
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start and stop iptable with rules
# Description:       start and stop uptables with rules
### END INIT INFO

FW_start() {
echo "[Démarrage du pare-feu]"

# Supprime tous les filtres
iptables -F
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F

# Ne pas casser les connexions déjà établies
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# SSH
iptables -t filter -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 2222 -j ACCEPT

# PPTP
iptables -I INPUT -p tcp --dport 1723 -m state --state NEW -j ACCEPT
iptables -I INPUT -p gre -j ACCEPT
iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -s 192.168.5.0/24 -j TCPMSS  --clamp-mss-to-pmtu

echo "Filtrages [OK]"

# Attribut une politiques "ACCEPT" aux tables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT

echo "Politiques [OK]"
}


FW_stop() {
echo "[Arret du pare-feu]"

# Supprime tous les filtres
iptables -F
iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F

# Attribut une politiques "ACCEPT" aux tables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
}

W_restart() {
FW_stop;
sleep 2;
FW_start;
}


case "$1" in
'start')
FW_start
;;

'stop')
FW_stop
;;

'restart')
FW_restart
;;

'status')
iptables -L
iptables -t nat -L
iptables -t mangle -L
;;

*)
echo "Usage: firewall {start|stop|restart|status}"
;;
esac