Marco Burmeister

  private Homepage



Linux WLAN access point mit hostapd und dnsmasq auf SuSE Leap 15

Ich habe für mich den Bedarf nach einem Gäste-Zugang zu meinem Netz festgestellt. Da mein Router das nicht beherrscht, habe ich mich für eine Lösung mittels Raspi Pi3b entschieden. Ich bevorzuge die Linux Version von SuSE, welche auch für Raspi-Computer verfügbar ist (siehe Download Link unten). Die Installation des Linux erfolgte gemäß Anleitung. Die Dokumentation setzt an dem Punkt ein, an dem alles installiert ist und die Einrichtung des WLANs und des access points erfolgen soll.

Da ich mit dem eigenen WLAN-Adapter vom Raspi kein WPA2 zu Android oder IPhone Geräten herstellen konnte, habe ich mir den WLAN Adapter Edimax EW-7612UAnv2 (Wi-Fi USB Adapter) gekauft und diesen an einen USB-Port angeschlossen. Er tauchte bei mir als WLAN1 Device im System auf.
Mit diesem Adapter, der auch vom OS automatische erkannt worden war, klappte die Verbindung mit WPA2 sofort.
Es gäbe nun die Möglichkeit, mit dem bereits eingebauten WLAN-Device eine drahtlose Verbindung zum Router aufzubauen. Das habe ich in meinem Ansatz nicht umgesetzt.

In der Anleitung gehe ich von den zwei Netzwerkschnittstellen eth0 (kabelgebunden) und wlan1 (kabellos - Wi-Fi) aus.




top Check WLAN-Adapter

Um zu prüfen, ob der WLAN-Adapter fähig ist auch als Access Point zu diesen, gibt es ein Linux Kommando namens iw.
Als User root den Befehl iw list ausführen.
Beispiel-Ausgabe:


Wiphy phy0
[...] 
    Supported interface modes:
      * IBSS
      * managed
      * AP
      * AP/VLAN
      * monitor
      * P2P-client
      * P2P-GO
      * P2P-device
[...]
    
Hier sollte nun eine Zeile mit dem Eintrag AP erscheinen.

top Kernel-Parameter einstellen

Damit das Forwarding von Netzwerk-Paketen funktioniert habe ich in der sysctl.conf einen entsprechenden Eintrag für IPv4 angelegt.
Als User root in der sysctl.conf eintragen:


 net.ipv4.ip_forward=1
    
Danach muss dann noch der folgende Befehl ausgeführt werden:

 sysctl -p
 		

top grub2 für alte Device-Namen konfigurieren

Mir gefielen die neuen Device-Namen der Art enp0s25... oder enx*MACADDRESS* nicht. Ich wollte wieder eth0 und wlan0 bzw. wlan1 haben. Die dafür notwendigen Änderungen bedeuten eine Einstellung im Boot-Loader und einen Reboot des Raspi.

Als User root in der Datei /etc/default/grub in der Zeile mit dem Parameter GRUB_CMDLINE_LINUX die folgenden beiden Einträge ergänzen:


 biosdevname=0 net.ifnames=0
 		
Danach muss dann noch der folgende Befehl ausgeführt werden:

 grub2-mkconfig -o /boot/grub2/grub.cfg
    
Im Anschluss ist ein Reboot des Raspi notwendig.

top Netzwerk IP Adressen

Vor den nächsten Schritten sollte man sich Gedanken über die IP-Range und den Domain Namen machen, die im WLAN genutzt werden soll.

Der Domain Name sollte im Internet keine Verwendung finden. Also zum Beispiel "wlan.beimir" .

Aus der IP Range muss eine Adresse für die WLAN-Schnittstelle verwendet werden. Zum Beispiel wären 192.168.0.0 bis 192.168.255.255 nutzbar. Sie dürfen noch nicht vom vorhandenen Router verwendet werden.

Konfigurationsbeispiel:

wlan1-Schnittstelle IP-Adresse192.168.5.200
IP-Range für das wlan-Netz192.168.5.1 - 192.168.5.150
Netmask255.255.255.0

top Lokales Netzwerk einrichten

Damit mein Rechner Zugang zum Router erhält benötigt er eine Netzwerkanbindung zu diesem. Ich habe hier einfach das Device eth0 mit DHCP im Netzwerk des Routers bekannt gemacht.
Als User root:
Folgende Einstellungen habe ich via Yast im Bereich Netzwerkeinstellungen gemacht:

MenüEinstellungWert
Global OptionsNetwork Setup MethodeWicked Service
Global OptionsIP6 Protocol SettingsCheckbox deaktivieren
Global OptionsChange default Route via DHCPCheckbox aktivieren
Global OptionsChange default Route via DHCPCheckbox aktivieren
Hostname / DNSHostnameeinnen Hostnamen vergeben
Hostname / DNSName Servers und DNS Search ListIP eines DNS Server im Internet angegeben (Beispiel 9.9.9.9)
RoutingEnable IPv4 ForwardingPrüfen Checkbox aktiviert
Danach im Menü Overview für die Schnittstelle eth0 folgendes prüfen.
MenüEinstellungWert
Network Card Setup - GeneralActivate DeviceAt Boot Time
Network Card Setup - GeneralFirewall ZoneHome Zone
Network Card Setup - AddressDynamic AddressDHCP

top WLAN einrichten

Nun folgt die Einrichtung der WLAN-Schnittstelle. Das habe ich ebenfalls via Yast durchgeführt.
Als User root:
Folgende Einstellungen habe ich via Yast im Bereich Netzwerkeinstellungen im Menü Overview für die Schnittstelle wlan1 gemacht.

MenüEinstellungWert
Network Card Setup - GeneralActivate DeviceAt Boot Time
Network Card Setup - GeneralFirewall ZoneExternal Zone
Network Card Setup - AddressStatically Assigned IP AddressCheckbox markieren
Network Card Setup - AddressIP AddressIP Addresse vergeben (192.168.5.200)
Network Card Setup - AddressSubnet Mask255.255.255.0 bzw. /24
Network Card Setup - AddressHostnamemeinap
Network Card Setup - Wireless Device SettingsOperating ModeManaged
Network Card Setup - Wireless Device SettingsNetwork Name ESSIDName vergeben (Beispiel: myap)
Network Card Setup - Wireless Device SettingsAuthentication ModeWPA-PSK
Network Card Setup - Wireless Device SettingsPassphrasePasswort vergeben

top Access Point einrichten

Die folgenden Konfigurationsschritte sind als User root auszuführen!
An dieser Stelle muss sichergestellt sein, dass die Software auch vorhanden ist. Hierfür die beiden Programme hostadp und dnsmasq installieren.


 zypper install hostapd
 zypper install dnsmasq

Danach geht es mit der Konfiguration weiter.

Einrichtung vom DHCP / DNS Server:
In der Datei /etc/dnsmasq.conf die folgenden Einträge einpflegen:

 domain-needed
 bogus-priv
 filterwin2k
 interface=wlan1
 no-dhcp-interface=eth0
 bind-interfaces
 domain=wlan.beimir
 dhcp-range=192.168.5.1,192.168.5.150,12h
 dhcp-option=option:dns-server,192.168.5.200
 conf-dir=/etc/dnsmasq.d/,*.conf
		
Update vom 29.03.2020 - Ich musste die Einstellung zum Thema Netzwerk Modus von bind-interfaces auf bind-dynamic umstellen.

 bind-dynamic
		

Einrichten des Access Point:
In der Datei /etc/hostapd.conf die folgenden Einträge einpflegen: (Vorher die SSID (Wert: [ssid]) auf zum Beispiel myap setzen und eine Passphrase (Wert: [passphrase]) zur Anmeldung der Clients vergeben.)

 interface=wlan1
 logger_syslog=-1
 logger_syslog_level=2
 logger_stdout=-1
 logger_stdout_level=2
 ctrl_interface=/var/run/hostapd
 ctrl_interface_group=0
 ssid=[ssid]
 country_code=DE
 ieee80211d=1
 hw_mode=g
 channel=1
 beacon_int=100
 dtim_period=2
 max_num_sta=255
 rts_threshold=2347
 fragm_threshold=2346
 macaddr_acl=0
 accept_mac_file=/etc/hostapd.accept
 deny_mac_file=/etc/hostapd.deny
 auth_algs=1
 ignore_broadcast_ssid=0
 wmm_enabled=1
 wmm_ac_bk_cwmin=4
 wmm_ac_bk_cwmax=10
 wmm_ac_bk_aifs=7
 wmm_ac_bk_txop_limit=0
 wmm_ac_bk_acm=0
 wmm_ac_be_aifs=3
 wmm_ac_be_cwmin=4
 wmm_ac_be_cwmax=10
 wmm_ac_be_txop_limit=0
 wmm_ac_be_acm=0
 wmm_ac_vi_aifs=2
 wmm_ac_vi_cwmin=3
 wmm_ac_vi_cwmax=4
 wmm_ac_vi_txop_limit=94
 wmm_ac_vi_acm=0
 wmm_ac_vo_aifs=2
 wmm_ac_vo_cwmin=2
 wmm_ac_vo_cwmax=3
 wmm_ac_vo_txop_limit=47
 wmm_ac_vo_acm=0
 ap_max_inactivity=300
 ieee80211n=1
 ieee80211ac=1
 eapol_key_index_workaround=0
 eap_server=0
 own_ip_addr=127.0.0.1
 wpa=2
 wpa_passphrase=[passphrase]
 wpa_key_mgmt=WPA-PSK
 wpa_pairwise=TKIP CCMP
 rsn_pairwise=CCMP
 wpa_group_rekey=600
 wpa_gmk_rekey=86400
 wpa_ptk_rekey=600
 rsn_preauth=1
 rsn_preauth_interfaces=eth0


Wie teste ich nun die Einstellungen ?

Komponente DNS und DHCP (dnsmasq):
Syntaxprüfung:

 dnsmasq --test -C /etc/dnsmasq.conf
		
Die Syntaxprüfung sollte mit "OK" enden.

DNSMASQ neu starten:

 systemctl restart dnsmasq
		
DNSMASQ-Status anzeigen:

 systemctl status dnsmasq
		
DNSMASQ beim Systemstart starten:

 systemctl enable dnsmasq
		


Komponente Access Point (hostapd):
Access Point im Debug-Modus starten (am Bildschirm erscheinen die Ausgaben und der Prompt kommt nicht zurück):

 hostapd -dd /etc/hostapd.conf
		
Wenn die folgenden zwei Zeilen erscheinen, sollte die Konfiguration korrekt sein:

 wlan1: interface state COUNTRY_UPDATE->ENABLED
 wlan1: AP-ENABLED 
		
Wenn alles korrekt ist, sollte der Daemon normal gestartet werden. Hierfür den vorherigen Aufruf mit STRG-C beenden.

HOSTAPD starten:

 systemctl start hostapd
		
HOSTAPD-Status anzeigen:

 systemctl status hostapd
		
HOSTAPD beim Systemstart starten:

 systemctl enable hostapd
		


Ergebnis:
Jetzt kann man sich mittels Mobiltelefon,Tablet,etc bereits am Access Point anmelden.

Es fehlt noch die Firewall und die Weiterleitungsregel für den Datenverkehr zur eth0 Schnittstelle (siehe Punkt Firewall).

top Firewall einrichten

Ich verwende firewalld. Diese Firewall lässt sich auch gut via Yast verwalten.

Für die Netzwerkschnittstelle eth0 hatte ich als Firewall Zone die "Home Zone" definiert (s.o.). Hier habe ich keine Änderungen in der Firewall vorgenommen. Da diese Schnittstelle dem eigenen Netz zugewandt ist, vertraue ich dieser.

Bei der Schnittstelle wlan1, die in der externen Zone zugewiesen ist, sind nur die Dienste DNS und DHCP freigegeben.

Ich brauche dann noch eine Weiterleitung der Datenpakete von wlan1 zu eth0 und zurück. Hierfür gibt es zwei Varianten. Die Variante 1 ist für den Einsatz mit firewalld gedacht, während die Variante 2 im Zusammenhang mit SuSEFirewall2 bzw. allgemein iptables genutzt werden kann.
Ich habe die für firewalld genommen (Variante 1). Nach dem Absetzen der Variante als User root muss im Firewall-GUI Tool oder mit Kommandozeilenbefehl die Runtime-Konfiguration fest runtergeschrieben werden.
Variante 1 :


(Anmerkung: \ = Zeilenumbruch)

 firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 10 -o eth0 -j MASQUERADE
 firewall-cmd --direct --add-rule ipv4 filter FORWARD 10 -i wlan1 -o eth0 -j ACCEPT
 firewall-cmd --direct --add-rule ipv4 filter FORWARD 10 -i wlan1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
		

 firewall-cmd --direct --add-rule ipv4 \
     nat POSTROUTING 10 -o eth0 -j MASQUERADE
 firewall-cmd --direct --add-rule ipv4 \
     filter FORWARD 10 -i wlan1 -o eth0 -j ACCEPT
 firewall-cmd --direct --add-rule ipv4 \
     filter FORWARD 10 -i wlan1 -o eth0 -m state \
     --state RELATED,ESTABLISHED -j ACCEPT
		

Variante 2 :

(Anmerkung: \ = Zeilenumbruch)
Es muss hier noch der String [Netzwerk des Routers] mit dem Netz des Routers ersetzt werden (Beispiel: 192.168.0.0). Die folgenden Zeilen sollten Teil eines Start-Scripts werden, damit sie immer beim Booten des Rechners gesetzt werden.

 iptables -A FORWARD -o eth0 -i wlan1 -s [Netzwerk des Routers]/24 -m conntrack --ctstate NEW -j ACCEPT
 iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
		
			
 iptables -A FORWARD -o eth0 -i wlan1 -s \
     [Netzwerk des Routers]/24 -m conntrack \
     --ctstate NEW -j ACCEPT
 iptables -A FORWARD -m conntrack --ctstate \
     ESTABLISHED,RELATED -j ACCEPT
 iptables -t nat -A POSTROUTING -o eth0 \
     -j MASQUERADE 
		

top Troubleshooting

Start DNSMASQ

Nach den ersten Tests habe ich in meinem Umfeld das Problem gehabt, dass nach einem normalen Boot oft eine Nutzung des Access Points nicht erfolgreich war.
Nach ein wenig Recherche habe ich nun beim dnsmasq systemd Start-Script eine Anpassung vorgenommen. Mit der Anpassung startet dnsmasq nun nach hostapd. Damit habe ich dann bisher keine Probleme mehr gehabt.
Anpassen:

 cd /usr/lib/systemd/system
 vi dnsmasq.service
  
Hier muss der Eintrag "After=" angepasst werden (vorher network.target)

 After=hostapd.service
  


Verbindungsprobleme 1

Wenn es Verbindungsprobleme mit dem HostAPD gibt, kann das auch daran liegen, dass der wpa_supplicant Dienst läuft
Wird der Dienst nicht benötigt, so empfehle ich das Stoppen, wie gleich angegeben. Ansonsten wird eine Recherche notwendig werden.

WPA Supplicant status:

 systemctl status wpa_supplicant
	
WPA Supplicant stoppen:

 systemctl stop wpa_supplicant
	
WPA Supplicant auch beim System-Start deaktivieren:

 systemctl disable wpa_supplicant
	


Verbindungsprobleme 2

Wie ich schmerzlich erfahren musste, kann auch das falsche Setzen des Parameters ht_capab zu tollen Effekten führen. Bei mir war dadurch der access point sichtbar, ich konnte mich aber nicht verbinden.

Die Ausgabe von systemctl status hostapd bringt in dem Fall u.a. die folgende Ausgabe "Driver does not support configured HT capability". Der dort gemeldeten Modus sollte dann aus der Konfiguration entfernt oder angepasst werden.
Im Zweifel kann dann die ganze Zeile (temporär) in /etc/hostapd.conf auskommentiert und danach hostapd mit systemctl restart hostapd neu gestartet werden.



USB Stick - Suspend /Ruhezustand 1

Unter openSUSE Leap 15.4 kann es passieren, dass USB Geräte in einen Suspend-Modus / Ruhezustand geschickt werden. Um das zu verhindern gibt es zwei Lösungen.

  1. Temporäre Lösung - zum Testen:
    In der Modul Parameterdatei /sys/module/usbcore/parameters/autosuspend steht normalerweise der Wert "2". Das zeigt an, dass USB-Geräte automatisch nach einer gewissen Zeit suspended werden.
    Um das temporär zu unterbinden, kann der folgenden Befehl ausgeführt werden:
    echo -1 > /sys/module/usbcore/parameters/autosuspend
  2. Permanente Lösung:
    Hierfür ist für das Modul eine Konfiguration anzulegen.
    1. Als User root anmelden
    2. Wechsel in das Verzechnis /etc/modprobe.d
    3. Eine Datei mit dem Namen 99-usbcore.conf anlegen
    4. Die Datei 99-usbcore.conf erhält den folgenden Inhalt

      options usbcore autosuspend=-1
    5. Nun den Befehl mkinitrd ausführen, um ein initiales Image für den Linux Kernel für den Systemstart zu erstellen
    6. Abschließend ist ein Reboot durchzuführen
    7. Fertig


USB Stick - Suspend /Ruhezustand 2

Unter openSUSE Leap 15.x kann es passieren, dass USB Geräte in einen Suspend-Modus / Ruhezustand geschickt werden. Das kann abgeschaltet werden, indem der folgende Befehl genutzt wird.

Syntax:
iwconfig <device> power off

Beispiel:
iwconfig wlan0 power off


Der Befehl wirkt nur, bis der Rechner neu gestartet wird.
Für eine Deaktivierung bei jedem Rechnerstart muss ein crontab-Eintrag erzeugt werden.



top WLAN-Stick (Empfehlung)

Ich hatte mich mit einer Alternative der WLAN-Verbindung als Access-Point beschäftigt, die dann einen WLAN-Stick nutzt.
Bei der Recherche tat ich mich schwer einen WLAN-Stick zu finden, der nicht so teuer ist, der aber auch Soft AP beherrscht. Ferner sollte er unter Linux unterstützt werden. Linux in Kombination mit Soft AP ist eine schwierige Kombination.
Schließlich bin ich beim BrosTrend AC650 gelandet.
Der Treiber ist nicht im Linux-Kernel enthalten. Aber vom Hersteller wird ein Installationsscript bereitgestellt, welches sich das OS auf dem Rechner ansieht und dann entsprechend die Installation des Treibers vornimmt.

Der WLAN-Stick Panda Wireless AC600 Dual Band ist auch eine gute Lösung. Bei diesem Stick entfällt das Generieren der Treiber.



top Links zum Thema

Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!