Im Folgenden wird ein frisch installierter Raspberry Pi 3B+ verwendet.
Das Raspberry Pi OS hat den Stand vom 19.11.2024 (Debian 12, Kernel 6.6, 64bit).
Am Ende werden wir folgende Konfiguration haben:
192.168.123.0/24
fd00:192:168:123::/64
1.1.1.1
und 8.8.8.8
RasPi-AP
tragen mit dem Kennwort raspiwlan
Um die Skripte nachher so haltbar, wie möglich zu machen und die Flexibilität zu erhalten, wie später eine Verbindung ins Internet ermöglicht wird, müssen ein paar Vorbereitungen getroffen werden.
Zu Beginn möchten wir sicher stellen, dass das System auf dem aktuellsten Stand ist.
sudo apt-get update
sudo apt-get -y upgrade
... und installieren zudem unsere Pakete, die wir noch benötigen:
sudo apt-get -y install dnsmasq iptables
raspi-config
Wir möchten nachher vorhersagbare Namen für unsere Schnittstellen haben und WLAN aktiv, daher ändern wir diese Eigenschaften.
sudo raspi-config
Für die Aktivierung von WLAN gehen wir unter 1 System Options > S1 Wireless LAN > Wählen das Land aus (bei mir DE) > SSID überspringen wir mittels Cancel.
Für die Namen gehen wir unter 6 Advanced Options > A2 Network Interface Names > Ja (yes we want predictable network interface names).
Anschließend starten wir das System einmal neu (wie gut, dass uns die raspi-config am Ende schon fragt )
Wir verschaffen uns einen kurzen Überblick über unsere vorhandenen Schnittstellen und erzeugen im Anschluss eine Brücke, zu der wir die physikalischen Schnittstellen hinzufügen.
ip addr show
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
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enxb827eb06xxxx: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:06:xx:xx brd ff:ff:ff:ff:ff:ff
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:53:xx:xx brd ff:ff:ff:ff:ff:ff
Für uns interessant sind die Schnittstellen enxb827eb06xxxx
und wlan0
.
Nun können wir also beginnen, indem wir die Brücke selbst anlegen:
sudo nmcli connection add type bridge con-name 'NAT-Bridge' ifname br0
bridge
NAT-Bridge
br0
OK, die Brücke an sich existiert nun, fügen wir nun die LAN Schnittstelle hinzu:
sudo nmcli connection add type ethernet slave-type bridge con-name 'NAT-LAN' ifname enxb827eb06xxxx master br0
ethernet
(die physikalische Schnittstelle)bridge
NAT-LAN
enxb827eb06xxxx
br0
OK, dann ist jetzt wohl noch das WLAN dran, doch hier wird es ein bisschen tricky...
Wir müssen direkt noch die Infos mitgeben, dass es sich um einen Access Point handelt und dafür will das Tool auch gleich noch wissen, wie das WLAN heißt.
sudo nmcli connection add type wifi slave-type bridge con-name 'NAT-WIFI' ifname wlan0 master br0 wifi.mode ap wifi.ssid 'RasPi-AP'
wifi
(die physikalische Schnittstelle)bridge
NAT-WIFI
wlan0
br0
ap
(Access Point)RasPi-AP
Da wir nicht möchten, dass jede:r in das Funknetz hineinkommt, wird es noch gesichert.
sudo nmcli connection modify 'NAT-WIFI' wifi-sec.key-mgmt wpa-psk
sudo nmcli connection modify 'NAT-WIFI' wifi-sec.proto rsn
sudo nmcli connection modify 'NAT-WIFI' wifi-sec.pairwise ccmp
sudo nmcli connection modify 'NAT-WIFI' wifi-sec.psk 'raspiwlan'
Um den Namen des Funknetzes anzupassen müssen wir den Access Point offline nehmen und anschließend können wir den Namen ändern.
sudo nmcli connection down 'NAT-WIFI'
sudo nmcli connection modify 'NAT-WIFI' wifi.ssid '<name-des-netzes>'
sudo nmcli connection up 'NAT-WIFI'
Um den Namen des Funknetzes anzupassen müssen wir den Access Point offline nehmen und anschließend können wir den Namen ändern.
sudo nmcli connection down 'NAT-WIFI'
sudo nmcli connection modify 'NAT-WIFI' wifi-sec.psk '<neues-kennwort>'
sudo nmcli connection up 'NAT-WIFI'
Nachdem die Brücke soweit konfiguriert ist, wird es Zeit die IP Einstellungen vorzunehmen.
sudo nmcli connection down 'NAT-WIFI'
sudo nmcli connection down 'NAT-LAN'
sudo nmcli connection down 'NAT-Bridge'
sudo nmcli connection modify 'NAT-Bridge' ipv4.addresses 192.168.123.1/24
sudo nmcli connection modify 'NAT-Bridge' ipv4.method manual
sudo nmcli connection modify 'NAT-Bridge' ipv6.addresses fd00:192:168:123::1/64
sudo nmcli connection modify 'NAT-Bridge' ipv6.method manual
sudo nmcli connection up 'NAT-Bridge'
sudo nmcli connection up 'NAT-LAN'
sudo nmcli connection up 'NAT-WIFI'
Nachdem die Schnittstellen jetzt soweit durch sind und auch eine IP Adresse haben, fehlt uns noch das DHCP, damit die Clients nachher auch eine eigene IP Adresse erhalten können.
Hierfür bearbeiten wir die Datei /etc/dnsmasq.conf
und sorgen dafür, dass Konfigurationsdateien aus dem Unterverzeichnis /etc/dnsmasq.d/
gelesen werden:
conf-dir=/etc/dnsmasq.d
Anschließend erstellen wir eine neue Datei, die wir so nennen, wie die Schnittstelle, die bedient wird /etc/dnsmasq.d/br0.conf
. In dieser Datei konfigurieren wir nun unser DHCP:
interface=br0
dhcp-range=192.168.123.20,192.168.123.200,255.255.255.0,24h
dhcp-range=fd00:192:168:123::,ra-names,ra-stateless,64,24h
dhcp-option=option:dns-server,1.1.1.1
dhcp-option=option:dns-server,8.8.8.8
enable-ra
Zur Sicherheit aktivieren wir DNSmasq noch einmal als System-Service.
sudo systemctl enable dnsmasq
Die vergebenen IP Adressen können unter /var/lib/misc/dnsmasq.leases
eingesehen werden .
Erst einmal muss dem System generell mitgeteilt werden, dass die Paketweiterleitung erwünscht ist.
Hierzu wir die Datei /etc/sysctl.conf
angepasst:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
Danach fügen wir die Regeln hinzu, um die Weiterleitung zu erlauben:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables -A FORWARD -d 10.0.0.0/8 -j DROP
sudo iptables -A FORWARD -d 172.16.0.0/12 -j DROP
sudo iptables -A FORWARD -d 192.168.0.0/16 -j DROP
sudo iptables -A FORWARD -j ACCEPT
sudo ip6tables -t nat -A POSTROUTING -j MASQUERADE
sudo ip6tables -A FORWARD -d fe80::/10 -j DROP
sudo ip6tables -A FORWARD -d fc00::/7 -j DROP
sudo ip6tables -A FORWARD -d ff00::/8 -j DROP
sudo ip6tables -A FORWARD -j ACCEPT
Um die Regeln persistent zu machen, legen wir sie im Verzeichnis /etc/iptables
ab, das noch erstellt werden muss.
sudo mkdir /etc/iptables
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6
Anschließend lassen wir die Regeln über den System-Cron (/etc/crontab
) beim Hochfahren des Systems automatisch laden:
@reboot root iptables-restore < /etc/iptables/rules.v4
@reboot root ip6tables-restore < /etc/iptables/rules.v6