Raspberry Pi + CentOS = Point d'accès Wi-Fi (ou routeur framboise sous un chapeau rouge)

Il existe une multitude d'informations sur la création de points d'accès Wi-Fi basés sur le mini-PC Raspberry. En général, cela implique l'utilisation du système d'exploitation natif pour la « framboise » - Raspbian.

En tant qu'adepte des systèmes basés sur RPM, je ne pouvais pas passer à côté de cette petite merveille et ne pas essayer ma distribution préférée, CentOS.

Cet article présente un guide pour fabriquer un routeur Wi-Fi 5GHz/AC à partir d'un Raspberry Pi 3 Model B+ sous le système d'exploitation CentOS. Il y aura quelques astuces standard, mais peu connues, et en bonus - un schéma de connexion de matériel Wi-Fi supplémentaire à la « framboise », permettant de fonctionner simultanément en plusieurs modes (2,4+5GHz).

Raspberry Pi + CentOS = Point d'accès Wi-Fi (ou routeur framboise sous un chapeau rouge)
(mélange d'images librement accessibles)

Notons d'emblée que des vitesses extraordinaires ne seront pas atteintes. J'extrais de ma « framboise » au maximum 100 Mbit en Wi-Fi, ce qui couvre la vitesse de mon fournisseur d'accès Internet. À quoi bon un AC aussi paresseux, s'il est théoriquement possible d'obtenir une demi-giga sur le N ? Si vous vous êtes posé cette question, direction le magasin pour un véritable routeur avec huit antennes externes.

0. Ce dont vous aurez besoin

  • En fait, le « produit framboise » est de calibre : Pi 3 Model B+ (pour atteindre des vitesses et des canaux tant espérés de 5GHz);
  • Une bonne microSD >= 4Go;
  • Une station de travail sous Linux avec un lecteur/écrivain de microSD;
  • Des compétences suffisantes en Linux, cet article est destiné à un Geek préparé;
  • Connectivité réseau câblée (eth0) entre le Raspberry et Linux, un serveur DHCP fonctionnant sur le réseau local et un accès Internet depuis les deux appareils.

Un petit commentaire sur le dernier point. « Qu'est-ce qui est apparu en premier, l'œuf ou… » comment faire un routeur Wi-Fi en l'absence de tout équipement d'accès à Internet ? Laissons cet exercice amusant de côté et supposons simplement que le Raspberry est connecté au réseau local par câble et a accès à Internet. Dans ce cas, aucun écran supplémentaire ni appareil de manipulation ne sera nécessaire pour configurer la « framboise ».

1. Installation de CentOS

Page d'accueil du projet

Au moment de la rédaction de cet article, la version fonctionnelle de CentOS sur l'appareil est 32 bits. J'ai croisé des opinions sur la réduction de performance de tels systèmes sur une architecture ARM 64 bits allant jusqu'à 20%. Je laisse ce point sans commentaire.

Sur Linux, téléchargez l'image minimale avec le noyau «-RaspberryPI-» et nous l'enregistrons sur microSD :

# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz | 
  dd of=/dev/mmcblk0 bs=4M
# sync

Avant de commencer à utiliser l'image, nous allons supprimer la partition SWAP, étendre la racine à toute la capacité disponible et nous débarrasser de SELinux. L'algorithme est simple : nous faisons une copie de la racine sur Linux, supprimons toutes les partitions de microSD sauf la première (\/boot), créons une nouvelle partition racine et restaurons son contenu depuis la copie.

Exemple des actions nécessaires (sortie brute de la console)

# mount /dev/mmcblk0p3 /mnt
# cd /mnt
# tar cfz ~/pi.tgz . --no-selinux
# cd
# umount /mnt

# parted /dev/mmcblk0

(parted) unit s
(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system     Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32           boot, lba
 2      1370112s  2369535s   999424s    primary  linux-swap(v1)
 3      2369536s  5298175s   2928640s   primary  ext4
        5298176s  31116287s  25818112s           Free Space

(parted) rm 3
(parted) rm 2

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
        1370112s  31116287s  29746176s           Free Space

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 1370112s
End? 31116287s

(parted) set
Partition number? 2
Flag to Invert? lba
New state?  on/[off]? off

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
 2      1370112s  31116287s  29746176s  primary  ext4

(parted) quit

# mkfs.ext4 /dev/mmcblk0p2 
mke2fs 1.44.6 (5-Mar-2019)
/dev/mmcblk0p2 contains a swap file system labelled '_swap'
Proceed anyway? (y,N) y
Discarding device blocks: done                            
Creating filesystem with 3718272 4k blocks and 930240 inodes
Filesystem UUID: 6a1a0694-8196-4724-a58d-edde1f189b31
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done   

# mount /dev/mmcblk0p2 /mnt
# tar xfz ~/pi.tgz -C /mnt --no-selinux

Après avoir extrait le contenu de la partition racine, c'est le moment d'y apporter quelques modifications.

Désactivons SELinux dans /mnt/etc/selinux/config:

SELINUX=disabled

Modifions /mnt/etc/fstab, en laissant uniquement deux entrées pour les partitions : la partition de démarrage (\/boot, sans changements) et la partition racine (modifions la valeur UUID, que l'on peut connaître en examinant la sortie de la commande blkid sur Linux) :

UUID=6a1a0694-8196-4724-a58d-edde1f189b31  \/     ext4    defaults,noatime 0 0
UUID=6938-F4F2                             \/boot vfat    defaults,noatime 0 0

Enfin, modifions les paramètres de démarrage du noyau : nous spécifions le nouvel emplacement de la partition racine, désactivons la sortie des informations de débogage et (facultatif) interdisons au noyau d'attribuer des adresses IPv6 sur les interfaces réseau :

# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt

Nous rendons le contenu /mnt/cmdline.txt comme suit (une seule ligne sans retours) :

root=\/dev\/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1

Fait :

# cd
# umount /mnt
# sync

Nous remettons la microSD dans « la framboise », démarrons et obtenons l'accès réseau par ssh (root\/centos).

2. Configuration de CentOS

Les trois premiers mouvements indéfectibles : passwd, yum -y update, reboot.

Nous confions la gestion du réseau à networkd:

# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off

Créons un fichier (avec les répertoires) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

Nous redémarrons « la framboise » et obtenons à nouveau un accès réseau par ssh (l'adresse IP peut changer). Notez que nous utilisons /etc/resolv.conf, créé précédemment par le Network Manager. Par conséquent, en cas de problème avec la résolution, modifiez son contenu. Utiliser systemd-resolved nous ne le ferons pas.

Nous supprimons le « superflu », réparons et accélérons le démarrage du système d'exploitation :

# systemctl set-default multi-user.target
# yum remove GeoIP Network* aic* alsa* cloud-utils-growpart 
  cronie* dhc* firewal* initscripts iwl* kexec* logrotate 
  postfix rsyslog selinux-pol* teamd wpa_supplicant

Qui a besoin de cron et qui ne digère pas les minuteries systemd, peuvent installer le manquant. /var/log-et regardons via journalctl. Si l'historique des journaux est nécessaire (par défaut, seules les informations depuis le démarrage du système sont conservées) :

# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf

Désactivons l'utilisation d'IPv6 par les principaux services (si nécessaire)/etc/ssh/sshd_config:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

L'actualité de l'heure sur « la framboise » est une chose importante. Comme il n'y a pas de possibilité matérielle de conserver l'état actuel de l'horloge lors du redémarrage, une synchronisation est nécessaire. Un excellent et rapide démon pour cela est — chrony — déjà installé et se lance automatiquement. Vous pouvez modifier les serveurs NTP vers les plus proches.

/etc/chrony.conf:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

Pour définir le fuseau horaire, nous allons utiliser une astuce. Comme notre objectif est de créer un routeur Wi-Fi fonctionnant sur des fréquences de 5GHz, préparons-nous à des surprises du régulateur:

# yum info crda
Résumé : Daemon de conformité réglementaire pour le réseau sans fil 802.11

Cette construction malveillante, prenant en compte le fuseau horaire, « interdit » l'utilisation (en Russie) des fréquences 5GHz et des canaux avec des numéros « élevés ». L'astuce consiste à définir le fuseau horaire sans utiliser les noms de continents/villes, c'est-à-dire au lieu de :

# timedatectl set-timezone Europe/Moscow

Enfonçons :

# timedatectl set-timezone Etc/GMT-3

Et les touches finales dans la coiffure du système :

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# Environnement spécifique à l'utilisateur et programmes de démarrage

export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin

3. Compléments CentOS

Tout ce qui a été dit ci-dessus peut être considéré comme un guide complet pour installer un CentOS « vanille » sur Raspberry Pi. Vous devriez obtenir un PC qui (re)démarre en moins de 10 secondes, utilise moins de 15 Mo de mémoire vive et 1,5 Go de microSD (en réalité moins de 1 Go en raison de /boot incomplet, mais soyons honnêtes jusqu'au bout).

Pour installer le logiciel de point d'accès Wi-Fi sur ce système, il faudra élargir légèrement les capacités de la distribution standard de CentOS. Tout d'abord, « nous allons améliorer » le pilote (firmware) de l'adaptateur Wi-Fi intégré. Il est indiqué sur la page d'accueil du projet :

Wifi sur le Raspberry 3B et 3B+

Les fichiers de firmware du Raspberry PI 3B/3B+ ne peuvent pas être distribués par le projet CentOS. Vous pouvez utiliser les articles suivants pour comprendre le problème, obtenir le firmware et configurer le wifi.

Ce qui est interdit pour le projet CentOS ne nous est pas interdit pour un usage personnel. Nous remplaçons le firmware Wi-Fi de distribution dans CentOS par celui des développeurs de Broadcom (ces chers binaires…). Cela permettra notamment d'utiliser AC en mode point d'accès.

Mise à jour du firmware Wi-FiNous déterminons le modèle de l'appareil et la version actuelle du firmware :

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Mar  1 2015 07:29:38 version 7.45.18 (r538002) FWID 01-6a2c8ad4
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 7.14.8 Compiler: 1.24.9 ClmImport: 1.24.9 Creation: 2014-09-02 03:05:33 Inc Data: 7.17.1 Inc Compiler: 1.26.11 Inc ClmImport: 1.26.11 Creation: 2015-03-01 07:22:34 

Nous voyons que la version du firmware est 7.45.18 du 01.03.2015, et nous mémorisons le jeu de chiffres suivant : 43455 (brcmfmac43455-sdio.bin).

Téléchargez l'image actuelle de Raspbian. Ceux qui sont paresseux peuvent écrire l'image sur microSD et récupérer les fichiers de firmware à partir de là. Mais on peut également monter la partition racine de l'image sous Linux et copier ce qu’il faut de là :

# wget https://downloads.raspberrypi.org/raspbian_lite_latest
# unzip -p raspbian_lite_latest > raspbian.img
# fdisk -l raspbian.img
Disk raspbian.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d

Device        Boot  Start     End Sectors  Size Id Type
raspbian.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
raspbian.img2      540672 4292607 3751936  1.8G 83 Linux

# mount -t ext4 -o loop,offset=$((540672 * 512)) raspbian.img /mnt
# cp -fv /mnt/lib/firmware/brcm/*43455* ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.bin' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.txt' -> ...
# umount /mnt

Les fichiers de firmware de l'adaptateur Wi-Fi doivent être copiés avec remplacement sur la « framboise » dans le répertoire /usr/lib/firmware/brcm/

Nous redémarrons le futur routeur et sourions joyeusement :

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 9.10.105 Compiler: 1.29.4 ClmImport: 1.36.3 Creation: 2018-03-09 18:56:28 

Version : 7.45.154 du 27.02.2018.

Et bien sûr EPEL :

# cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0
EOF

# yum clean all
# rm -rfv /var/cache/yum
# yum update

4. Configuration réseau et difficultés à venir

Comme nous l'avons convenu plus haut, le « petit Raspberry » est connecté « par câble » au réseau local. Supposons que le fournisseur donne également accès à Internet de la même manière : une adresse du réseau public est attribuée dynamiquement par un serveur DHCP (peut-être liée à l'adresse MAC). Dans ce cas, après avoir terminé la configuration de la « petite machine », il suffit de « brancher » le câble du fournisseur et tout est prêt. L'autorisation à travers systemd-networkd — est le sujet d'un article séparé et n'est pas abordé ici.

L'interface Wi-Fi du Raspberry est un réseau local, tandis que l'adaptateur Ethernet intégré (eth0) est externe. Numérotons le réseau local de façon statique, par exemple : 192.168.0.0/24. L'adresse du « petit Raspberry » : 192.168.0.1. Dans le réseau externe (Internet), un serveur DHCP fonctionnera.

Le problème de l'uniformité de la nomination et un programmeur guatémaltèque bien connu — deux désagréments qui attendent chacun de ceux qui configurent des interfaces réseau et des services dans les distributions systemd.

Le chaos parallèle (détour lyrique)Lennart Poettering a élaboré son programme systemd très bien. Celui-ci systemd lance d'autres programmes si rapidement que ces derniers, ne réussissant pas à se reprendre après le coup de sifflet des juges, trébuchent et tombent au départ sans même avoir commencé leur course d'obstacles.

Mais sérieusement, l'introduction agressive de parallélisme dans le démarrage des processus lors du démarrage du système d'exploitation systemd est une sorte de « pont âne » pour les anciens séquentialistes de LSB. Heureusement, remettre de l'ordre dans ce « chaos parallèle » s'avère simple, bien que pas toujours évident.

Créons deux interfaces virtuelles de pont (bridge) avec des noms permanents : lan et wan. Au premier, nous « connecterons » les adaptateurs Wi-Fi, au second — eth0 du « petit Raspberry ».

/etc/systemd/network/lan.netdev:

[NetDev]
Name=lan
Kind=bridge

/etc/systemd/network/lan.network:

[Match]
Name=lan

[Network]
Address=192.168.0.1/24
IPForward=yes

/etc/systemd/network/wan.netdev:

[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx

/etc/systemd/network/wan.network:

[Match]
Name=wan

[Network]
DHCP=ipv4
IPForward=yes

IPForward=yes supprime la nécessité de suggérer au noyau d'activer le routage via sysctl.
MACAddress= nous décommentons et modifions si nécessaire.

D'abord, « connectons » eth0. Nous nous souvenons du « problème d'uniformité » et utilisons uniquement l'adresse MAC de cette interface, que nous pouvons découvrir, par exemple, comme ceci :

# cat /sys/class/net/eth0/address 

Créons /etc/systemd/network/eth.network:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Network]
Bridge=wan

Nous supprimons le fichier de configuration précédent eth0, redémarrons la « petite framboise » et obtenons un accès réseau (l'adresse IP changera probablement) :

# rm -fv /etc/systemd/network/eth0.network
# reboot

5. DNSMASQ

Pour créer des points d'accès Wi-Fi, rien de mieux qu'un bon duo de dnsmasq + hostapd cela n'a encore rien d'autre. À mon avis.

Au cas où quelqu'un aurait oublié,hostapd c'est un outil qui gère les adaptateurs Wi-Fi (en particulier, il prendra en charge leur connexion à la « petite framboise ») lan , autorise et enregistre les clients sans fil.

dnsmasq Il configure la pile réseau des clients : attribue des adresses IP, des serveurs DNS, une passerelle par défaut et des choses similaires.

Commençons par dnsmasq :

# yum install dnsmasq

Modèle /etc/resolv.conf:

nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 77.88.8.8
nameserver 77.88.8.1
domain router.local
search router.local

éditons-le à notre goût.

Minimaliste /etc/dnsmasq.conf:

domain-needed
bogus-priv
interface=lan
bind-dynamic
expand-hosts
domain=#
dhcp-range=192.168.0.100,192.168.0.199,255.255.255.0,24h
conf-dir=/etc/dnsmasq.d

La « magie » ici réside dans le paramètre bind-dynamic, qui indique au démon dnsmasq d'attendre l'apparition de l' interface=lan, plutôt que de s'effondrer sous le coup de l'isolement après le démarrage.

# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f

6. HOSTAPD

Et enfin, les configurations magiques de hostapd. Je ne doute pas que quelqu'un lit cet article à la recherche de ces précieuses lignes.

Avant d'installer hostapd, il faut faire face au « problème d'uniformité ». L'adaptateur Wi-Fi intégré wlan0 peut facilement changer de nom en wlan1 lors de la connexion d'un matériel Wi-Fi USB additionnel. Nous allons donc fixer les noms des interfaces de la manière suivante : inventer des noms uniques pour les adaptateurs (sans fil) et les lier aux adresses MAC.

Pour l'adaptateur Wi-Fi intégré, qui est encore wlan0 :

# cat /sys/class/net/wlan0/address 
b8:27:eb:xx:xx:xx

Créons /etc/systemd/network/wl0.link:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Link]
Name=wl0

Nous serons maintenant sûrs que wl0 est le Wi-Fi intégré. Redémarrons la « petite framboise » pour en être sûrs.

Installation :

# yum install hostapd wireless-tools

Fichier de configuration /etc/hostapd/hostapd.conf:

ssid=rpi
wpa_passphrase=1234567890

channel=36

country_code=US

interface=wl0
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=a
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

# AC
ieee80211ac=1
require_vht=1
ieee80211d=0
ieee80211h=0
vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42

Sans jamais oublier le GKChP, modifions les paramètres nécessaires et vérifions manuellement leur bon fonctionnement :

# hostapd /etc/hostapd/hostapd.conf

hostapd se lancera en mode interactif, affichant son état sur la console. S'il n'y a pas d'erreurs, les clients prenant en charge le mode AC pourront déjà se connecter au point d'accès. Pour arrêter hostapd, utilisez Ctrl-C.

Il ne reste plus qu'à activer hostapd au démarrage du système. Si on procède de manière standard (systemctl enable hostapd), après un nouveau redémarrage, on peut se retrouver avec un démon « gisant dans son sang » avec le diagnostic «l'interface wl0 introuvable«. En raison du « chaos parallèle », hostapd a démarré plus rapidement que le noyau n'a pu détecter l'adaptateur sans fil.

Internet regorge de solutions : du délai forcé avant le démarrage du démon (quelques minutes), à un autre démon qui surveille l'apparition de l'interface et (re)démarre hostapd. Ces solutions fonctionnent, mais sont très peu élégantes. Faisons appel au grand systemd avec ses « objectifs » et « tâches » et ses « dépendances ».

Nous copions le fichier de service distribué dans /etc/systemd/system/hostapd.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system

et nous le modifions comme suit :

[Unit]
Description=Hostapd IEEE 802.11 AP, authentificateur IEEE 802.1X/WPA/WPA2/EAP/RADIUS
After=sys-subsystem-net-devices-wl0.device
BindsTo=sys-subsystem-net-devices-wl0.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl0.device

La magie du fichier de service mis à jour réside dans la liaison dynamique de hostapd à la nouvelle cible — l'interface wl0. Lorsque l'interface apparaît, le démon se lance, et lorsqu'elle disparaît, il s'arrête. Et tout cela en ligne — sans redémarrer le système. Cette technique sera particulièrement utile lors de la connexion d'un adaptateur Wi-Fi USB à un Raspberry Pi.

Maintenant, nous pouvons :

# systemctl enable hostapd
# reboot

7. IPTABLES

« Quoi ??? » © Oui-oui ! Aucun systemd. Pas de nouveaux engins à la mode (sous forme de firewalld), qui finissent par faire la même chose.

Utilisons le bon vieux iptables, dont le service après son démarrage chargera les règles réseau dans le noyau et se terminera paisiblement, sans résider en mémoire et sans consommer de ressources. systemd a une élégante IPMasquerade=, mais nous confierons tout de même la traduction d'adresses (NAT) et le pare-feu à iptables.

Installation :

# yum install iptables-services
# systemctl enable iptables ip6tables

Je préfère conserver la configuration iptables sous forme de script (exemple) :

#!/bin/bash

#
# Disable IPv6
#
ip6tables --flush
ip6tables --delete-chain

ip6tables --policy INPUT   DROP
ip6tables --policy FORWARD DROP
ip6tables --policy OUTPUT  DROP

ip6tables-save > /etc/sysconfig/ip6tables
systemctl restart ip6tables

#
# Cleaning
#
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#
# Loopback, lan
#
iptables -A INPUT -i lo  -j ACCEPT
iptables -A INPUT -i lan -j ACCEPT

#
# Ping, Established
#
iptables -A INPUT -p icmp  --icmp-type echo-request    -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# NAT
#
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE

#
# Saving
#
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables

Exécutons le script ci-dessus et perdons la possibilité d'établir de nouvelles connexions SSH filaires avec le Raspberry Pi. C'est exact, nous avons fabriqué un routeur Wi-Fi, dont l'accès « par Internet » est par défaut interdit — maintenant, uniquement « sans fil ». Connectons le câble du fournisseur à l'Ethernet et commençons à naviguer !

8. Bonus : +2,4GHz

Lorsque j'ai assemblé le premier routeur Raspberry selon le schéma décrit ci-dessus, j'ai découvert un certain nombre de gadgets dans ma possession qui, en raison de leurs limitations structurelles, ne pouvaient pas voir la « framboise » via Wi-Fi. Il n'était pas fair-play de reconfigurer le routeur pour fonctionner en 802.11b/g/n, car la vitesse maximale « sans fil » dans ce cas ne dépassait pas 40 Mbit, tandis que mon fournisseur d'accès Internet préféré m'offre 100 (par câble).

En fait, la solution au problème avait déjà été trouvée : une deuxième interface Wi-Fi fonctionnant à 2,4 GHz et un second point d'accès. Dans le kiosque le plus proche, j'ai acheté non pas la première, mais la deuxième clé USB Wi-Fi qui m'est tombée sous la main. Le vendeur a été assailli par des questions sur le chipset, la compatibilité avec les cœurs ARM sous Linux et la possibilité de fonctionner en mode AP (c'est lui qui a commencé).

Nous configurons la « clé » de manière similaire à l'adaptateur Wi-Fi intégré.

Tout d'abord, renommez-la en wl1:

# cat /sys/class/net/wlan0/address 
b0:6e:bf:xx:xx:xx

/etc/systemd/network/wl1.link:

[Match]
MACAddress=b0:6e:bf:xx:xx:xx

[Link]
Name=wl1

Nous confierons la gestion de la nouvelle interface Wi-Fi à un démon distinct hostapd, qui sera lancé et arrêté en fonction de la présence dans le système de la « clé » spécifiée : wl1.

Fichier de configuration /etc/hostapd/hostapd2.conf:

ssid=rpi2
wpa_passphrase=1234567890

#channel=1
#channel=6
channel=11

interface=wl1
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=g
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

Le contenu de ce fichier dépend directement du modèle de l'adaptateur Wi-Fi USB, donc un simple copier/coller peut vous causer des problèmes.

Nous copions le fichier de service distribué dans /etc/systemd/system/hostapd2.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service

et nous le modifions comme suit :

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl1.device
BindsTo=sys-subsystem-net-devices-wl1.device

[Service]
Type=forking
PIDFile=/run/hostapd2.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd2.conf -P /run/hostapd2.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl1.device

Il ne reste plus qu'à activer la nouvelle instance de hostapd :

# systemctl enable hostapd2

Et voilà ! Secouez la « clé » et la « framboise », regardez les réseaux sans fil autour.

Enfin, je tiens à alerter sur la qualité de l'adaptateur USB Wi-Fi et de l'alimentation du Raspberry. Une « clé » connectée à chaud peut parfois provoquer un « gel de la framboise » en raison de légers problèmes électriques.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster