Projet

Général

Profil

Brique vpn » Historique » Révision 32

Révision 31 (david.daugareil, 10/03/2019 17:57) → Révision 32/38 (david.daugareil, 10/03/2019 18:02)

# 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 
 ~~~ 

 Tester la 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 
 iptables -F 
 iptables -X 
 iptables -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 
 ~~~