Journal Être point d'accès Wi-Fi 5 (200 Mbps) avec un dongle USB 3.0

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
25
29
mar.
2022

Hello nal,

J'avais récemment le besoin suivant : servir de point d'accès Wi-Fi le plus rapide possible, en me limitant à un matériel de type "dongle USB".

C'est-à-dire qu'idéalement, si le but était de faire la nique aux "box" équipées de Wi-Fi 6 (alias IEEE 802.11ax) fournies par tél ou tél opérateur, on prendrait soit :
- un PC, avec ce genre de carte en PCIe, ou celle-là en M.2 pour laptop ;
- un circuit dédié.

Mais là on vise un setup moins ambitieux et plug & play, comme une Raspberry Pi.

Les limitation de l'interface USB 3.0 ne nous permettront que d'atteindre une forme de Wi-Fi 5 (IEEE 802.11ac).
J'ai bien dit "une forme", car bien que la norme monte théoriquement à 1 Gbps, vous serez bien en-dessous ; vous aurez toujours la satisfaction d'être sur la bande des 5 Ghz, et ça n'a pas de prix ;-).

Comme il se trouve que le débit utile obtenu (~200 Mbps) satisfaisait mon besoin initial, je vous partage mon setup basé sur le chip Realtek RTL8812au.
(pas de pub, mais vous trouverez bien les 2-3 dongles du marché, au pire en commentaires… !)


1) Pré-requis (Ubuntu)

Dans tous les cas vous ferez :

# sudo apt install bc build-essential dkms

et si vous étiez sur Ubuntu "PC" vous ajouteriez…

$ sudo apt install linux-headers-`uname -r`

…MAIS sur Raspberry Pi OS 64 bits on fera plutôt :

$ sudo apt install raspberrypi-kernel-headers
$ sudo ln -s /usr/src/linux-headers-`uname -r`/arch/arm64/ /usr/src/linux-headers-`uname -r`/arch/aarch64

2) Télécharger/Compiler/Installer le pilote

$ git clone https://github.com/aircrack-ng/rtl8812au.git --branch v5.6.4.2
$ cd rtl8812au

SI ON EST sur Raspberry Pi OS 64 bits, rajoutons :

$ sed -i 's/I386_PC = y/I386_PC = n/g' Makefile
$ sed -i 's/ARM64_RPI = n/ARM64_RPI = y/g' Makefile

On compile et installe :

$ make -j4
$ sudo mkdir -p /lib/modules/`uname -r`/updates/dkms/ 
$ sudo install -m 644 88XXau.ko /lib/modules/`uname -r`/updates/dkms/88XXau.ko
$ sudo depmod

On active le pilote, vous remarquerez déjà une subtilité…

$ sudo modprobe 88XXau rtw_vht_enable=2

Votre interface devrait apparaître, p.ex. en tant que wlan1 (en résultat de ifconfig). Configurez-là en IP fixe avec votre solution favorite.
(vous pouvez éventuellement rajouter la ligne suivante dans sa section de "/etc/dhcpcd.conf", pour éviter qu'elle soit tripotée par le client wpa_supplicant :

nohook wpa_supplicant

3) Configurer dnsmasq/hostapd

Le premier va distribuer des IPs aux clients, le second configurer notre dongle :

$ sudo apt install dnsmasq hostapd
$ sudo systemctl unmask hostapd
$ sudo systemctl enable hostapd

On va d'abord faire distribuer à dnsmasq une rangée d'IP ; chez moi c'est 10.0.0.110-255, à adapter en fonction de votre IP statique :

$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.old
$ sudo echo "interface=wlan1" >> /etc/dnsmasq.conf
$ sudo echo "dhcp-range=10.0.0.110,10.0.0.255,255.255.255.0,24h" >> /etc/dnsmasq.conf

C'est le moment critique, où l'on va installer MON fichier de configuration pour hostapd

$ wget http://www.tarnyko.net/repo/rtl8812au/hostapd.conf
$ sudo mv hostapd.conf /etc/hostapd/hostapd.conf

Vous aurez bien sûr besoin d'y changer au moins 2 paramètres :

$ sudo vim /etc/hostapd
$ # ssid=MYNETWORK
$ # wpa_passphrase=MYPASSWORD

Et let's go :

$ sudo systemctl restart hostapd

Well done !


_(si vous vous intéressez aux invocations cabalistiques, Yog-Sothoth et Shub-Niggurath, regardez le fichier… juste pour le plaisir des yeux :

wmm_enabled=1
# QoS helps by adding 1 Mb/s

mais surtout on va utiliser la fonctionnalité de VHT, qui permet de "s'étendre" sur plusieurs canaux adjacents pour augmenter le débit dans la limite de ce que permet le matériel :

ht_capab=[HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935][DSSS_CCK-40]
vht_capab=[HTC-VHT][MAX-MPDU-11454][SHORT-GI-80][TX-STBC-2BY1][SU-BEAMFORMEE]
channel=36
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
# needed for full speed, rarely supported ; occupy channels 36->42

et qui ne fonctionne pas sans passer le paramètre adéquat au module bien plus haut ;-) ! )_

  • # pour chipoté, ou pas...

    Posté par  . Évalué à 9.

    Pour la plage d'ip, il ne faudrait pas déclaré l'adresse de broadcast dans la config de dnsmasq, ne pas utilisé 10.0.0.110-255, mais 10.0.0.110-254, à moins d'avoir un masque de réseau plus grand, genre, en 255.255.0.0, dans ce cas le broacast n'est plus 110.0.0.255, mais 10.0.255.255.

    • [^] # Re: pour chipoté, ou pas...

      Posté par  (site web personnel) . Évalué à 7. Dernière modification le 30 mars 2022 à 06:26.

      Merci pour ton chipotage ! Effectivement le réseau étant 10.0.0.0/8, il est bien plus grand que ça.

      On pourrait également relever la typo :

      $ sudo ln -s /usr/src/linux-headers-`uname -r`/arch/arm64 /usr/src/linux-headers-`uname -r`/arch/aarch64
      

      (pas de "/" derrière le répertoire "arm64")

      On pourrait ajouter le sous-procédure suivante , si l'on désire "servir" l'Internet disponible sur eth0 :

      $ sudo echo "dhcp-option=option:router,10.0.0.1" >> /etc/dnsmasq.conf
      $ sudo echo "dhcp-option=option:dns-server,8.8.8.8" >> /etc/dnsmasq.conf
      $ sudo systemctl restart dnsmasq
      
      $ sudo echo -e 'net.ipv4.ip_forward=1' > /etc/sysctl.d/routed-ap.conf
      $ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
      
      $ sudo apt install netfilter-persistent iptables-persistent
      $ sudo iptables -A FORWARD -i wlan1 -j ACCEPT
      $ sudo iptables -A FORWARD -o wlan1 -j ACCEPT
      $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      $ sudo netfilter-persistent save
      
      • [^] # Re: pour chipoté, ou pas...

        Posté par  (Mastodon) . Évalué à 5.

        $ sudo echo 1 > /proc/sys/net/ipv4/ip_forward

        Pour information (et chipotage !) cette ligne n'est pas persistante. Il faut la taper à chaque boot ou modifier /etc/sysctl.conf.

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # 10.0.0/8 pour un réseau local

    Posté par  (site web personnel) . Évalué à 10.

    Moi, je pense qu'il vaut mieux prendre autre chose qu'un 10.0.0.0/8, car c'est aussi ce qu'un réseau local d'entreprise pourrait utiliser au delà d'une certaine taille.

    Et c'est fâcheux dans un monde ou on a de plus en plus de VPN à cause du travail à distance.

    On a (enfin, avait) régulièrement le cas au boulot, avec les hôtels qui utilisent le même range que le réseau interne, et les employées qui ne pigent pas pourquoi le VPN marche qu'à moitié (et qui ne disent pas toujours "je suis dans un hôtel").

    Donc prendre un réseau avec une taille plus adapté évite ce genre de souci. Je pense que 172.16.0.0/12 ou 192.168.0.0/16 me semble plus adapté qu'un /8.

    (ensuite, bien sur, IPv6, etc, etc)

    • [^] # Re: 10.0.0/8 pour un réseau local

      Posté par  (site web personnel) . Évalué à 6.

      Effectivement bonne remarque, là c'est une installation labo, mais il vaut mieux spécialiser le réseau pour un cas pro avec des équipements "sérieux" branchés dessus.

      Concernant le choix récurrent du 10. pour mes tutos, c'est juste que 1) ça s'écrit vite 2) j'aime bien être au large ;-).

  • # iproute

    Posté par  . Évalué à 4.

    Je précise qu'il vaut mieux (pour ne pas dire il faut) utiliser ip link ou ip address plutôt que ifconfig. Ce dernier a été déprécié il y a bieeeeeen longtemps et ne supporte pas certaines fonctionnalités, comme plusieurs adresses IP par interface.

    • [^] # Re: iproute

      Posté par  (site web personnel) . Évalué à 5. Dernière modification le 31 mars 2022 à 19:24.

      Alors ça tu vois, pour moi c'est comme IPv6.
      Sur le papier tout est mieux.
      Mais t'en connais beaucoup des gens qui ont mémorisé la syntaxe de ip ?
      C'est beaucoup plus verbeux, ses features rarement utilisées à la mano… ifconfig est conservé pour les scripts, sauf qu'au final les gens préfèrent s'en servir ; j'en fais partie ;).

      cela dit tu as raison oui bien sûr, et la commande c'est juste "$ ip a"

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.