Einrichten eines WLAN-Accesspoint auf Raspberry Pi, mit Raspbian Lite und hostapd, über zwei Wlan-Devices
Dieses Tutorial richtet sich an erfahrene Linux-Anwender.
Inhaltsübersicht
|
Prämissen
IP-Range des lokalen regulären Heimnetzwerks: 10.0.1.0/24 IP-Range des WLAN-Accesspoints: 192.168.100.0.0/24 ETH-NIC-Name: eth0 WLAN-NIC-Names: wlanap (AP) und wlanclt (Client)
- Aktive Verbindung via eth0 ist zur Erst-Einrichtung zwingend notwendig - Der Zugriff aus dem AP-Netz ist nur ins Internet erlaubt - Der Zugriff aus dem AP-Netz ins lokale LAN ist ausdrücklich verboten - Alle unbenötigten Dienste werden aus Sicherheitsüberlegungen deaktiviert - Die Netzwerk-Connectivity wird vollständig direkt eingerichtet - IPv6 ist aus Sicherheitsüberlegungen disabled (wg. RA + SLAAC = GUA) | |
Hinweise: Bei allen Schritten nur dann mit dem nächsten Schritt fortfahren, wenn der vorherige keine Fehler verursacht hat!
CLI-Prompt: $ = normaler User # = root
Kommentare! Beachten! Auf lokale Gegebenheiten anzupassender Parameter
ne = Nice Editor strg-s = save file strg-q = quit
|
|
Mein PC zum Durchführen aller Arbeiten
$ lsb_release -a Distributor ID: Debian Description: Debian GNU/Linux 10 (buster) Release: 10 Codename: buster
$ date Sa 22. Jun 22:35:15 CEST 2019
|
$ su -
# cd /media/Install/Images
# wget -c "https://downloads.raspberrypi.org/raspbian_lite_latest" -O raspbian_buster_lite_latest.zip --2019-06-23 11:17:11-- https://downloads.raspberrypi.org/raspbian_lite_latest Wird in »raspbian_buster_lite_latest.zip« gespeichert. raspbian_buster_lite_latest.zip 100%[=============================================>] 406,29M 5,56MB/s in 73s 2019-06-23 11:18:24 (5,55 MB/s) - »raspbian_buster_lite_latest.zip« gespeichert [426031826/426031826]
# unzip raspbian_buster_lite_latest.zip Archive: raspbian_buster_lite_latest.zip inflating: 2019-06-20-raspbian-buster-lite.img | |
# lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID,TYPE NAME FSTYPE SIZE MOUNTPOINT LABEL UUID TYPE sda 238,5G disk └─sda1 ext4 208,6G / debian10 6c5dbab8-40680 part sdb 465,8G disk └─sdb1 ext4 500G /media/sdb1 33daf003-08ac5 part sdc 14,9G disk └─sdc1 vfat 14,9G /media/sdc1 40E4-6EBA part
| Device mit Card-Reader/Writer für SD-Card ermitteln
<<<===== |
# umount /media/sdc1
# ls *lite.img -rw-r--r-- 1 thomas thomas 2,1G 2019-06-20 02:21 2019-06-20-raspbian-buster-lite.img
# dd bs=1M if=2019-06-20-raspbian-buster-lite.img of=/dev/sdc status=progress 2191523840 bytes (2,2 GB, 2,0 GiB) copied, 80 s, 27,4 MB/s 2096+0 Datensätze ein 2096+0 Datensätze aus 2197815296 bytes (2,2 GB, 2,0 GiB) copied, 103,626 s, 21,2 MB/s # sync # df Dateisystem Typ Größe Benutzt Verf. Verw% Eingehängt auf /dev/sdc1 vfat 253M 40M 213M 16% /media/sdc1 /dev/sdc2 ext4 1,8G 995M 669M 60% /media/sdc2 | |
# touch /media/sdc1/ssh # umount /dev/sdc1; umount /dev/sdc2 # exit $ | <<<===== vfat |
| |
// RPi mit neuer Karte booten und IP-Adresse über DSL-Router ermitteln, hier = 10.0.1.56
$ ping 10.0.1.56 -c 3 PING 10.0.1.56 (10.0.1.56) 56(84) bytes of data. 64 bytes from 10.0.1.56: icmp_seq=1 ttl=64 time=0.429 ms 64 bytes from 10.0.1.56: icmp_seq=2 ttl=64 time=0.462 ms 64 bytes from 10.0.1.56: icmp_seq=3 ttl=64 time=0.410 ms | |
$ ssh pi@10.0.1.56 -p 22 | pwd = raspberry |
|
$ lsb_release -a Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster |
|
$ sudo su - # passwd # adduser toml # dpkg-reconfigure tzdata | root shell root-pwd setzen neuer Default-User Zeitzone setzen |
# hostnamectl set-hostname tomspiap # cat /etc/hostname tomspiap | Hostname ist gleich SSID |
# systemctl reboot $ ssh toml@10.0.1.56 -p 22 $ su - | Wichtig!!! |
# deluser pi # apt purge --remove sudo rsyslog avahi-daemon | Sicherheitsrisiken und Müll beseitigen |
| |
# lsusb | Werden beide Devices erkannt (hier 2 x USB-Stick)? |
Bus 001 Device 006: ID 0cf3:9271 Qualcomm Atheros Communications AR9271 802.11n Bus 001 Device 005: ID 114b:0110 Sphairon Access Systems GmbH Turbolink UB801R WLAN Adapter | |
# ip link show | grep -i broadcast 2: enp1s0: <BROADCAST,MULTICAST> mtu 1500 … 3: wlanx00c0ca8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 … 4: wl434489766: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ... | NIC-Names prüfen! Alle Netzwerkinterfaces sind entsprechend dieser Anleitung mit Bindung an die MAC-Adresse (s.u.) umzubenennen. Sofern weitere Interfaces mit Möglichkeiten zu Namenskonflikten installiert sind, sind alle in eindeutiger Reihenfolge ebenfalls eindeutig mit MAC-Bindung zu benennen. Das gilt auch für Devices, die schon von vornherein die korrekte Bezeichnung hatten. Sofern nur 1 NIC den Accesspoint-Mode beherrscht, ist dieses als wlanap zu bestimmen. Prüfung siehe Setup hostapd. |
# ip link show | MAC-Adressen mit ip-Command ermitteln. Bei externen USB-Devices ggf. nacheinander einstecken und dann jeweils mit ip link show eindeutig identifizieren. |
# nano /etc/systemd/network/10-eth0.link [Match] MACAddress=aa:bb:cc:dd:ee:ff
[Link] Name=eth0 | Jedes Netzwerkinterface wird mit seiner Bezeichnung an die MAC-Adresse gebunden. An jede der 3 Link-Dateien als letzte Zeile eine Leerzeile anfügen! |
# nano /etc/systemd/network/11-wlan-client.link [Match] MACAddress=ab:cd:ef:12:34:56 Type=wlan
[Link] Name=wlanclt | Interface für Client-Mode |
# nano /etc/systemd/network/12-wlan-ap.link [Match] MACAddress=xy:zz:aa:bb:99:88 Type=wlan
[Link] Name=wlanap | Interface für Accesspoint-Mode |
# systemctl reboot
| Geänderte Bezeichnungen sind erst nach Reboot aktiv. Externe WLAN-Devices sollten jetzt angeschlossen sein! |
| |
$ ssh toml@10.0.1.56 -p 22 $ su -
# ip link show | grep -i broadcast 2: eth0: <BROADCAST,MULTICAST> mtu 1500 ... 3: wlanclt: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ... 4: wlanap: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ... | Netzwerk einrichten. Unbedingt sorgfältig arbeiten! Fehler können dazu führen, dass das Netzwerk beim Boot nicht startet und Fehler anschließend direkt auf der SD-Card korrigiert werden müssen.
Bezeichnung der Devices kontrollieren. Wenn fehlerhaft, dann gemäß der Anleitung oberhalb mit Bindung an MAC-Adresse korrigieren. |
# nano /etc/systemd/system/raspi-ap-network-eth.service [Unit] Description=thlu:network-eth.service: Start network connectivity After=basic.target Before=network.target shutdown.target Wants=network.target Conflicts=shutdown.target
[Service] Type=oneshot RemainAfterExit=yes
ExecStartPre=/sbin/ip link set dev eth0 up ExecStart=/sbin/dhclient -4 eth0 ExecStop=/sbin/dhclient -r eth0 ExecStopPost=/sbin/ip link set dev eth0 down
[Install] WantedBy=multi-user.target | An diese und jeder folgenden Service-Unit immer als letzte Zeile eine Leerzeile anfügen! |
# cd /etc/systemd/system # systemctl enable raspi-ap-network-eth.service | Neue Netzwerkverbindung aktivieren |
# cd / # find /etc -iname "*networking" -print /etc/rc0.d/K01networking /etc/rc6.d/K01networking /etc/rcS.d/S01networking /etc/default/networking /etc/init.d/networking | Alte Verbindung gefunden = sysv = obsolet => ausplanen |
# update-rc.d networking remove # find /etc -iname "*networking" -print /etc/default/networking /etc/init.d/networking
# systemctl mask networking.service # systemctl status wpa_supplicant.service ● wpa_supplicant.service - WPA supplicant Loaded: loaded (/lib/systemd/system/wpa_supplicant.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-06-24 15:00:35 CEST; 14min ago
# systemctl stop wpa_supplicant.service # systemctl disable wpa_supplicant.service | |
# systemctl status networking.service wpa_supplicant.service # systemctl status raspi-ap-network-eth.service | Aufmerksam kontrollieren! |
| |
# dpkg -l | grep dhcp ii dhcpcd5 1:7.0.8-0.1+rpt1 armhf DHCPv4, IPv6RA and DHCPv6 client with IPv4LL support ii isc-dhcp-client 4.4.1-2 armhf DHCP client for automatically obtaining an IP address ii isc-dhcp-common 4.4.1-2 armhf common manpages relevant to all of the isc-dhcp packages | |
# apt purge --remove dhcpcd5 # apt update; apt full-upgrade # apt autoremove; apt autoclean # dpkg -l wpasupplicant iw ne dpkg-query: no packages found matching wpasupplicant dpkg-query: no packages found matching iw dpkg-query: no packages found matching ne | Müll entsorgen, dann System aktualisieren
Notwendige Pakete bereits vorhanden? (ne = Nice Editor, vor mir bevorzugter Editor) |
# apt install wpasupplicant iw ne | Nur fehlende Pakete installieren! |
# echo -e "\nStorage=persistent\nSystemMaxUse=20M\nRuntimeMaxUse=20M\nForwardToSyslog=no\nMaxLevelConsole=warning\n" >>/etc/systemd/journald.conf # systemctl reboot | |
| |
$ ssh toml@10.0.1.56 -p 22 $ su - # wpa_passphrase Toms_Home_AP TomsStaticNetworkPWD >/etc/wpa_supplicant/Toms_Home_AP.conf # cat /etc/wpa_supplicant/Toms_Home_AP.conf network={ ssid="Toms_Home_AP" #psk="TomsStaticNetworkPWD" psk=a41c16e1b8dceca65d2a63a2a8fe0795cd7b37b0eacb28e2ef2f0c76fa40b035 } | |
# ne /etc/wpa_supplicant/Toms_Home_AP.conf | WLAN-Zugangsdaten zum AP->DSL-Router (SSID) vervollständigen |
ctrl_interface=/var/run/wpa_supplicant ap_scan=1
network={ scan_ssid=1 priority=20 id_str="Guest"
ssid="Toms_Home_AP" #psk="TomsStaticNetworkPWD" psk=a41c16e1b8dceca65d2a63a2a8fe0795cd7b37b0eacb28e2ef2f0c76fa40b035
proto=WPA RSN group=CCMP TKIP pairwise=CCMP TKIP key_mgmt=WPA-PSK } | |
# ne /etc/systemd/system/raspi-ap-network-wlan.service [Unit] Description=thlu:network-wlan.service: Start network connectivity After=basic.target Before=network.target shutdown.target Wants=network.target Conflicts=shutdown.target
[Service] Type=oneshot RemainAfterExit=yes
ExecStartPre=/sbin/ip addr add 192.168.100.1/24 dev wlanap ExecStartPre=/sbin/ip link set dev wlanap up ExecStartPre=/sbin/ip link set dev wlanclt up ExecStartPre=/sbin/wpa_supplicant -B -i wlanclt -c "/etc/wpa_supplicant/Toms_Home_AP.conf" ExecStart =/sbin/dhclient wlanclt
ExecStop =/sbin/ip link set dev wlanap down ExecStopPost=/sbin/ip addr flush dev wlanap ExecStopPost=/sbin/ip link set dev wlanclt down ExecStopPost=/sbin/dhclient -r wlanclt
[Install] WantedBy=multi-user.target | |
# systemctl start raspi-ap-network-wlan.service | |
# systemctl status raspi-ap-network-wlan.service | wlanclt ist mit dem DSL-Router verbunden! |
● raspi-ap-network-wlan.service - thlu:network-wlan.service: Start network connectivity Loaded: loaded (/etc/systemd/system/raspi-ap-network-wlan.service; disabled; vendor preset: enabled) Active: active (exited) since Mon 2019-06-24 15:28:51 CEST; 1min 16s ago Process: 435 ExecStartPre=/sbin/ip addr add 192.168.100.1/24 dev wlanap (code=exited, status=0/SUCCESS) Process: 436 ExecStartPre=/sbin/ip link set dev wlanap up (code=exited, status=0/SUCCESS) Process: 437 ExecStartPre=/sbin/ip link set dev wlanclt up (code=exited, status=0/SUCCESS) Process: 438 ExecStartPre=/sbin/wpa_supplicant -B -i wlanclt -c /etc/wpa_supplicant/Toms_Home_AP.conf (code=exited, status=0/SUCCESS) Process: 440 ExecStart=/sbin/dhclient wlanclt (code=exited, status=0/SUCCESS) Main PID: 440 (code=exited, status=0/SUCCESS) Tasks: 2 (limit: 2200) Memory: 5.0M CGroup: /system.slice/raspi-ap-network-wlan.service ├─439 /sbin/wpa_supplicant -B -i wlanclt -c /etc/wpa_supplicant/Toms_Home_AP.conf └─441 /sbin/dhclient wlanclt
Jun 24 15:28:44 raspberrypi wpa_supplicant[438]: Successfully initialized wpa_supplicant Jun 24 15:28:50 raspberrypi dhclient[441]: DHCPDISCOVER on wlanclt to 255.255.255.255 port 67 interval 8 Jun 24 15:28:50 raspberrypi dhclient[441]: DHCPOFFER of 10.0.1.64 from 10.0.1.1 Jun 24 15:28:50 raspberrypi dhclient[441]: DHCPREQUEST for 10.0.1.64 on wlanclt to 255.255.255.255 port 67 Jun 24 15:28:50 raspberrypi dhclient[441]: DHCPACK of 10.0.1.64 from 10.0.1.1 Jun 24 15:28:51 raspberrypi dhclient[441]: bound to 10.0.1.64 -- renewal in 427260 seconds. Jun 24 15:28:51 raspberrypi systemd[1]: Started thlu:network-wlan.service: Start network connectivity. # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff inet 10.0.1.56/24 brd 10.0.1.255 scope global dynamic eth0 valid_lft 863596sec preferred_lft 863596sec 3: wlanclt: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether ab:cd:ef:12:34:56 brd ff:ff:ff:ff:ff:ff inet 10.0.1.64/24 brd 10.0.1.255 scope global dynamic wlanclt valid_lft 863653sec preferred_lft 863653sec 4: wlanap: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether xy:zz:aa:bb:99:88 brd ff:ff:ff:ff:ff:ff inet 192.168.100.1/24 scope global wlanap valid_lft forever preferred_lft forever
| |
# systemctl enable raspi-ap-network-wlan.service # systemctl disable raspi-ap-network-eth.service | Konfliktsituation (2 Devices im gleichen Subnet) bereinigen! |
# systemctl status raspi-ap-network-wlan.service raspi-ap-network-eth.service | grep Loaded: Loaded: loaded (/etc/systemd/system/raspi-ap-network-wlan.service; enabled; vendor preset: enabled) Loaded: loaded (/etc/systemd/system/raspi-ap-network-eth.service; disabled; vendor preset: enabled) # systemctl reboot |
|
Ein wichtiger Hinweis zum Schluss! Der Raspberry Pi ist jetzt auf 2 Wegen erreichbar (bezogen auf die hier im Tutorial verwendeten IP-Adressen): - einmal mit der IP 10.0.1.64 über das NIC wlanclt aus dem lokalen regulären Heimnetzwerk 10.0.1/24 - einmal mit der IP 192.168.100.1 über das NIC wlanap via SSID aus aus dem Accesspoint-Netzwerk 192.168.100/24 Das bedeutet aber auch, dass der Pi auf beiden Wegen über SSH auf dem Standardport 22 erreichbar ist, wobei der Service selber nach dem Default-Setup des Images nur mit dem Password des Users geschützt ist. Im Ergebnis resultiert daraus ein massives Sicherheitsrisiko. | |
Hier gibt es zwei Lösungen, die nicht entweder-oder anzuwenden sind, sondern es sind beide durchzuführen. Als erstes wird der SSH-Password-Login deaktiviert, die Authentifizierung erfolgt ausschließlich über passwortgeschützte Private-/Pub-Key-Files. Als nächstes ist der Paketfilter anzupassen, der einen SSH-Login nur LAN-Intern über das NIC wlanclt erlaubt. Optional kann auch der SSH-Port 22 auf einen exotischen Port >50.000 gesetzt werden. Für Weitergehende Erklärungen siehe dazu auch den Artikel Security. Und ja, man kann diese Hinweise natürlich auch ignorieren und sich selbstherrlich über berechtigte Warnungen hinwegsetzen. Nun ja, da kann man nichts machen... Sicherheit existiert jedenfalls nur solange, wie der ‚Admin‘ nicht selber auf Sicherheit verzichtet oder schlimmstenfalls sogar fahrlässig eine vorhandene Sicherheit außer Kraft setzt. Mach Dir einfach bewusst, wenn Du auf eine absolute und exklusive Kontrolle Deines Netzwerk verzichtest, hast Du auch keine Kontrolle darüber, wer die Hardware Deines Netzwerks unerlaubt mitbenutzt und darüber Zugang zu privaten Daten und Ressourcen im Netzwerk hat. Wenn Deine Netzwerkzugänge einmal kompromittiert sind, hast Du auch kaum eine Möglichkeit das im Nachgang noch festzustellen. Irgendwelche Antiviren-Programme können da jedenfalls keinen Schutz herstellen, weil sie solche ausgenutzten Exploits gar nicht feststellen können. |
|
Haftungsausschluss: Ich erhebe keinen Anspruch darauf, dass diese Dokumentation vollständig fehlerfrei ist und ich behaupte das auch nicht. Sowohl - durch meine Fehler hier im Tutorial - wie auch durch vorhandene Fehler in den hier verwendeten Linux-Programmen - sowie durch ggf. zeitgleich auftretende äußere mechanische Einflüsse - oder durch den Anwender selber verursacht durch Änderungen an Programmen - oder durch unsachgemäße oder fehlerhafte Einrichtung der Programme beim Setup, z.B. wegen fehlerhafter Parameter kann es zu Datenverlust kommen. Durch unsachgemäße Sicherung und dem Betrieb eines deswegen unsicheren von außen erreichbaren WLAN-Zugangs kann sogar das ganze private Netzwerk kompromittiert werden. Deshalb schließe ich jede Haftung für Schäden an Software oder Hardware oder Vermögensschäden oder für Datenverlust aus, die durch die Benutzung dieses Tutorials enstehen. Die Benutzung dieses Tutorials, die Einrichtung eines Access-Points danach und dessen Betrieb erfolgt auf eigenes Risiko. |
|