< Startseite >

 

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

> Raspian-Lite installieren

> Basic-Setup Rpi

> Setup hostapd

 

 

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

 

 

Raspian-Lite installieren

 

$ 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

 

 

 

Basic-Setup RPi

 

$ 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

 

 

 

Setup hostapd (hier: mit ext. USB-WLAN-Stick TP Link TL-WN722N)

 

$ ssh toml@10.0.1.64 -p 22  

$ su -

# ip a

# iw dev wlanclt info

Interface wlanclt

ifindex 3

wdev 0x100000001

addr ab:cd:ef:12:34:56

ssid Toms_Home_AP

type managed

wiphy 1  

channel 6 (2437 MHz), width: 20 MHz (no HT), center1: 2437 MHz

txpower 20.00 dBm

 

# iw dev wlanap info

Interface wlanap

ifindex 4

wdev 0x1

addr xy:zz:aa:bb:99:88

type managed

wiphy 0  

txpower 20.00 dBm

 

 

Achtung, neue IP-Adresse, jetzt Wlan und nicht mehr Kabelgebunden (eth)! Ggf. über DSL-Router ermitteln, hier = 10.0.1.64

eth0 ist korrekt down und unverbunden

 

wlanclt ist korrekt mit dem DSL-Router und dem Home-Netz verbunden

 

phy1 (wlanclt) im Client-Mode und verbunden

 

phy0 (wlanap) als Accesspoint ...

# iw  phy phy0 info | egrep "Supported interface modes" -A 10

Wiphy phy0

Supported interface modes:

* IBSS

* managed

* AP  

* AP/VLAN

* monitor

* mesh point

* P2P-client

* P2P-GO

* outside context of a BSS

... aber kann er das auch?

 

 

 

 

 

Ja, er kann.  

 

# ip a s wlanap

3: 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

# dpkg -l dnsmasq dnsutils hostapd nftables

dpkg-query: no packages found matching dnsmasq

dpkg-query: no packages found matching dnsutils

dpkg-query: no packages found matching hostapd

dpkg-query: no packages found matching nftables

Welche Pakete sind schon vorhanden?

# apt install dnsmasq dnsutils hostapd nftables

Nur fehlende installieren!

# echo "net.ipv4.ip_forward = 1"            >/etc/sysctl.d/enable_ipv4_forwarding.conf

# echo "net.ipv6.conf.all.disable_ipv6=1"   >/etc/sysctl.d/disable-ipv6.conf

# sysctl --system

 

# systemctl status hostapd dnsmasq | egrep "loaded|active" -i

Loaded: masked (Reason: Unit hostapd.service is masked.)

Active: failed (Result: exit-code) since Mon 2019-06-24 17:55:37 CEST; 4min 37s ago

Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)

Active: active (running) since Mon 2019-06-24 17:55:29 CEST; 3min 1s ago

 

# systemctl stop dnsmasq; systemctl disable dnsmasq

 

# systemctl status dnsmasq | egrep "loaded|active" -i

Loaded: loaded (/lib/systemd/system/dnsmasq.service; disabled; vendor preset: enabled)

Active: inactive (dead)

# find /etc -iname "*hostapd" -print

# update-rc.d hostapd remove  

# find /etc -iname "*hostapd" -print

 

# find /etc -iname "*dnsmasq" -print

# update-rc.d dnsmasq remove

# find /etc -iname "*dnsmasq" -print

 

# systemctl reboot

sysv = obsolet = ausplanen

 

beide Services aus runlevels entfernen

# systemctl status hostapd dnsmasq networking

● hostapd.service

Loaded: masked (Reason: Unit hostapd.service is masked.)

Active: inactive (dead)

● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server

Loaded: loaded (/lib/systemd/system/dnsmasq.service; disabled; vendor preset: enabled)

Active: inactive (dead)

● networking.service

Loaded: masked (Reason: Unit networking.service is masked.)

Active: inactive (dead)

 

# mv /etc/default/hostapd /etc/default/hostapd.org

# echo 'DAEMON_CONF="/etc/hostapd/hostapd.conf"' >/etc/default/hostapd

# ne /etc/hostapd/hostapd.conf

interface=wlanap

driver=nl80211

country_code=DE

 

ssid=Toms_Pi_AP

channel=1

#channel=auto

 

ignore_broadcast_ssid=0

ieee80211d=1

hw_mode=g

beacon_int=100

dtim_period=2

macaddr_acl=0

max_num_sta=10

rts_threshold=2347

fragm_threshold=2346

ctrl_interface=/var/run/hostapd

ctrl_interface_group=0

 

logger_syslog=-1

logger_syslog_level=2

logger_stdout=-1

logger_stdout_level=2

 

# TP-Link USB-Wlan-Stick

auth_algs=3

wpa=2

wpa_passphrase=TomsRasPiAP

rsn_preauth=1

rsn_preauth_interfaces=wlanap

wpa_key_mgmt=WPA-PSK

rsn_pairwise=CCMP

wpa_group_rekey=600

wpa_ptk_rekey=600

wpa_gmk_rekey=86400

 

An jede der folgenden Conf-Dateien als letzte Zeile eine Leerzeile anfügen!

# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org

# ne /etc/dnsmasq.conf

interface=wlanap

dhcp-range=192.168.100.20,192.168.100.25,255.255.255.0,48h

listen-address=127.0.0.1

listen-address=192.168.100.1

 

# ne /usr/local/bin/netfilter

#!/bin/bash

 

[ "$1" == "flush" ] && nft flush ruleset && exit 0

[ "$1" == "list" ] && nft list ruleset && exit 0

 

modprobe nf_conntrack

sysctl -w net.netfilter.nf_conntrack_helper=1

 

nft add table ip filter

nft add chain ip filter input "{ type filter hook input priority 0; policy accept; counter; }"

nft add chain ip filter output "{ type filter hook output priority 0; policy accept; counter; }"

nft add chain ip filter forward "{ type filter hook forward priority 0; policy accept; counter; }"

nft add chain ip filter postrouting "{type nat hook postrouting priority 100; policy accept; }"

 

nft add rule ip filter input   iifname "wlanap" ip saddr 192.168.100.0/24 ip daddr == 10.0.1.0/24 drop     # deny lan

nft add rule ip filter forward iifname "wlanap" ip saddr 192.168.100.0/24 ip daddr == 10.0.1.0/24 drop     # deny lan

#ft add rule ip filter forward iifname "wlanap" ip saddr 192.168.100.0/24 ip daddr != 10.0.1.0/24 drop     # deny internet

 

nft add rule ip filter postrouting ip saddr 192.168.100.0/24 ip daddr 224.0.0.0/24 return

nft add rule ip filter postrouting ip saddr 192.168.100.0/24 ip daddr 255.255.255.255 return

nft add rule ip filter postrouting ip saddr 192.168.100.0/24 ip daddr != 192.168.100.0/24 masquerade

 

exit 0

 

# chown root:root /usr/local/bin/netfilter; chmod 755 /usr/local/bin/netfilter

 

# ne /etc/systemd/system/raspi-ap-netfilter.service

[Unit]

Description=thlu:netfilter.service:   Setup local Netfilter

DefaultDependencies=no

After=network.target raspi-ap-network.service

 

[Service]

Type=simple

RemainAfterExit=yes

ExecStart=/usr/local/bin/netfilter

ExecStop=/usr/local/bin/netfilter flush

 

[Install]

WantedBy=multi-user.target

 

# ne /etc/systemd/system/raspi-ap-hostapd.service

[Unit]

Description=thlu:hostapd.service:   Setup Access-Point via hostapd

Requires=network.target

After=network.target raspi-ap-dnsmasq.service

Conflicts=shutdown.target

 

[Service]

Type=forking

Restart=no

TimeoutSec=5min

KillMode=process

RemainAfterExit=yes

PIDFile=/run/hostapd.pid

ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

 

[Install]

WantedBy=multi-user.target

 

# ne /etc/systemd/system/raspi-ap-dnsmasq.service

[Unit]

Description=thlu:dnsmasq.service:   Setup DHCP and caching DNS server

After=raspi-ap-netfilter.service

 

[Service]

Type=forking

ExecStartPre=/usr/sbin/dnsmasq --test

ExecStart=/usr/sbin/dnsmasq --pid-file --conf-file=/etc/dnsmasq.conf

ExecReload=/bin/kill -HUP $MAINPID

 

[Install]

WantedBy=multi-user.target

 

# chown root:root /etc/systemd/system/raspi-ap*.service

# chmod 644 /etc/systemd/system/raspi-ap*.service

 

Funktionstest und Inbetriebnahme:

 

# cd /etc/systemd/system

 

# systemctl start raspi-ap-dnsmasq.service raspi-ap-hostapd.service raspi-ap-netfilter.service

# systemctl status raspi-ap*

# nft -nn list ruleset

 

Irgendwelche weiteren Client-Geräte können sich jetzt nach dem manuellen Start der Services testweise an den AP anmelden und haben Internet-Zugang?

Wenn ja:

 

# systemctl enable raspi-ap-dnsmasq.service raspi-ap-hostapd.service raspi-ap-netfilter.service

# systemctl reboot

ssh toml@10.0.1.64 -p 22

su -

Erneuter Login über das reguläre LAN!

# systemctl status raspi-ap*

oder:

# systemctl status raspi-ap* | egrep "loaded|active" -i

Loaded: loaded (/etc/systemd/system/raspi-ap-dnsmasq.service; enabled; vendor preset: enabled)

Active: active (running) since Mon 2019-06-24 18:25:24 CEST; 3min 3s ago

Loaded: loaded (/etc/systemd/system/raspi-ap-hostapd.service; enabled; vendor preset: enabled)

Active: active (running) since Mon 2019-06-24 18:25:25 CEST; 3min 1s ago

Loaded: loaded (/etc/systemd/system/raspi-ap-netfilter.service; enabled; vendor preset: enabled)

Active: active (exited) since Mon 2019-06-24 18:25:23 CEST; 3min 3s ago

Loaded: loaded (/etc/systemd/system/raspi-ap-network-wlan.service; enabled; vendor preset: enabled)

Active: active (exited) since Mon 2019-06-24 18:25:23 CEST; 3min 3s ago

Loaded: loaded (/etc/systemd/system/raspi-ap-network-eth.service; disabled; vendor preset: enabled)

Active: inactive (dead)

# exit

$ exit

Logout! Der Raspi-Accesspoint ist eingerichtet. Client-Geräte können sich jetzt an die nun aktive SSID anmelden.

 

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.

 

 

< Startseite >