Publié le 8 janvier 2020 - par

Partage d’une connexion 4G Ethernet + Wifi (Episode2)

L’article précédent sur le partage de connexion 4G via le port Ethernet du Raspberry Pi 4 a apparemment bien plu… Des lecteurs m’ont envoyé des demandes pour ajouter le WiFi au partage. Voici une solution, utilisant un Acces Point (Point d’accès ou AP) hostpad pour partager la connexion.

Niveau d'accès pour ce tutoriel : Avancé

Cliquez pour plus d’information sur les niveaux

Partage d’une connexion 4G en Ethernet et en Wifi

Remarque
S’il ne s’agit que de partager la 4G en WiFi, votre smartphone doit pouvoir le faire directement en activant le point d’accès mobile.

Pour ceux qui démarreraient par cet article, je vais donner la marche à suivre, sachant que certaines explications sont déjà présentes dans l’article précédent, je vous conseille de commencer par le premier article, puis de modifier votre installation en fonction de celui-ci…

Objectif de cet article

Ce montage est plutôt destiné à fournir un accès Internet à un endroit dépourvu d’ADSL ou de fibre optique. Encore faudra-t-il que la 4G soit accessible. Ce pourrait être le cas d’une maison à la campagne, pas connectée du tout, ou d’un camping-car. Il devient possible de partager la connexion entre plusieurs utilisateurs.

Qu’est-ce qui change ?

Pour accéder au partage via le WiFi, il va falloir activer le port WiFi du Raspberry Pi. Cela signifie d’abord lui donner une adresse. J’ai choisi de différencier le réseau filaire (10.0.0.0/24) du réseau WiFi (10.0.10.0/24).

Pour permettre aux appareils d’accéder en WiFi au Raspberry Pi, j’ai choisi un classique : hostAP souvent mis en œuvre dans ce cas. Il faudra l’installer et le configurer.

Il faudra donner une adresse statique à wlan0 (10.0.10.1) dans /etc/dhcpcd.conf, ajouter cette interface à la liste des interfaces lues par le DHCP (/etc/default/isc-dhcp-server),  et créer un subnet dans le fichier de configuration du DHCP (/etc/dhcp/dhcpd.conf), pour que celui-ci distribue des adresses sur cette interface.

Dans les options, l’adresse de passerelle et l’adresse du DNS seront toutes deux à 10.0.10.1.

Il faudra aussi modifier iptables pour que les paquets soient routés vers cette nouvelle interface. On en profitera pour améliorer un peu la sécurité.

Enfin, au démarrage, il arrivait souvent que le DHCP soit en erreur lors de son lancement. La cause est que le serveur démarre AVANT que les adresses IP aient été attribuées aux interfaces. Dans un premier temps j’ai demandé que le service démarre après le réseau, mais apparemment wlan0 pose encore problème et très souvent n’a pas d’adresse lors du démarrage du serveur DHCP. Comme ce point d’accès n’est pas destiné à être démarré souvent (en principe on le démarre et il reste en fonction pendant des heures), j’ai choisi de retarder le démarrage du serveur DHCP de 30 secondes, le temps que tout ça se mette en place.

Du coup si vous essayez de vous connecter tout de suite après le démarrage du Raspberry Pi, vous n’obtiendrez pas d’adresse IP… Il faudra juste être un peu patient(e) lors du démarrage 🙂

Ce qu’on va mettre en place

Voici le synoptique de ce qui va être mis en place sur notre Raspberry Pi.

Installation de hostAP

Comme toujours pensez à mettre votre système à jour avant de commencer à installer.

sudo apt-get install hostapd

Mettre une adresse fixe à l’interface wlan0

sudo nano /etc/dhcpcd.conf

et modifier la fin du fichier avec

# Adresse fixe sur le port Ethernet eth0
interface eth0
static ip_address=10.0.0.1/24
# Adresse fixe sur wlan0
nohook wpa_supplicant
interface wlan0
static ip_address=10.0.10.1/24

Le nohook permet de ne pas prendre en compte le wpa_supplicant s’il y en a un.

Modifier la configuration DHCP

sudo nano /etc/dhcp/dhcpd.conf

On va rendre le DHCP “autorité” sur ce réseau et ajouter le subnet pour le wifi

authoritative;  Supprimez le # du début de cette ligne

Puis rendez vous à la fin du fichier et ajoutez :

# Reseau 10.0.0.0 sur eth0
subnet 10.0.0.0 netmask 255.255.255.0 {
interface eth0;
range 10.0.0.10 10.0.0.100;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.1;
}
# Reseau 10.0.10.0 sur wlan0
subnet 10.0.10.0 netmask 255.255.255.0 {
interface wlan0;
range 10.0.10.10 10.0.10.100;
option routers 10.0.10.1;
option domain-name-servers 10.0.10.1;
}

Connecter le DHCP à wlan0

Pour que le serveur DHCP écoute sur des interfaces, il faut les spécifier dans /etc/default/isc-dhcp-server : ouvrez ce fichier avec nano

INTERFACESv4="eth0 wlan0"

Modifiez la ligne ci-dessus pour que les deux interfaces soient écoutées.

Modifier la configuration de hostAP

ouvrir le fichier hostapd.conf

sudo nano /etc/hostapd/hostapd.conf

et écrire le contenu du fichier

interface=wlan0
driver=nl80211
ssid=Partage_4G
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=0
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
wpa_passphrase=raspberry
rsn_pairwise=CCMP

Vous remplacerez le SSID et la passphrase par les vôtres.

Charger la configuration de hostAP au démarrage

Ouvrir le fichier de configuration

sudo nano /etc/default/hostapd

Remplacer la ligne:

 #DAEMON_CONF=""

Par la ligne suivant:

 DAEMON_CONF="/etc/hostapd/hostapd.conf"

Modifier la configuration du DNS

Il faut indiquer au DNS qu’il doit résoudre les noms pour les deux réseaux connectés sur eth0 et wlan0.

Ouvrez le fichier /etc/bind/named.conf

Modifiez le comme suit

options {
   directory "/var/cache/bind";
   auth-nxdomain no;

   forwarders {
      8.8.8.8;
      9.9.9.9;
   };
   listen-on port 53 {
      127.0.0.1;
      10.0.0.1;
      10.0.10.1;
   };
   listen-on-v6 {
      none;
   };
   allow-query {
      internals; 
   }; 

   allow-transfer { 
      none; 
   };

    allow-recursion {
       internals;
    };
};

Ajuster les iptables

Dans la version précédente, les paquets ne subissent aucun filtrage. Tout ce qui arrive via le modem USB ou l’interface eth0 est routé sans arrière pensée. Ce serait bien de n’autoriser le transit que pour les paquets dûment autorisés.

Si vous aviez déjà des iptables, supprimez-les

sudo iptables -F

puis saisissez en ligne de commande

sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
sudo iptables -A FORWARD -i usb0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i usb0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -j ACCEPT

Comme précédemment on va enregistrer cette configuration iptables :

sudo iptables-save > iptables

Créer un service pour recharger les iptables

Créer un fichier pour le service iptables

sudo nano /etc/systemd/system/iptables.service

Saisir dans ce fichier le texte suivant

[Unit]
Description=IpTables
After=network.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "/sbin/iptables-restore < /home/pi/iptables"
 
[Install]
WantedBy=multi-user.target

Ce fichier sera exécuté par systemd lors du démarrage pour mettre les iptables en place (merci Grv pour la suggestion de modif 🙂 )

Il faut aussi activer le service que vous venez de créer.

sudo systemctl enable iptables.service
sudo systemctl restart iptables.service

Vous pouvez vérifier que les iptables ont bien été chargées avec

sudo iptables -L

et

sudo iptables -t nat -L

Attention
Si vous aviez configuré les iptables d’après le premier article, supprimez la ligne
/home/pi/reseau.sh
dans le fichier /etc/rc.local

Retarder le démarrage du DHCP

Comme indiqué au début de l’article, j’ai eu des misères avec le démarrage du DHCP qui intervenait avant que les interfaces prennent une adresse IP.

Le fait de rajouter After=network-online.target n’a pas suffi. J’ai retardé le démarrage de 30s. Faites une copie du service DHCP actif vers le dossier de systemd où nous allons pouvoir le modifier.

sudo cp /run/systemd/generator.late/isc-dhcp-server.service /etc/systemd/system/

Ouvrez le fichier du service DHCP

sudo nano /etc/systemd/system/isc-dhcp-server.service

Modifiez le comme suit :

# Automatically generated by systemd-sysv-generator
[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/isc-dhcp-server
Description=LSB: DHCP server
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target
After=remote-fs.target
After=network-online.target
After=slapd.service
After=nss-lookup.target
Wants=network-online.target
After=network-online.target
 
[Service]
ExecStartPre=/bin/sleep 30
Type=forking
Restart=on-failure
RestartSec=5
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/isc-dhcp-server start
ExecStop=/etc/init.d/isc-dhcp-server stop
 
[Install]
WantedBy=multi-user.target

Réinstallez le système pour que les modifications soient prises en compte

sudo systemctl daemon-reload
sudo systemctl enable isc-dhcp-server.service

Redémarrez le Raspberry Pi pour prendre en compte toutes les modifs et attendez que le DHCP démarre. Vous pouvez tester…

Une distribution pour tester

Je vous propose de télécharger une image déjà configurée suivant cet article. Copiez la sur une carte microSD avec Etcher ou Win32DiskImager. Démarrez l’OS puis lancez raspi-config

sudo rapi-config

pour augmenter la taille de la partition Linux à la place disponible sur la carte microSD

7 Advanced Options > A1 Expand Filesystem.

Ca devrait vous donner une installation opérationnelle. Si vous testez merci de mettre un commentaire ci-dessous pour donner votre avis.

Conclusion

Avec ce projet on met en œuvre beaucoup de connaissances dans différents domaines. On est loin du Raspberry Pi car tout ce qu’on vient de faire, on aurait pu le réaliser sur un PC sous Debian…
Si tout va bien, vous aurez des choses qui ne fonctionne pas. Je dis ça parce que si ça “tombe en marche” vous n’aurez rien appris 🙂 Le but du jeu c’est de trouver pourquoi ça ne fonctionne pas. Utilisez la doc, les Wiki, les moteurs de recherche… concernant les serveurs, l’AP…

Commencez par les bases. Si vous ne comprenez pas comment fonctionne le réseau ou les services DNS ou DHCP, vous avancez en terrain miné. Pour pouvoir dépanner il faut comprendre comment ça fonctionne.
Si vous me contactez en me disant j’ai suivi le tuto et ça ne marche pas… Bin … je ne saurai pas pourquoi, ni ce que vous avez fait ou pas fait. Il suffit d’oublier un ; pour qu’un fichier de config soit défectueux. En général il y a des commandes qui permettent de vérifier ces fichiers de config. Utilisez les… Consultez les journaux d’erreurs système et des applis… Si vous ne savez pas de quoi je parle, c’est par là qu’il faut commencer 😉

Et puis cherchez, recommencez… Si ce qui vous intéresse c’est juste la recette, cet article n’est pas pour vous. Achetez un routeur, vous aurez une belle page web pour le paramétrer et pas des fichiers texte (pas sexy du tout). Mais (et je suis désolé d’insister) si vous ne comprenez pas comment ça fonctionne “vraiment” vous ne vous en sortirez pas.

Voilà, voilà… prenez votre temps, découvrez, essayez, testez. Quand ça ne fonctionne pas c’est bon signe, ça veut dire que vous allez apprendre quelque chose 😀

Les tests ont été fait avec un Samsung S8 et un S4. Je n’ai pas d’iPhone et je ne peux pas dire si ça fonctionne ou pas. Après, si Apple veut bien me fournir un iPhone je peux faire les tests, bien entendu 🙂

ps : j’ai même connu des formateurs qui donnaient des TP avec des erreurs pour obliger les techniciens à chercher… je ne dirai pas de nom !

Sources

 

iptables et systemd

Share Button

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

4 réflexions au sujet de « Partage d’une connexion 4G Ethernet + Wifi (Episode2) »

  1. Edouard

    Bonjour,
    Un grand merci pour ce partage !
    J’ai testé et l’ai adopté, tous fonctionne parfaitement sur mon Raspberry 4, mode ethernet et wifi.
    Merci encore et bravo.

    Répondre
  2. dyox

    Merci François et meilleurs voeux !
    Pour ceux qui sont curieux, on peut avoir le même résultat avec OpenWRT.
    Après, c’est sûr, c’est beaucoup moins didactique.

    Répondre
  3. Artemus24

    Salut à tous.

    Beau travail mais il y a des manques, comme par exemple déclarer un nom d’hôte sous bind9.
    Sinon, cela ne sert à rien de l’utiliser.

    Je constate que hostapd fonctionne très bien avec une seule interface.
    Mais quand on en utilise deux, je n’arrive pas à me connecter sur la seconde et je ne sais pas pourquoi.
    (wlan0 & wlan1) ou bien (wlan1 & wlan0).

    Qui est à l’origine de ce sujet ?

    @+

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.