Raspberry Pi + CentOS = Wi-Fi Hotspot (ou routeur Raspberry avec un chapeau rouge)

Il existe une énorme quantité d'informations sur Internet sur la création de points d'accès Wi-Fi basés sur un PC monocarte Raspberry. En règle générale, cela signifie utiliser le système d’exploitation Raspbian natif du Raspberry.

Étant un adepte des systèmes basés sur RPM, je ne pouvais pas passer à côté de ce petit miracle et ne pas essayer mon CentOS bien-aimé dessus.

L'article fournit des instructions pour créer un routeur Wi-Fi 5 GHz/AC à partir d'un Raspberry Pi 3 modèle B+ basé sur le système d'exploitation CentOS. Il y aura plusieurs astuces standards mais peu connues, et en bonus - un schéma pour connecter un équipement Wi-Fi supplémentaire au Raspberry, lui permettant de fonctionner simultanément dans plusieurs modes (2,4+5 GHz).

Raspberry Pi + CentOS = Wi-Fi Hotspot (ou routeur Raspberry avec un chapeau rouge)
(mélange d'images disponibles gratuitement)

Notons d'emblée que certaines vitesses cosmiques ne fonctionneront pas. Je tire un maximum de 100 Mbps de mon Raspberry par voie hertzienne, ce qui couvre la vitesse de mon fournisseur Internet. Pourquoi avez-vous besoin d'un courant alternatif aussi lent, si en théorie vous pouvez obtenir un demi-gigabit même sur N ? Si vous vous posez cette question, rendez-vous en magasin pour acheter un vrai routeur doté de huit antennes externes.

0. Ce dont vous aurez besoin

  • En fait, le « produit framboise » lui-même est de calibre : Pi 3 modèle B+ (pour atteindre les vitesses et canaux convoités de 5 GHz) ;
  • Bonne microSD >= 4 Go ;
  • Poste de travail avec Linux et lecteur/graveur microSD ;
  • Disponibilité de compétences suffisantes sous Linux, l'article s'adresse à un Geek formé ;
  • Connectivité réseau filaire (eth0) entre Raspberry et Linux, exécutant un serveur DHCP sur le réseau local et accès Internet depuis les deux appareils.

Un petit commentaire sur le dernier point. "Lequel est arrivé en premier, l'œuf ou..." Comment fabriquer un routeur Wi-Fi en l'absence de tout équipement d'accès Internet ? Laissons cet exercice divertissant hors du cadre de l'article et supposons simplement que le Raspberry est connecté au réseau local par fil et a accès à Internet. Dans ce cas, nous n'aurons pas besoin d'un téléviseur supplémentaire et d'un manipulateur pour paramétrer la « framboise ».

1. Installez CentOS

Page d'accueil du projet

Au moment de la rédaction de cet article, la version exécutée de CentOS sur l'appareil est 32 bits. Quelque part sur le World Wide Web, je suis tombé sur des opinions selon lesquelles les performances de tels systèmes d'exploitation sur une architecture ARM 64 bits sont réduites jusqu'à 20 %. Je quitterai ce moment sans commentaire.

Sous Linux, téléchargez l'image minimale avec le noyau "-Tarte aux framboises-"et écrivez-le 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 en supprimer la partition SWAP, étendre la racine à l'ensemble du volume disponible et nous débarrasser de SELinux. L'algorithme est simple : faites une copie de la racine sous Linux, supprimez toutes les partitions de la microSD sauf la première (/boot), créez une nouvelle racine et renvoyez son contenu à partir de la copie.

Exemple d'actions requises (sortie sévère 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 décompressé le contenu de la partition racine, il est temps d'y apporter quelques modifications.

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

SELINUX=disabled

Édition /mnt/etc/fstab, en n'y laissant que deux entrées sur les partitions : boot (/boot, aucun changement) et root (on change la valeur UUID, qui peut être découverte en étudiant la sortie de la commande blkid sous Linux) :

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

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

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

Voici le contenu /mnt/cmdline.txt au formulaire suivant (une ligne sans tirets) :

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

Fait:

# cd
# umount /mnt
# sync

Nous réorganisons la microSD en « framboise », la lançons et obtenons un accès réseau via ssh (root/centos).

2. Configuration de CentOS

Les trois premiers mouvements inébranlables : passwd, yum -y mise à jour, reboot.

Nous offrons la gestion du réseau en réseau:

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

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

[Match]
Name=eth0

[Network]
DHCP=ipv4

Nous redémarrons le "framboise" et obtenons à nouveau un accès réseau via ssh (l'adresse IP peut changer). Faites attention à ce qui est utilisé / Etc / resolv.conf, créé précédemment par Network Manager. Par conséquent, en cas de problèmes de résolution, modifiez son contenu. Utiliser résolu par systemd nous n'allons pas.

Nous supprimons les « inutiles », réparons et accélérons le chargement de l'OS :

# 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 cron et qui ne digère pas l'intégré minuteries système, peut établir ce qui manque. / var / log- et regarde à travers journalctl. Si vous avez besoin d'un historique des journaux (par défaut, les informations ne sont stockées qu'à partir du moment où le système démarre) :

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

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

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

La pertinence du temps sur la « framboise » est une chose importante. Étant donné qu'il n'est pas possible de sauvegarder l'état actuel de l'horloge au redémarrage, une synchronisation est nécessaire. Un démon très bon et rapide pour cela est chrony - déjà installé et démarre automatiquement. Vous pouvez remplacer les serveurs NTP par 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 utiliserons tour. Puisque notre objectif est de créer un routeur Wi-Fi fonctionnant à des fréquences de 5 GHz, nous nous préparerons à l'avance aux surprises régulateur:

# miam info crda
Résumé : Démon de conformité réglementaire pour les réseaux sans fil 802.11

Cette conception maléfique, également basée sur le fuseau horaire, « interdit » l’utilisation (en Russie) des fréquences 5 GHz et des canaux avec des numéros « élevés ». L'astuce consiste à définir un fuseau horaire sans utiliser les noms de continents/villes, c'est-à-dire au lieu de :

# timedatectl set-timezone Europe/Moscow

On appuie sur :

# timedatectl set-timezone Etc/GMT-3

Et la touche finale à la coiffure du système :

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

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

3. Modules complémentaires CentOS

Tout ce qui a été dit ci-dessus peut être considéré comme des instructions complètes pour installer CentOS « vanille » sur le Raspberry Pi. Vous devriez vous retrouver avec un PC qui (re)démarre en moins de 10 secondes, utilise moins de 15 Mo de RAM et 1.5 Go de microSD (en réalité moins de 1 Go à cause d'un /boot incomplet, mais soyons honnêtes).

Pour installer le logiciel de point d'accès Wi-Fi sur ce système, vous devrez étendre légèrement les capacités de la distribution CentOS standard. Tout d'abord, mettons à niveau le pilote (micrologiciel) de l'adaptateur Wi-Fi intégré. La page d'accueil du projet dit :

Wifi sur les Raspberry 3B et 3B+

Les fichiers du firmware 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 de distribution Wi-Fi dans CentOS par celui correspondant des développeurs Broadcom (ces mêmes blobs binaires détestés...). Ceci vous permettra notamment d'utiliser AC en mode point d'accès.

Mise à niveau du micrologiciel Wi-FiDécouvrez 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 la 7.45.18 du 01.03.2015/XNUMX/XNUMX, et rappelons l'ensemble de chiffres suivant : 43455 (brcmfmac43455-sdio.bin).

Téléchargez l'image Raspbian actuelle. Les paresseux peuvent écrire l'image sur microSD et y récupérer les fichiers avec le firmware. Ou vous pouvez monter la partition racine de l'image sous Linux et copier ce dont vous avez besoin à partir 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 du micrologiciel de l'adaptateur Wi-Fi résultants doivent être copiés et remplacés par « framboise » dans le répertoire /usr/lib/firmware/brcm/

On redémarre le futur routeur et on sourit de contentement :

# 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/XNUMX/XNUMX.

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 du réseau et défis à venir

Comme nous l'avons convenu plus haut, la « framboise » est connectée par « fil » au réseau local. Supposons que le fournisseur fournisse l'accès à Internet exactement de la même manière : l'adresse sur le réseau public est émise dynamiquement par le serveur DHCP (éventuellement avec une liaison MAC). Dans ce cas, après la configuration finale du raspberry, il vous suffit de « brancher » le câble du fournisseur dessus et le tour est joué. Autorisation utilisant systemd-networkd - le sujet d'un article séparé et n'est pas abordé ici.

La ou les interfaces Wi-Fi du Raspberry sont un réseau local et l'adaptateur Ethernet intégré (eth0) est externe. Numérotons le réseau local de manière statique, par exemple : 192.168.0.0/24. Adresse framboise : 192.168.0.1. Un serveur DHCP fonctionnera sur le réseau externe (Internet).

Problème de cohérence de dénomination и célèbre programmeur guatémaltèque - deux problèmes qui attendent quiconque configure les interfaces réseau et les services dans les distributions systemd.

Chaos parallèle (digression lyrique)Lennart Pottering a compilé son propre programme systemd Très bien. Ce systemd lance d'autres programmes si vite que ceux-ci, n'ayant pas le temps de se remettre du coup de sifflet de l'arbitre, trébuchent et tombent au départ sans même entamer leur parcours du combattant.

Mais sérieusement, la parallélisation agressive des processus lancés au démarrage du système d'exploitation systemd est une sorte de « pont d'âne » pour les spécialistes chevronnés du LSB séquentiel. Heureusement, mettre de l’ordre dans ce « chaos parallèle » s’avère simple, même si ce n’est pas toujours évident.

Nous créons deux interfaces de pont virtuel avec des noms constants : lan и blême. Nous allons « connecter » le ou les adaptateurs Wi-Fi au premier, et le « raspberry » eth0 au second.

/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=oui élimine le besoin de faire allusion au noyau via sysctl pour activer le routage.
Adresse MAC= Décommentons et modifions si nécessaire.

Nous « connectons » d’abord eth0. On se souvient du « problème d'uniformité » et on utilise uniquement l'adresse MAC de cette interface, que l'on peut connaître par exemple comme ceci :

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

Créer /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 le Raspberry et y obtenons un accès réseau (l'adresse IP changera très probablement) :

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

5.DNSMASQ

Pour créer des points d'accès Wi-Fi, rien ne vaut quelques bons dnsmasq + hébergeur Je ne l'ai pas encore compris. À mon avis.

Au cas où quelqu'un aurait oublié, alors...hébergeur - c'est la chose qui contrôle les adaptateurs Wi-Fi (elle se chargera notamment de les connecter au réseau virtuel lan "framboises"), autorise et enregistre les clients sans fil.

dnsmasq — configure la pile réseau des clients : émet des adresses IP, des serveurs DNS, une passerelle par défaut et des plaisirs 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

modifiez-le à votre guise.

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 liaison-dynamique, qui indique au démon dnsmasq d'attendre jusqu'à ce qu'il apparaisse sur le système interface = réseau local, et ne s'évanouit pas d'un accès de fière solitude après le départ.

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

6. HOSTAPD

Et enfin, les configurations magiques d'hostapd. Je suis convaincu que quelqu’un lit cet article à la recherche précisément de ces lignes précieuses.

Avant d'installer hostapd, vous devez surmonter le « problème d'uniformité ». L'adaptateur Wi-Fi intégré wlan0 peut facilement changer son nom en wlan1 lors de la connexion d'un équipement Wi-Fi USB supplémentaire. Par conséquent, nous corrigerons les noms d'interface de la manière suivante : nous trouverons des noms uniques pour les adaptateurs (sans fil) et les lierons aux adresses MAC.

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

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

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

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

[Link]
Name=wl0

Maintenant, nous serons sûrs que wl0 - Il s'agit du Wi-Fi intégré. Nous redémarrons le Raspberry pour nous en assurer.

Installer:

# 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 oublier un instant GKChP, modifiez les paramètres dont nous avons besoin et vérifiez manuellement la fonctionnalité :

# hostapd /etc/hostapd/hostapd.conf

hostapd démarrera en mode interactif, diffusant son état à la console. S'il n'y a aucune erreur, les clients prenant en charge le mode AC pourront se connecter au point d'accès. Pour arrêter hostapd - Ctrl-C.

Il ne reste plus qu'à activer hostapd au démarrage du système. Si vous faites la chose standard (systemctl activate hostapd), alors après le prochain redémarrage, vous pouvez avoir un démon "roulant dans le sang" avec le diagnostic "interface wl0 introuvable". En raison du « chaos parallèle », hostapd a démarré plus rapidement que le noyau n'a trouvé l'adaptateur sans fil.

Internet regorge de remèdes : depuis un timeout forcé avant de démarrer le démon (plusieurs minutes), jusqu'à un autre démon qui surveille l'apparence de l'interface et (re)démarre le hostpad. Les solutions sont tout à fait réalisables, mais terriblement laides. Nous appelons le grand à l'aide systemd avec ses «objectifs», ses «tâches» et ses «dépendances».

Copiez le fichier du service de distribution dans /etc/systemd/system/hostapd.service:

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

et réduisons son contenu à la forme suivante :

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
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 démarre ; lorsqu'il disparaît, il s'arrête. Et tout cela se fait 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.

Maintenant vous pouvez:

# systemctl enable hostapd
# reboot

7. IPTABLES

"Quoi ???" © Oui, oui ! Aucun systemd. Pas de moissonneuses-batteuses de dernière génération (sous la forme pare-feu), ce qui finit par faire la même chose.

Utilisons le bon vieux iptables, dont les services, après le démarrage, chargeront les règles réseau dans le noyau et s'arrêteront silencieusement sans rester résident et sans consommer de ressources. systemd a un élégant IPMascarade=, mais nous confierons toujours la traduction d'adresses (NAT) et le pare-feu à iptables.

Installer:

# yum install iptables-services
# systemctl enable iptables ip6tables

Je préfère stocker 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

Nous exécutons le script ci-dessus et perdons la possibilité d'établir de nouvelles connexions SSH filaires avec le Raspberry. C'est vrai, nous avons réalisé un routeur Wi-Fi, dont l'accès « via Internet » est interdit par défaut - désormais uniquement « par voie hertzienne ». Nous connectons le câble Ethernet du fournisseur et commençons à surfer !

8. Bonus : +2,4 GHz

Lorsque j'ai assemblé le premier routeur Raspberry à l'aide du dessin décrit ci-dessus, j'ai découvert un certain nombre de gadgets dans ma maison qui, en raison de leurs limitations de conception Wi-Fi, ne pouvaient pas du tout voir la « framboise ». Reconfigurer le routeur pour qu'il fonctionne en 802.11b/g/n était antisportif, puisque dans ce cas la vitesse maximale « over the air » ne dépassait pas 40 Mbit, et mon fournisseur Internet préféré m'en propose 100 (par câble).

En fait, une solution au problème a déjà été inventée : une deuxième interface Wi-Fi fonctionnant à une fréquence de 2,4 GHz, et un deuxième point d'accès. Sur un stand voisin, j'ai acheté non pas le premier, mais le deuxième « sifflet » USB Wi-Fi que j'ai rencontré. Le vendeur était tourmenté par des questions sur le chipset, la compatibilité avec les noyaux ARM Linux et la possibilité de travailler en mode AP (il fut le premier à se lancer).

Nous configurons le « sifflet » par analogie avec l'adaptateur Wi-Fi intégré.

Tout d’abord, renommez-le 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 hostapd distinct, qui démarrera et s'arrêtera en fonction de la présence d'un « sifflet » strictement défini dans le système : 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 banal copier/coller peut vous échouer.

Copiez le fichier du service de distribution dans /etc/systemd/system/hostapd2.service:

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

et réduisons son contenu à la forme suivante :

[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 une nouvelle instance de hostapd :

# systemctl enable hostapd2

C'est tout! Tirez le « sifflet » et la « framboise » elle-même, regardez les réseaux sans fil autour de vous.

Et enfin, je tiens à vous mettre en garde sur la qualité de l'adaptateur Wi-Fi USB et de l'alimentation du Raspberry. Le « sifflet chaud » connecté peut parfois provoquer un « gel des framboises » en raison de problèmes électriques à court terme.

Source: habr.com

Ajouter un commentaire