Projet: Créer un pont openvpn dont la connexion internet est sur le wifi et le réseau local sur le lan.
1.Postulat
Nous utilisons un Raspberry Pi sous Alpine Linux.
Le serveur OpenVPN est déjà configuré.
Cela va permettre de connecter un périphérique uniquement Ethernet via Wi-Fi, et d’autre part, d’effectuer un rebond via cette passerelle depuis le réseau VPN pour y accéder en SSH et atteindre le dispositif final par rebond SSH.
L’avantage du naté est de n’avoir aucune configuration particulière au client côté serveur. Le désavantage est qu’il faudrait se connecter au serveur vpn puis au pont intermédiaire pour finir par accéder au client final.
2.Topologie
IPV4
1 |
Endpoint client - eth0(192.168.240.X/24) <--> eth0 (192.168.240.1/24) - Connector - tun0(10.8.0.X/24) <--> tun0(10.8.0.1/24) - VPNSERVER - ens192(X.X.X.X/32) |
IPV6
1 |
Endpoint client - eth0(fd43:43:43:43::X/112) <--> eth0 (fd43:43:43:43::1/112) - Connector - tun0(fd62:62:52:52::X/112) <--> tun0(fd62:62:52:52::1/112) - VPNSERVER - ens192(X::X/64) |
2.Installation de alpine linux sur un raspberry pi zero 2w
Sur un poste Windows avec accès à Internet, rendez-vous sur la page : https://www.alpinelinux.org/downloads/.
Téléchargez, dans la section Raspberry Pi, le lien pour l’image aarch64 version .img.gz.
Installez le logiciel BalenaEtcher, puis flashez votre carte SD avec cette image.
Vous pouvez aussi télécharger le fichier img.gz, le dézipper avec 7zip pour obtenir le fichier .img puis le flasher avec l’outil d’image raspberry pi.
Attention, il m’est apparu qu’il faut faire parfois plusieurs tentatives avant d’avoir une carte sd fonctionnelle…
Lancez setup-alpine pour effectuer une configuration minimale afin de pouvoir vous connecter à Internet et installer le serveur SSH OpenSSH.
Attention, veuillez utiliser une interface ethernet pour cette configuration.
Le wifi semble mal gérer pour setup-alpine.
Attention, clavier US pour cette démarche.
La suite peut se faire en SSH depuis un poste du même réseau.
3.Ajout des paquets et configurations
Après avoir configuré le système et la connexion Wi-Fi avec setup-alpine.
!!!Attention : toute modification sera perdue après un redémarrage si vous ne la validez pas avec la commande « lbu commit ».
Effectuez vos modifications et, si elles fonctionnent, enregistrez-les avec cette commande.
Si vous rencontrez un problème, vous pouvez toujours redémarrer sans faire le lbu commit, et le système sera restauré dans sa version précédente.
nano /etc/network/interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
auto lo iface lo inet loopback auto wlan0 iface wlan0 inet dhcp iface wlan0 inet6 auto auto eth0 iface eth0 inet static address 192.168.240.1 netmask 255.255.255.0 iface eth0 inet6 static address fd43:43:43:43::1 netmask 112 |
Commandes à exécuter:
1 2 3 4 5 6 |
apk add openssh apk add wpa_supplicant apk add nano apk add iptables apk add dnsmasq apk add openvpn |
1 |
wpa_passphrase 'ExampleWifiSSID' 'ExampleWifiPassword' > /etc/wpa_supplicant/wpa_supplicant.conf |
nano /etc/wpa_supplicant/wpa_supplicant.conf
1 2 3 4 |
network={ ssid="MonReseauWifi" psk=quelquechosegenereparsetup-apline } |
nano /etc/openvpn/openvpn.conf
Mettre le profil généré avec openvpn-install.sh
nano /etc/dnsmasq.conf
chercher la ligne « #interface= » et mettre en dessous « interface=eth0 »
nano /etc/dnsmasq.d/eth0.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# DHCP configuration # log-dhcp pour voir dans /var/log/messages log-dhcp dhcp-range=192.168.240.100,192.168.240.200,12h dhcp-option=option:netmask,255.255.255.0 dhcp-option=option:router,192.168.240.1 dhcp-option=option:dns-server,192.168.240.1 dhcp-range=fd43:43:43:43::02,fd43:43:43:43::ff,112,12h dhcp-option=option6:dns-server,fd43:43:43:43::1 enable-ra # DNS configuration domain=local.lan local=/local.lan/ |
nano /etc/sysctl.d/local.conf
1 2 |
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 |
Commandes à exécuter:
1 2 3 4 5 |
rc-update add sshd rc-update add openvpn rc-update add dnsmasq rc-update add iptables rc-update add ip6tables |
nano /etc/conf.d/iptables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /etc/conf.d/iptables # Location in which iptables initscript will save set rules on # service shutdown IPTABLES_SAVE="/etc/iptables/rules-save" # Options to pass to iptables-save and iptables-restore SAVE_RESTORE_OPTIONS="-c" # Save state on stopping iptables SAVE_ON_STOP="yes" # Enable/disable IPv4 forwarding with the rules IPFORWARD="yes" |
Commandes à exécuter:
1 2 3 4 |
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT rc-service iptables save |
1 2 3 4 |
ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE ip6tables -A FORWARD -i eth0 -o tun0 -j ACCEPT ip6tables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT rc-service ip6tables save |
Si tout semble fonctionner à ce stade vous pouvez sauvegarder:
1 |
lbu commit |
Vérification de la configuration réseau (ifconfig):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
ifconfig eth0 Link encap:Ethernet HWaddr 00:E0:4C:63:55:C7 inet addr:192.168.240.1 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fd43:43:43:43::1/112 Scope:Global inet6 addr: fe80::2e0:4cff:fe36:32c7/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2329 errors:0 dropped:0 overruns:0 frame:0 TX packets:2253 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:206024 (201.1 KiB) TX bytes:251533 (245.6 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:76 (76.0 B) TX bytes:76 (76.0 B) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.6 P-t-P:10.8.0.6 Mask:255.255.255.0 inet6 addr: fe80::6cb:6355:63c5:6a55/64 Scope:Link inet6 addr: fd62:62:52:52::1003/112 Scope:Global UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:2361 errors:0 dropped:0 overruns:0 frame:0 TX packets:2434 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:238618 (233.0 KiB) TX bytes:224487 (219.2 KiB) wlan0 Link encap:Ethernet HWaddr D8:3A:DD:99:ea:FF inet addr:192.168.10.150 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::da3a:ddff:bcde:aaff/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7784 errors:0 dropped:0 overruns:0 frame:0 TX packets:5790 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:860817 (840.6 KiB) TX bytes:735703 (718.4 KiB) |
Exécutez un ping sur google.fr et un ping6 sur google.fr pour vérifier si les connexions fonctionnent. À partir de là, lorsque vous redémarrez le Raspberry Pi, il devrait :
-Se connecter automatiquement au Wi-Fi.
-Permettre de connecter un dispositif sur le port Ethernet et lui permettre de pinger quelque chose sur Internet en IPv4 et IPv6.
Exécutez un ping sur google.fr et un ping6 sur google.fr depuis votre dispositif derrière votre pont pour vérifier si les connexions fonctionnent. Vous pouvez vérifier depuis votre dispositif si les adresses IP publiques sont bien celles de votre serveur VPN avec les commandes suivantes :
1 2 |
wget -q -O- http://ipecho.net/plain wget -6 -q -O- http://icanhazip.com |
Pour protéger l’accès SSH provenant du Wi-Fi tout en autorisant l’accès depuis le LAN ou le tunnel OpenVPN pour maintenance, effectuez cela depuis une machine connectée au VPN ou sur l’interface eth0 :
1 2 3 4 5 6 7 8 9 |
iptables -A INPUT -p tcp --dport 22 -i eth+ -j ACCEPT iptables -A INPUT -p tcp --dport 22 -i tun+ -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j REJECT rc-service iptables save ip6tables -A INPUT -p tcp --dport 22 -i eth+ -j ACCEPT ip6tables -A INPUT -p tcp --dport 22 -i tun+ -j ACCEPT ip6tables -A INPUT -p tcp --dport 22 -j REJECT rc-service ip6tables save lbu commit |