Project

General

Profile

Actions

Brique vpn

Séance du samedi 9 mars 2019.

Il s'agit d'installer sur un raspberry pi un client VPN et un hotspot wifi.

Installation du système

Télécharger le zip contenant l'image de Raspbian Lite : https://www.raspberrypi.org/downloads/raspbian/

Extraire l'image avec p7zip par exemple :

7z x nom-de-l-image-raspbian-stretch-lite.zip

Identifier le périphérique correspondant à sa carte micro SD :

sudo fdisk -l

insérer la carte micro SD et refaire la même manip, le device supplémentaire est la carte micro SD.

Copier l'image sur la micro SD (X est la lettre du device de l'étape précédente) :

sudo dd bs=4M if=/chemin-de-l-image/nom-de-l-image-raspbian-stretch.img of=/dev/sdX conv=fsync status=progress

/!\ créer un fichier vide ssh à la racine de la partition boot de la carte SD pour activer le démon SSH sur le pi

Trouver la PI sur le réseau

Ne pas brancher la PI et afficher la liste des IPS dispos sur le réseau

sudo arp-scan -l --interface wlp4s0

ici, wlp4s0 est le nom de l'interface WiFi

Autre méthode possible avec nmap (à adapter en fonction de votre IP privée) :

nmap -sP 192.168.1.*

Brancher la PI et relancer la commande précédente de votre choix. Normalement une nouvelle IP est apparue, c'est celle de votre PI.

Se connecter au PI :

ssh pi@<IP_DE_MON_PI>

Mot de passe par défaut : raspberry

Première connexion au PI

Changer le mot de passe par défaut avec la commande :

passwd

Mettre à jour du système

sudo apt update && sudo apt upgrade

Installer openvpn, hostapd et dnsmasq

sudo apt install openvpn hostapd dnsmasq

Redémarrer le PI

sudo reboot

Configuration du point d'accès

Mise en place d'un IP statique sur l'interface WiFi, éditer le fichier dhcpcd.conf avec vi, vim, nano...selon vos préférences :

sudo vi /etc/dhcpcd.conf

A la fin du fichier ajouter, avec l'IP privée de votre choix (ici 172.16.10.1) :

interface wlan0
    static ip_address=172.16.10.1/24
    nohook wpa_supplicant

Remarque : dhcpcd exécute tous les scripts du répertoire '/lib/dhcpcd/dhcpcd-hooks' dans l'ordre croissant. L'option nohook wpa_supplicant empèche le script du même nom de s'exécuter et à wpa_supplicant de prendre la main sur le WiFi.

Enregistrer et redémarrer le démon dhcpcd

sudo service dhcpcd restart

Le message suivant s'affiche : Warning: dhcpcd.service changed on disk. Run 'systemctl daemon-reload' to reload units.

Faire :

sudo systemctl daemon-reload
sudo service dhcpcd restart

Configuration du serveur DHCP, editer le fichier dnsmasq.conf

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo touch /etc/dnsmasq.conf
sudo vi /etc/dnsmasq.conf

Et y mettre :

interface=wlan0      # Interface WiFi - habituellement wlan0
  dhcp-range=172.16.10.100,172.16.10.120,255.255.255.0,24h

Ici pour wlan0, nous allons fournir des adresses IP entre 172.16.10.100 et 172.16.10.120, avec un temps de location de 24 heures.

Configuration de hostapd :

sudo touch /etc/hostapd/hostapd.conf
sudo vi /etc/hostapd/hostapd.conf

Y coller :

interface=wlan0
driver=nl80211
ssid=SonicLeHerisson
hw_mode=g
channel=6
ieee80211d=1
country_code=FR
ignore_broadcast_ssid=0
wmm_enabled=0
macaddr_acl=0
wpa_passphrase=lemotdepassedeouf
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

Je mets le détail ici car hostapd n'aime pas trop les commentaires dans le fichier de conf :

  • interface=wlan0 # l'interface utilisée par l'AP
  • driver=nl80211 # nl80211 avec tous les drivers Linux mac80211 => https://wireless.wiki.kernel.org/en/users/drivers
  • ssid=SonicLeHerisson # petit nom du hotspot
  • hw_mode=g # mode Wi-Fi (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)
  • channel=6 # le canal utilisé
  • ieee80211d=1 # limiter les fréquences utilisées à celles autorisées dans le pays
  • country_code=FR # l'indicatif du pays
  • ignore_broadcast_ssid=0 # envoyer les SSID vides dans les balises et ignorer les trames de requête de sonde qui ne le font pas
  • wmm_enabled=0 # pas de QoS
  • macaddr_acl=0 # pas d'authentification basée sur l'adresse MAC de la station
  • wpa_passphrase=lemotdepassedeouf # la phrase de passe
  • # WPA2 Personnel, AES
  • auth_algs=1
  • wpa=2
  • wpa_key_mgmt=WPA-PSK
  • rsn_pairwise=CCMP

Puis éditer '/etc/default/hostapd' pour modifier la ligne DAEMON_CONF :

sudo vi /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"

Et on démarre/redémarre tout ce beau monde fraîchement configuré :

sudo systemctl start hostapd

Le message suivant s'affiche : Failed to start hostapd.service: Unit hostapd.service is masked.

Continuer :

sudo systemctl unmask hostapd
sudo systemctl start hostapd
sudo systemctl restart dnsmasq

Remarque : A partir de maintenant, il est possible de se connecter sur le hotspot qui doit maintenant être visible, il n'y a pas encore d'accès au NET, c'est normal.

Activer le démon hostapd au démarrage et redémarrer pour vérifier si tout ce qui a était fait jusqu'à présent persiste :

sudo systemctl enable hostapd
sudo reboot

le VPN

Récupérer le fichier de configuration du VPN d'Aquilenet et le copier dans /etc/openvpn avec l'extension *.conf

scp /chemin-vers-le-fichier-de-conf/aqn.ovpn pi@<IP-DU-PI>:/tmp
sudo mv /tmp/aqn.ovpn /etc/openvpn/aqn.conf

Créer un fichier nommé secret qui contiendra le loggin et mdp du VPN :

cd /etc/openvpn && sudo touch secret
sudo chmod 600 secret

L'éditer pour y mettre loggin et mdp :

sudo vi secret
loggin-du-vpn
mot-de-passe-du-vpn

Modifier la ligne auth-user-pass du fichier aqn.conf :

sudo vi /etc/openvpn/aqn.conf
auth-user-pass secret

Tester le bon fonctionnement du VPN :

sudo systemctl start openvpn@aqn
sudo systemctl status openvpn
ifconfig
traceroute www.debian.org

Si tout est au vert, on valide le démon openvpn :

sudo systemctl enable openvpn@aqn

le Firewall : Routage, NAT...

Editer le fichier sysctl.conf

sudo vi /etc/sysctl.conf

Décommenter les lignes :

  • net.ipv4.ip_forward=1
  • net.ipv6.conf.all.forwarding=1

Et valider les modifications :

sudo sysctl --system

Créer le fichier netfilter et l'éditer :

sudo touch /etc/init.d/netfilter
sudo vi /etc/init.d/netfilter

Y coller les règles suivantes :

#!/bin/bash
# Script Netfilter
### BEGIN INIT INFO
# Provides: netfilter
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start firewall daemon at boot time
# Description: Custom Firewall scrip.
### END INIT INFO

case "$1" in
'start')
# On vide les anciennes règles
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z

/sbin/ip6tables -F
/sbin/ip6tables -X
/sbin/ip6tables -Z

# Mise en place des sécurités noyaux
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Mise en place du NAT pour permettre au réseau Wi-Fi de communiquer sur Internet
iptables -t nat -A POSTROUTING -o tun0 -s 172.16.10.0/24 -j MASQUERADE
# Par défaut, on bloque les paquets provenant d'un réseau vers un autre réseau
# On bloque ce qui arrive sur le Raspberry
# On autorise tout ce qui sort du boîtier
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P INPUT DROP
ip6tables -t filter -P FORWARD DROP
ip6tables -t filter -P OUTPUT ACCEPT
ip6tables -t filter -P INPUT DROP

# On autorise toutes les connexions en localhost (boucle locale)
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A OUTPUT -o lo -j ACCEPT

# On autorise les réponses à une connexion préalablement établie
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# On autorise tout type de flux provenant du réseau Wi-Fi à destination d'internet
iptables -t filter -A FORWARD -i wlan0 -o tun0 -s 172.16.10.0/24 -m state --state NEW -j ACCEPT

# On autorise les machines connectées au réseau Wi-Fi à se connecter sur le boîtier
iptables -t filter -A INPUT -i wlan0 -m state --state NEW -j ACCEPT
ip6tables -t filter -A INPUT -i wlan0 -m state --state NEW -j ACCEPT

# On autorise les requêtes RA et NDP vers mon Raspberry PI
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

sleep 3
echo -e "Starting firewall.. \n"
;;
'stop')
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

/sbin/ip6tables -F
/sbin/ip6tables -P INPUT ACCEPT
/sbin/ip6tables -P FORWARD ACCEPT
/sbin/ip6tables -P OUTPUT ACCEPT

sleep 3
echo -e "Stopping firewall.. \n"
;;
*)
;; 
esac
exit

Le rendre exécutable et tester les règles :

sudo chmod +x /etc/init.d/netfilter
sudo /etc/init.d/netfilter start

A partir de cet instant c'est pleinement fonctionnel même si il reste quelques angles à arrondir...! :D

Activer ces règles au démarrage :

sudo update-rc.d netfilter defaults
sudo update-rc.d netfilter enable

Valider que l'ensemble de ces réglages sont conservés après un ultime reboot :

sudo reboot

Remarque après ce dernier reboot le ssh est uniquement fonctionnel depuis le WiFi.

ENJOY !

Updated by david.daugareil 12 months ago · 38 revisions