[[Vorlage(fortgeschritten)]]
[[Vorlage(Getestet, focal, bionic, )]]

{{{#!vorlage Wissen
[:Programme_starten: Starten von Programmen]
[:Terminal: Ein Terminal öffnen]
[:mit Root-Rechten arbeiten:]
}}}

[[Inhaltsverzeichnis()]]

Bevor eine WLAN-Schnittstelle als Netzwerkschnittstelle benutzt oder auch nur konfiguriert werden kann, muss sie mit einem Funknetz gekoppelt werden. Diese Kopplung übernehmen bei Ubuntu die Programme [:WLAN/wpa_supplicant:wpa_supplicant] und [:WLAN_Router/#hostapd: hostapd], je nachdem man einem bestehenden Funknetz als Arbeitsstation beitreten oder selbst für andere ein solches Funknetz anbieten möchte. Im Gegensatz zu [:NetworkManager:] arbeitet [:systemd/networkd:systemd-networkd] selber nicht mit diesen Programmen zusammen.

Dieser Artikel beschreibt, wie man die bei systemd-networkd fehlende Funktionalität ersetzen kann.

{{{#!vorlage Hinweis
In diesem Artikel wird beispielhaft verwendet:

 * „`Romeo`“ für den Funknetznamen (SSID)
 * „`Ich liebe Julia!`“ als Passwort
 * „`radio`“  als Name für die WLAN-Schnittstelle
 * „`ROMEO`“ für den Namen der Konfigurationsdatei für das Funknetz `Romeo`
}}}

= Arbeitsstation =
Für wpa_supplicant benötigt man eine Konfigurationsdatei, welche mindestens die Funknetzkennung SSID und das Passwort enthalten muss. Es wird jedoch empfohlen, die weiteren im Artikel [:WLAN/wpa_supplicant:wpa_supplicant] erläuterten Optionen zu benutzen.

Eine minimale Konfigurationsdatei kann man so anlegen:

{{{#!vorlage Befehl
wpa_passphrase Romeo "Ich liebe Julia!" | sudo tee /etc/wpa_supplicant/ROMEO
sudo chmod 640 /etc/wpa_supplicant/ROMEO
}}}

Die so angelegte Datei mit dem geheimen Passwort sollte nur für `root` lesbar sein.

Nach diesen Vorbereitungen kann man mit folgenden Befehlen bereits dem Funknetz beitreten:

{{{#!vorlage Befehl
sudo ip link set radio up
sudo wpa_supplicant -B -i radio -c /etc/wpa_supplicant/ROMEO
}}}

Die WLAN-Schnittstelle `radio` ist nun auch auf Ebene 3 eine Netzwerkschnittstelle, welcher zur Konfiguration der IP-Adressen, Routen usw. von systemd-networkd eine Konfigurationsdatei mit Endung '''.network''' zugeordnet werden kann.

Alternativ kann man anstelle des Programms [:WLAN/wpa_supplicant:wpa_supplicant] auch den [#Links Intel Wireless Daemon (iwd)] benutzen, der allerdings erst aus der [:Paketquellen: Paketquelle universe] als Paket '''iwd''' installiert oder aus dem Quellcode von der Projektseite selbst kompiliert werden muss.

= Access Point =
Im Grunde geht man genauso wie unter [#Arbeitsstation Arbeitsstation] beschrieben vor, benutzt jedoch [:WLAN_Router/#hostapd: hostapd].

Man erstellt eine Konfigurationsdatei für hostapd:
{{{
# /etc/hostapd/ROMEO – Konfigurationsdatei für hostapd

hw_mode=g
channel=1
ssid=Romeo

driver=nl80211
#interface=radio
#bridge=HUB

### Identifizierung/Authentifizierung der Nutzer
# …
}}}

Die minimale Konfigurationsdatei enthält nur die grundlegenden Eigenschaften des Funknetzes wie Band (hier `g` für 2,4 GHz), Kanal und Funknetznamen und Angaben zu Schnittstellen. Man sollte unbedingt noch Angaben zur Zugangskontrolle und zur Verschlüsselung des Verkehrs ergänzen.

Man startet den Zugangspunkt mit diesem Befehl:

{{{#!vorlage Befehl
sudo hostapd -B -i radio /etc/wpa_supplicant/ROMEO
}}}

Danach kann man weiter auf Netzwerkebene 3 mit systemd-networkd konfigurieren. (IP-Adresse, DHCP-Server, NAT/PT usw.)

Alternativ kann man den Zugangspunkt auch im Bridge-Modus starten und kann dann Pakete ohne Routing bereits auf Netzwerk-Ebene 2 mit einer Ethernet-Schnittstelle austauschen. Dazu man muss den Namen (hier beispielhaft: HUB) einer weiteren existierenden Schnittstelle vom Typ `bridge` in der  Konfigurationsdatei als Zeile "`bridge=HUB`" angeben; die bei `interface` angegebene Schnittstelle wird Port dieser [:Netzwerkbrücke:].

Eine solche Schnittstelle bedarf keinerlei weiteren Konfiguration auf Netzwerkebene 3.

In der folgend beschriebenen [:systemd/Units:Systemd-Unit] muss man nur bei `Description` die Beschreibung und bei `ExecStart` den Startbefehl anpassen.

= Automatisierung =
Wenn der manuelle Start einwandfrei funktioniert, kann man das beispielsweise über eine (parametrierte) Systemd-Unit in der Datei '''/etc/systemd/system/ROMEO@.service''' in sein System einbauen:

{{{
# /etc/systemd/system/ROMEO@.service
[Unit]
Description = Arbeitsstation im Funknetz «%p» über %i
#Description = Zugangspunkt für Funknetz «%p» über %i
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes

ExecStart = /sbin/ip link set %i up
ExecStart = /sbin/wpa_supplicant -B -i %i -c /etc/wpa_supplicant/%p
#ExecStart = /usr/sbin/hostapd -B -i radio /etc/hostapd/%p

ExecStop  = /sbin/ip link set %i down

[Install]
WantedBy=multi-user.target
}}}

Diese Systemd-Unit benutzt die Ersetzungsmarken `%i` und `%p`, welche Zeichenketten aus dem beim Aufruf verwendeten Namen lesen:

 * `%i` liest alles zwischen dem letzten Zeichen `@` und der mit Punkt beginnenden Endung. Dies wird hier zur Übergabe des Namens der Schnittstelle benutzt.
 * `%p` liest liest den Dateinamen bis vor das Zeichen `@`. Dies wird hier zur Angabe der bis auf die Endung gleichnameigen Konfigurationsdatei für hostap bzw wpa_supplicant verwendet.

Diesen Dienst kann man mit den Standardbefehlen von systemd nun starten/stoppen bzw. beim Hochlauf automatisch starten lassen usw., z.B.:

{{{#!vorlage befehl
systemctl start ROMEO@radio.service
}}}


= Links =
 * [https://de.wikipedia.org/wiki/OSI-Modell ISO/OSI-Referenzmodell Netzwerk (Netzwerk-Schichten)] {de}
 * [https://w1.fi/cgit/hostap/ Projektseite von hostapd und wpa_supplicant] {en}
 * [https://wireless.wiki.kernel.org/en/users/documentation/hostapd Dokumentation (Wiki) für hostapd] {en}
 * [https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf Konfigurationsdatei für hostapd von dessen Projektseite] {en}
 * [https://git.kernel.org/pub/scm/network/wireless/iwd.git/about/ Projektseite iwd] {en}

#tag: System, systemd, Netzwerk, WLAN