Création d'un Access Point Wifi avec un portail captif

Bonjour, c’est mon premier message !!

Je vous donne un peu de contexte

J’ai un pi zero W sur debian (raspbian). Il ne sera pas connecté à internet. L’idée derrière le captive portal n’est pas de valider une inscription pour avoir accès à internet mais donner accès à une application PHP hébergée sur le pi zero. Donc je veux que l’utilisateur final n’est accès à rien d’autre sauf mon app une fois connecté sur mon wifi. Je lance l’AP en tapant la commande sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf.

Ce qui fonctionne !

Le point d’accès fonctionne super bien. Le serveur DNS donne une IP valide à l’utilisateur connecté et au pi zero. Une fois connecté je peux accéder à mon app en tapant l’ip de mon pi zero dans le navigateur.

Ce qui ne fonctionne pas :’(

Je veux rediriger toutes les requêtes HTTP (typiquement google.fr) vers l’ip de mon pi zero (192.168.0.139)

Les fichiers de conf sur le pi zero

/etc/dnsmasq.conf

interface=wlan0
bind-interfaces
dhcp-range=192.168.0.100,192.168.0.150,1h
address=/#/192.168.0.139 
#this last line should do the trick...

/etc/hostpapd/hostapd.conf

interface=wlan0
driver=nl80211
ssid=lol
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-0][DSSS_CCK-40]
macaddr_acl=0

/etc/network/interface

 source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
iface eth0 inet manual

allow-hotplug wlan0
iface wlan0 inet manual

allow-hotplug wlan1
iface wlan1 inet manual
       wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Bonjour Su4p,

à mon avis, c’est au niveau de ton poste client qu’il faut jouer pour rediriger son trafic vers ton pi zero.

Peut-être en définissant sur ton poste client, le pi zero comme proxy http.

Ou peut-être plus simple, en définissant dans le fichier /etc/network/interfaces de ton poste client, le pi zero comme passerelle en rajoutant :
gateway 192.168.0.139
après les lignes de configuration de ta carte réseau (je ne sais pas si ton poste client est en Ethernet ou en wifi).

Merci pour t’as réponse libresurf.

L’idée est de proposer un wifi ouvert avec une application destinée au grand public.
Je cherche à reproduire ce que font starbuck ou les aéroports :
Un wifi ouvert est disponible “Starcbuck hotspot”, si l’utilisateur se connecte au réseau wifi, toutes les requêtes http sont redirigés vers un portail afin de remplir un formulaire. Une fois le formulaire rempli l’utilisateur accède à internet.

Je cherche à réaliser seulement la partie : Access point + redirection vers un portail.

L’interface que j’utilise est la wlan0 c’est d’ailleurs la seule présente, donc oui c’est du wifi

Je perds l’adresse IP 192.168.0.139 sur wlan0 lorsque je fais cela :

OK, mais dans ce cas, je ne comprends pas comment tu n’arrives pas à récupérer tout le trafic de tes postes clients.

Sur tes postes clients, est-ce que le pi zero est bien défini comme passerelle par défaut ?
En root, faire :
# route
normalement, tu devrais obtenir quelque chose de la forme suivante :
Table de routage IP du noyau
Destination Passerelle Genmask Indic Metric Ref Use Iface
default 192.168.0.139 0.0.0.0 UG 1024 0 0 wlan0
localnet * 255.255.255.0 U 0 0 0 wlan0

Si c’est le cas, c’est que tout le trafic de tes postes clients passent bien sur ton pi zero.

Après, peut-être as-tu besoin de redéfinir les règles Netfilter sur ton pi zero en utilisant les commandes iptables, car sur ton pi zero, les paquets passent alors dans la table FORWARD et ne sont donc pas interceptés par tes programmes qui n’écoutent que sur la table INPUT.

Il y a une manipulation à faire, mais je ne saurais pas te l’expliquer, ne l’ayant jamais mise en place par moi-même.

Sur les postes clients la passerelle se mets bien automatiquement sur 192.168.0.139. J’imagine que c’est le rôle de hostapd.
La commande #route (sur le serveur/routeur) me renvoie :

Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     302    0        0 wlan0

J’ai lu qu’il suffisait de saisir address=/#/192.168.0.139 dans dnsmasq.conf mais cela ne semble pas fonctionner, je ne sais pas pourquoi. Il y aurait aussi une méthode avec iptable. Malheureusement mes copier-coller ne semblent pas venir à bout du problème et mes connaissances admin sys sont limitées :blush:

Ton routeur n’étant pas connecté à internet n’a pas de destination par défaut.

Du coup, comment se fait la résolution DNS ?
Tes clients interrogent le serveur DNS de ton pi zero, mais comment ton pi zero sait à son tour résoudre les noms de domaines s’il n’est pas lui même connecté à un serveur DNS sur internet ?

En d’autres termes, comment se fait une résolution du nom de domaine de ton exemple “google.fr” ?

Si tu as un poste client sous linux, que donne :
$ host google.fr

J’ai espéré peut être naïvement que ça pouvait donner 192.168.0.139 ou au moins rediriger vers… (Grâce à la fameuse ligne /#/ dans le dnsmasq.)

J’ai vu qu’il existait https://calomel.org/dns_spoof.html

Mais dans l’absolu j’aimerai plutôt une redirection.

bonjour sup4p, je me lance dans le même projet que celui que tu décris, as tu au final réussi à obtenir l’effet escompté ?

des pistes ?

https://wiki.debian.org/HowTo/dnsmasq

https://brennanhm.ca/knowledgebase/2016/10/raspberry-pi-access-point-and-captive-portal-without-internet/#Configure_Dnsmasq