Es handelt sich um einen Zugangspunkt zusammen mit einer WLAN- Client-Verbindung zu einem anderen WLAN-Netzwerk (WLAN-Repeater) oder einem Internet-Router.
Wenn Sie einen Zugangspunkt zusammen mit einem Ethernet-Port eth0 als Uplink zu einem Switch oder einem Internet-Router wünschen, lesen Sie den einfachen Weg, um einen Raspberry Pi als Zugangspunkt einzurichten .
Getestet auf einem Raspberry Pi 4B mit
Raspbian Buster Lite 2020-02-13 aktualisiert am 2020-03-03.
Updates durchgeführt mit sudo apt update && sudo apt full-upgrade && sudo reboot
.
Hier finden Sie die letzte getestete Revision für Raspbian Stretch Lite .
Der Raspberry Pi kann als drahtloser Hotspot fungieren und gleichzeitig eine Verbindung zu einem anderen Hotspot als Client herstellen. Das WLAN-Gerät auf dem RasPi hat jedoch eine allgemeine Einschränkung. Die Clientverbindung kann nicht überbrückt werden, da kein WDS (Wireless Distribution System) vorhanden ist, das für die Überbrückung der drahtlosen Verbindung erforderlich ist. Weitere Informationen finden Sie unter Raspberry Pi WiFi to Ethernet Bridge für einen Server? . Daher können wir das Routing nur für die WLAN-Client-Verbindung zum Internet-Router verwenden. Der WLAN-Hotspot und der kabelgebundene Ethernet-Port können jedoch überbrückt werden, sodass alle Geräte im WLAN und der kabelgebundene Port dieselbe Broadcast-Domäne in ihrem gemeinsamen Subnetz haben können.
Ich gehe davon aus, dass Sie bereits eine Verbindung zum Internet haben. Alle Befehle können einfach kopiert und in die Befehlszeile des RasPi eingefügt werden. Die Blöcke mit EOF können Sie aus cat
inkl. das letzte EOF
und fügen Sie es in die RasPis-Befehlszeile ein. Mit Enter wird es in eine Datei ohne das Trennzeichen EOF kopiert.
Wir werden zuerst einen WLAN-Repeater einrichten, damit jeder, der dies nur benötigt, die Einrichtung an dieser Stelle beenden und verwenden kann. Für diejenigen, die einen überbrückten Ethernet-Port mit dem WLAN-Zugangspunkt benötigen, kann die Einrichtung fortgesetzt werden.
Ich benutze systemd-networkd aus Gründen. Für den Ungeduldigen zuerst nur das Setup.
♦ WLAN-Repeater einrichten
Beispiel für dieses Setup:
wifi wifi wan
mobile-phone <~.~.~.~.~> (ap0)RPi(wlan0) <.~.~.~.~.> router <───> INTERNET
╲ ╱ ╲
(dhcp 192.168.4.1 (dhcp
from RPi) from router)
Schritt 1: Richten Sie systemd-networkd ein
Folgen Sie
einfach
Systemd-networkd für allgemeine Netzwerke verwenden . Sie können den Abschnitt
"♦ Quick Step" verwenden . Dann komm zurück.
Schritt 2: Installieren Sie hostapd für den Access Point
rpi ~$ sudo -Es # if not already done
rpi ~# apt install hostapd
rpi ~# systemctl unmask hostapd.service
rpi ~# systemctl enable hostapd.service
Erstellen Sie diese Datei mit Ihren Einstellungen für ssid=
, country_code=
und wpa_passphrase=
. Wenn channel=
Sie denselben Kanal auswählen, stellt wpa_supplicant mit wlan0 eine Verbindung zu Ihrem Internet-Router her.
BEACHTUNG! Dies ist eine Einschränkung der Hardware. hostapd
setzt den Kanal immer auf den gleichen Wert wie über die Clientverbindung, unabhängig davon, was Sie hier einstellen. Wenn Sie andere Kanäle benötigen, müssen Sie einen zusätzlichen USB / WiFi-Dongle verwenden.
rpi ~# cat > /etc/hostapd/hostapd.conf <<EOF
interface=ap0
driver=nl80211
ssid=RPiNet
country_code=DE
hw_mode=g
channel=1
auth_algs=1
wpa=2
wpa_passphrase=verySecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
rpi ~# chmod 600 /etc/hostapd/hostapd.conf
Bearbeiten Sie den hostapd.service :
rpi ~# systemctl --full edit hostapd.service
und kommentiere die Zeile After=network.target
mit, #
damit es so aussieht:
#After=network.target
Speichern Sie es und beenden Sie den Editor. Fügen Sie als nächstes die Schnittstelle ap0 zum hostapd.service hinzu mit:
rpi ~# systemctl edit hostapd.service
Fügen Sie im leeren Editor diese Anweisungen ein. Achten Sie =-
bei einigen Aussagen auf das Minuszeichen nach gleich . Speichern Sie es und beenden Sie den Editor:
[Unit]
Wants=wpa_supplicant@wlan0.service
[Service]
Restart=
Restart=no
ExecStartPre=/sbin/iw dev wlan0 interface add ap0 type __ap
ExecStopPost=-/sbin/iw dev ap0 del
Schritt 3: Richten Sie wpa_supplicant für die Clientverbindung ein
Erstellen Sie diese Datei mit den Einstellungen für country=
, ssid=
und psk=
und ermöglicht es:
rpi ~# cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="TestNet"
psk="realyNotMyPassword"
key_mgmt=WPA-PSK # see ref (4)
}
EOF
rpi ~# chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
rpi ~# systemctl disable wpa_supplicant.service
rpi ~# systemctl enable wpa_supplicant@wlan0.service
rpi ~# rfkill unblock 0
Erweitern Sie wpa_supplicant mit:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
Fügen Sie im leeren Editor diese Anweisungen ein. Speichern Sie es und beenden Sie den Editor:
[Unit]
BindsTo=hostapd.service
After=hostapd.service
Schritt 4: Richten Sie statische Schnittstellen ein
Erstellen Sie diese Dateien:
rpi ~# cat > /etc/systemd/network/08-wlan0.network <<EOF
[Match]
Name=wlan0
[Network]
DNSSEC=no
# If you need a static ip address, then toggle commenting next four lines (example)
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF
Für diejenigen, die eine Bridge möchten, benötigen Sie nicht die nächste Datei und müssen mit Setup Bridge fortfahren .
rpi ~# cat > /etc/systemd/network/12-ap0.network <<EOF
[Match]
Name=ap0
[Network]
DNSSEC=no
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
Die Einrichtung eines WLAN-Repeaters ohne Brücke ist abgeschlossen. Sie müssen neu
starten.
♦ Bridge einrichten
Richten Sie den WLAN-Repeater wie oben beschrieben ein.
Beispiel für dieses Setup:
(dhcp
from RPi) bridge
╱ wifi ┌──────┐
mobile-phone <~.~.~.~.> │(ap0) │ wifi wan
│ br0│RPi(wlan0) <.~.~.~.~> router <───> INTERNET
laptop <────────> |(eth0)│╲ ╲
╲ wired └──────┘╱ (dhcp
(dhcp 192.168.4.1 from router)
from RPi)
Schritt 5: Konfigurieren Sie hostapd für eine Bridge
Fügen Sie eine Zeile bridge=br0
zu /etc/hostapd/hostapd.conf mit:
rpi ~# echo 'bridge=br0' >> /etc/hostapd/hostapd.conf
Schritt 6: Richten Sie wpa_supplicant für eine Brücke ein
Erweitern Sie wpa_supplicant mit:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
Fügen Sie im Editor Zeilen hinzu, damit es wie folgt aussieht. Achten Sie =-
bei einigen Aussagen auf das Minuszeichen nach gleich . Speichern Sie es und beenden Sie den Editor:
[Unit]
BindsTo=hostapd.service
After=hostapd.service
Wants=ap-bring-up.service
Before=ap-bring-up.service
[Service]
ExecStopPost=-/bin/ip link set ap0 up
Bitte beachten Sie, dass dies ExecStopPost=-/bin/ip link set ap0 up
kein Tippfehler ist. Beim Stoppen von wpa_supplicant muss die Schnittstelle ap erneut eingerichtet werden , wie im Abschnitt Details - wpa_supplicant für Bridge (Schritt 6) beschrieben .
Schritt 7: Rufen Sie den Access Point mit der virtuellen WLAN-Schnittstelle auf
Erstellen Sie eine Einheit mit:
rpi ~# systemctl --force --full edit ap-bring-up.service
Fügen Sie im leeren Editor diese Anweisungen ein, speichern Sie sie und beenden Sie den Editor:
[Unit]
Description=Bring up wifi interface ap0
Requisite=hostapd.service
[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=60 --quiet
ExecStartPost=/bin/ip link set ap0 up
ExecStartPost=/usr/bin/resolvectl dnssec ap0 no
Schritt 8: Richten Sie statische Schnittstellen ein
Für eine Brücke wird ap0 dynamisch erstellt. Erstellen Sie also diese Dateien:
rpi ~# cat > /etc/systemd/network/02-br0.netdev <<EOF
[NetDev]
Name=br0
Kind=bridge
EOF
rpi ~# cat > /etc/systemd/network/04-eth0.network <<EOF
[Match]
Name=eth0
[Network]
DNSSEC=no
Bridge=br0
EOF
rpi ~# cat > /etc/systemd/network/16-br0_up.network <<EOF
[Match]
Name=br0
[Network]
DNSSEC=no
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
Starten Sie neu.
Das ist es.
♦ Details
Allgemeines
Ein Problem ist, dass wir dasselbe Gerät für einen WLAN-Client und einen Zugangspunkt verwenden möchten. Dies muss von der WLAN-Hardware unterstützt werden. Wir können dies überprüfen mit
rpi ~$ sudo iw list | grep -A4 "valid interface combinations:"
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
Der wichtige Teil ist, #{ managed } <= 1, #{ AP } <= 1,
aber Sie können auch sehen, dass dies nur auf einem Kanal möglich ist .
Ich habe festgestellt, dass wir dies nacheinander einrichten müssen, sonst funktioniert es nicht. Wenn andere Anwendungen an den WLAN-Port gebunden sind, kann dieser nicht festgelegt werden.
- Erstellen Sie eine virtuelle Schnittstelle
ap0
für den Access Point
- Starten Sie den Access Point Daemon
hostapd
über die Schnittstelleap0
- Starten Sie
wpa_supplicant
für den WLAN-Client über die Schnittstellewlan0
Diese Reihenfolge schränkt das gesamte Setup ein. Es ist nicht möglich, hostapd zu starten, wenn wpa_supplicant ausgeführt wird. Sie müssen zuerst wpa_supplicant stoppen und dann hostapd und wpa_supplicant in dieser Reihenfolge starten . Dies liegt am WiFi-Treiber brcmfmac
.
Eine weitere Besonderheit ist, dass wpa_supplicant die Schnittstelle ap0 deaktiviert, wenn sie verwaltet wird, unabhängig davon, ob sie gestartet oder gestoppt wird. Selbst nach einem Start von wpa_supplicant müssen wir ap0 wieder aktivieren .
Hierbei handelt es sich hauptsächlich um fünf Komponenten: virtuelle Schnittstelle ap0 , hostapd , wpa_supplicant , Setup Bridge und Aufrufen des Zugriffspunkts.
hostapd (Schritt 2)
Dies ist das normale Setup, das Sie im gesamten Web finden. Bitte stellen Sie den Kanal auf den gleichen Wert ein, dann wird wlan0 von Ihrem Router aus mit dem WLAN verbunden. Dies ist die Einschränkung der Hardware und kann Verwechslungen mit den Kanaleinstellungen vermeiden. hostapd setzt den Kanal immer auf den gleichen Wert wie über die Clientverbindung, unabhängig davon, was Sie hier einstellen.
Bitte verwenden Sie eine Passphrase, die lang genug ist, ich würde sagen, mindestens mit 8 Zeichen. Es wurde gesagt, dass 4 Zeichen zu klein sind und hostapd sich weigert, Verbindungen zu akzeptieren. Sie finden den Access Point RPiNet nicht auf Ihrem Mobiltelefon (dank @Leo ).
Für Abhängigkeiten erweitern wir die Einheit von hostapd um eine Drop-In-Datei (Overlay) (2) . Es startet immer wpa_supplicant (will es). In der Hauptgerätedatei befindet sich ein Restart=always
Satz. Dies ist dramatisch, wenn das Erstellen der Schnittstelle ap0 aus irgendeinem Grund fehlschlägt. Beim Booten versucht das RasPi immer, hostapd in einer Endlosschleife zu starten, und beendet das Booten nie. Sie müssen die Stromversorgung unterbrechen und die SD-Karte in einem anderen Computer reparieren. Das ist eine sehr schlechte Konfiguration. Sie sollten Restart wirklich deaktivieren. Dann wird die Schnittstelle ap0 erstellt, bevor hostapd gestartet wird . Dies wird in der Startreihenfolge eingehalten. Weil ap0 an wlan0 gebunden istEs erhält die gleiche Mac-Adresse. Sie können eine eindeutige Mac-Adresse angeben, aber das ist keine gute Idee. Im Netzwerk wird nur die Mac-Adresse von wlan0 angezeigt . Wenn Sie ap0 eine eigene Mac-Adresse geben, wird diese im Netzwerk nicht für Arp-Anfragen angezeigt und die IP-Adresse für Verbindungen zu ap0 wird nicht gefunden und bleibt hängen . Sie müssen ap0 auf den Promiscuous-Modus setzen, damit es dann funktioniert.
Nach dem Einrichten der Abhängigkeiten wird standardmäßig der hostapd.service gestartet After=network.target
. Der wpa_supplicant@wlan0.service muss After=hostapd.service
standardmäßig gestartet werden Before=network.target
. Sehen Sie den Konflikt mit network.target
? Systemd beschwert sich mit der Fehlermeldung " Bestellzyklus auf wpa_supplicant@wlan0.service/start gefunden " und verhindert, dass hostapd.service gestartet wird. Das ist der Grund, warum wir einen Kommentar After=network.target
in der Unit-Datei des hostapd.service machen müssen.
Nach gestoppt hostapd dann AP0 wird auch so sie gelöscht wieder auf dem nächsten Start erstellt werden kann hostapd .
wpa_supplicant (Schritt 3)
Das Einrichten von wpa_supplicant für wlan0 erfolgt wie gewohnt. Die erweiterte Einheit besteht darin, wpa_supplicant strikt an hostapd zu binden, damit es in der richtigen Reihenfolge damit gestartet und gestoppt wird. Wir tun dies, weil das Ausführen von wpa_supplicant ohne hostapd sehr kompliziert ist und zu einem Totalabsturz des brcmfmac- WLAN-Treibers führen kann. Das habe ich bei meinen Tests gesehen.
Richten Sie statische Schnittstellen ein (Schritt 4)
Hier definieren wir die Schnittstelle wlan0 und die virtuelle Schnittstelle ap0, die wir für einen WLAN-Repeater benötigen. Für wlan0 erhalten wir eine IP-Adresse per DHCP vom Internet-Router. Optional können Sie eine statische IP-Adresse festlegen, müssen dann aber auch alle anderen Einstellungen wie Gateway und DNS-Server definieren, da Sie diese nicht mehr vom DHCP-Server erhalten.
Die Schnittstelle ap0 benötigt eine statische IP-Adresse, da sie der Zugangspunkt und die Quelle des DHCP-Servers für das WLAN-Netzwerk ist. Es ist nicht erforderlich, dass Clients, die mit dem Internet-Router verbunden sind, auch eine Verbindung zu Clients auf dem Zugriffspunkt herstellen müssen. Wir können also NAT (IPMasquerade = yes) verwenden, was die Einrichtung erheblich vereinfacht. Dann müssen wir keine statischen Routen konfigurieren und es ist nicht erforderlich, wlan0 mit statischen Werten (IP-Adresse, Gateway, DNS-Server usw.) zu konfigurieren .
Hostapd für Brücke (Schritt 5)
Wir haben hostapd in Schritt 2 eingerichtet. Jetzt müssen wir nur noch an bridge=br0
seine Konfiguration anhängen , damit es dynamisch gelingt, ap0 zur Bridge hinzuzufügen .
wpa_supplicant für Brücke (Schritt 6)
Wenn wpa_supplicant gestartet wird, wird auch die Schnittstelle wlan0 aufgerufen . Jedes Mal, wenn es verwaltet wird, egal ob es gestartet oder gestoppt wurde, stoppt es ap0, da es keine echte Schnittstelle ist und direkt von wlan0 abhängt . Dies ist auch der Grund, warum es nur aufgerufen werden kann, wenn wlan0 Träger erhalten hat. Wir können aber nicht einfach einige Sekunden warten und dann ap0 aufrufen . wpa_supplicant.service muss vollständig gestartet sein, daher können wir hierfür nur einen zusätzlichen Dienst ap-bring-up.service verwenden . Die Abhängigkeiten stellen dies sicher.
Nach dem Stoppen von wpa_supplicant (bring wlan0 down) muss ap0 erneut hochgefahren werden, damit es für den Access Point weiter ausgeführt werden kann.
Rufen Sie den Zugangspunkt auf (Schritt 7).
Es ist nicht möglich, ap0 bei Bedarf einzurichten . Es kann nur gestartet werden, wenn wlan0 "Gained Carrier" ist und die Verbindung bereit ist (3) . Dies geschieht einige oder mehr Sekunden nach dem Start von wpa_supplicant . Wir brauchen also einen ap-bring-up.service , den wpa_supplicant will und der prüft, ob wlan0 "Gained Carrier" hat und online ist. Es gibt ein Hilfsprogramm systemd-networkd-wait-online , das dies synchron ausführen kann. Wir verwenden es mit einer Zeitüberschreitung von 60 Sekunden. Wenn das Aufstehen Ihrer Netzwerkverbindung länger als 60 Sekunden dauert, sollten Sie das Zeitlimit entsprechend erhöhen. Mit können journalctl -b -e
Sie überprüfen, ob Starting Bring up wifi interface ap0...
undStarted Bring up wifi interface ap0.
Abdeckungen wlan0: Gained carrier
. Dies ist sehr wichtig, da sonst die Bridge bei undefiniertem Verhalten nicht richtig funktioniert. Und natürlich sollte dieses Gerät nur starten, wenn hostapd ausgeführt wird (Voraussetzung).
Definieren Sie statische Schnittstellen für die Brücke (Schritt 8).
Diese Dateien definieren die Brücke. ap0 wird dynamisch von hostapd hinzugefügt . eth0 und ap0 sind Slaves der Bridge und benötigen keine IP-Adresse. Die Bridge br0 selbst benötigt ebenfalls keine IP-Adresse, hat hier jedoch eine statische IP-Adresse, da diese für den an br0 gebundenen DHCP-Server benötigt wird, damit der DHCP-Server im Subnetz der Bridge verfügbar ist (Schnittstellen eth0, ap0).
Da bei der Aktivierung von DNSSEC Probleme mit der Namensauflösung aufgetreten sind, ist diese überall deaktiviert. Wenn es verwendet wird, können wir es nach Bedarf aktivieren.
Fazit
Sie können jetzt hostapd und wpa_supplicant starten, stoppen und neu starten .
Sie sollten den Zugangspunkt, hier RPiNet , in Ihrem Mobiltelefon sehen und eine IP-Adresse erhalten, um eine Verbindung zum Zugangspunkt herzustellen . Sie sollten auch eine IP-Adresse aus demselben Subnetz erhalten, wenn Sie einen Laptop mit einem Kabel an den Ethernet-Anschluss anschließen und das Mobiltelefon anpingen können.
Mit diesem Setup haben Sie die folgenden Abhängigkeiten beim Starten und Stoppen:
hostapd │ wpa_supplicant wpa_supplicant │ hostapd
───────────┼────────────────────────────────────┼──────────
starting │ starts starting │ starts
stopping │ stops stopping │ ----
restarting │ restarts restarting │ starts
Dies liegt an der strengen Startreihenfolge (siehe Abschnitt Allgemein ). Sie können wpa_supplicant nicht ohne hostapd ausführen, aber Sie können hostapd ohne wpa_supplicant ausführen, indem Sie hostapd starten und dann wpa_supplicant stoppen .
Wenn die Kommunikation aus irgendeinem Grund (zB Verzögerung zu klein oder etwas anderes) hält ist es meist genug Kick AP0 mit /bin/ip link set ap0 up
.
Referenzen:
[1] Migration vom Netzwerk zu systemd-networkd mit dynamischem Failover
[2] man systemd.unit
[3] systemd-networkd drahtlose Überbrückung - muss auf den Netzbetreiber warten
[4] WLAN auf Pi 3 B + einrichten