Tips en Trucs 2019

Raspberry Pi WiFi Soft Access Point

Vandaag uitzonderlijk geen openSUSE tip, maar een Raspberry Pi tip. Alhoewel veel uit het hier gepresenteerde installatie script kan gebruikt worden in scripts in elke Linux distributie.

Wie nog een Raspberry Pi in één of andere lade heeft liggen, kan met onderstaand installatie script deze omtoveren naar een WiFi Access Point. Dit WiFi Access Point verbind uw draadloze apparaten met uw bekabeld netwerk (Bridge) en vormt dus geen afzonderlijk netwerk. Dit heeft als voordeel dat je alle op uw bekabeld aangesloten apparaten (NAS, Printer, Gedeelde mappen, enz.) ook via uw draadloze apparaten kunt gebruiken. Daar elke medaille twee kanten heeft, is het nadeel van een Bridged WiFi Access Point de beveiliging. Wie op uw WiFi netwerk kan, kan ook op uw bekabeld netwerk. Geef dus niet zomaar iedereen toegang tot uw Bridged WiFi Access Point en zorg steeds dat al uw apparaten bijgewerkt (up to date) zijn.

Voorbereiding

Dit installatie script werkt met Raspberry Pi 3 en Zero met WiFi op het moederbord. Daarnaast zorg je voor een SD kaart met het recentste Raspbian Buster Lite besturingssysteem.

Zorg dat je de Raspberry Pi kunt bedienen door een toetsenbord en beeldscherm aan te sluiten of via een SSH verbinding (Headless). Dit laatste kan je bereiken door in de boot partitie een leeg bestand met de naam ssh aan te maken. Let wel op dat je dit bestand geen extensie meegeeft, m.a.w. de bestandsnaam bestaat uit drie letter: ssh.

Sluit de Raspberry Pi met een ethernetkabel aan op het bekabelde netwerk. De WiFi gaan we namelijk als Access Point (zender) gebruiken.

Installatie

Start de Raspberry Pi door de voeding erop aan te sluiten. De Raspberry Pi start op en maakt automatisch verbinding met het bekabelde netwerk.

Download op de Raspberry Pi het installatie script met de opdracht:

wget https://raw.githubusercontent.com/pindanet/Raspberry/master/softap-install.sh

Start op de Raspberry Pi het installatie script met de opdracht:

bash softap-install.sh

Volg de instructies van het installatie script. Voor meer informatie lees je in het onderstaande script de Nederlandstalige commentaarregels (deze beginnen met een #) en zijn lichtgrijs.

Bediening en handleiding

De bediening en handleiding staat op het WiFi Access Point zelf en kan zowel via het bekabeld als draadloos netwerk bereikt worden door te surfen naar:

http://HOSTNAME

Daarbij vervang je HOSTNAME door de tijdens de installatie ingegeven hostname. Zonder de http:// geven sommige browsers de webpagina niet weer, m.a.w. typ de volledige URL in de adresbalk.

Gebruik deze webpagina ook om het WiFi Access Point af te sluiten. De Raspberry Pi beschikt namelijk niet over een Aan/Uit knop.

Bediening en handleiding

Extra mogelijkheden

Het WiFi Access Point kan je ook gebruiken om bestanden en mappen te delen. Plug gewoon een USB stick (FAT of EXFAT) in het WiFi Access Point en deze worden via Samba automatisch gedeeld. Geen paniek, de inhoud van de stick wordt kan enkel gelezen worden. Handig voor het gebruik in klas om oefenbestanden met de cursisten te delen. Je kunt daardoor de USB stick ook zonder problemen terug uitpluggen (zonder veilig te verwijderen of los te koppelen).

Dit is ook wat het werken met de Raspberry Pi en open source zo leuk maakt, je combineert naar hartenlust tot je bereikt wat je wil bereiken. Wil je een USB printer op uw WiFi Access Point aansluiten, installeer en configureer dan CUPS, enz.

Het script met extra commentaar

#!/bin/bash
# For Raspbian Buster Lite
# wget https://raw.githubusercontent.com/pindanet/Raspberry/master/softap-install.sh
# bash softap-install.sh

# ToDo
# Voorlopig is dit project klaar

# Test if executed with Bash
# Dit script werkt enkel correct in de Bash shell, met sh krijg je foutmeldingen, vandaar deze test.
case "$BASH_VERSION" in
  "") echo "usage: bash softap-install.sh"
      exit;;
esac

# Enkele instellingen, deze kan je indien gewenst aanpassen
# Het toetsenbord layout voor Belgische AZERTY toetsenborden
KEYMAP="be"
# De gebruikte taalinstellingen en tekens 
LOCALE="nl_BE.UTF-8"
# De tijdzone waarin je woont
TIMEZONE="Europe/Brussels"
# Het land waarin je woont (belangrijk en noodzakelijk voor WiFi)
COUNTRY="BE"

if [ $USER == "pi" ]; then # Het eerste deel van de installatie
  # Change Keyboard (aanpassen toetsenbord layout)
  sudo raspi-config nonint do_configure_keyboard "$KEYMAP"

  # Change locale (aanpassen gebruikte taalinstellingen en tekens)
  sudo raspi-config nonint do_change_locale "$LOCALE"

  # Change timezone (aanpassen tijdzone)
  sudo raspi-config nonint do_change_timezone "$TIMEZONE"

  # Change WiFi country (aanpassen WiFi land)
  sudo raspi-config nonint do_wifi_country "$COUNTRY"

  # Standaard gebruikt Raspbian de hostname raspberrypi
  # Om conflicten met andere Raspberry Pi's in het netwerk te vermijden moet je dit aanpassen
  # Het aanpassen van standaard ingestelde namen zorgt eveneens voor een veiliger systeem
  # Change hostname
  read -p "Enter the new hostname [snt-guest]: " NEW_HOSTNAME
  NEW_HOSTNAME=${NEW_HOSTNAME:-snt-guest}
  sudo raspi-config nonint do_hostname "$NEW_HOSTNAME"

  # Voor de liefhebbers van SSH
  # Gebruik je geen SSH, schakel deze regel dan uit door er commentaar van te maken:
  # plaats er een # voor.
  # Beveiliging: wat je niet gebruikt moet je ook niet activeren.
  # Wat niet actief is, kan namelijk ook niet misbruikt worden.
  # enable ssh
  sudo raspi-config nonint do_ssh 0

  # Beveiliging: voer deze 3 opdrachtregels regelmatig uit om Raspbian
  # en dus uw WiFi Access Point bij te werken
  # Upgrade
  sudo apt update
  sudo apt dist-upgrade -y
  sudo apt autoremove -y

  # We vervangen de standaard pi gebruiker door een zelf te kiezen gebruiker
  # Dit is veiliger, ook omdat je dan enkel als je het gebruikerswachtwoord kent systeemtaken (sudo) kunt uitvoeren
  # Change user
  read -p "Enter the new user [dany]: " NEW_USER
  NEW_USER=${NEW_USER:-dany}
  sudo adduser --disabled-password --gecos "" "$NEW_USER"
  # Er wordt met de sudo passwd opdracht een nieuw wachtwoord voor de nieuwe gebruiker aangemaakt,
  # zorg dan ook voor een uniek en sterk wachtwoord.
  sudo passwd "$NEW_USER"
  # Geef de nieuwe gebruiker mogelijkheden (bevoegdheden) door deze aan bepaalde groepen toe te voegen
  sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio "$NEW_USER"

  # Tref voorbereidingen om na een herstart de installatie verder te zetten met de nieuwe gebruiker
  # Continue after reboot
  # Verplaats het installatie script naar de Persoonlijke map van de nieuwe gebruiker
  sudo mv softap-install.sh /home/$NEW_USER/
  # Voeg het installatie script toe aan de inlogprocedure van de nieuwe gebruiker
  echo "bash softap-install.sh" | sudo tee -a /home/$NEW_USER/.bashrc

  # Geef instructies weer
  echo "Login as $NEW_USER"
  read -p "Press Return to Restart " key

else # Tweede deel van de installatie (nu met de nieuwe gebruiker)
  # Verwijder het installatie script uit de inlogprocedure van de nieuwe gebruiker
  # Disable Continue after reboot
  sed -i '/^bash softap-install.sh/d' .bashrc

  # Beveiliging: Wat je niet gebruikt, verwijder je, ook de standaard pi gebruiker
  # Remove pi user
  sudo userdel -r pi
  
  # Het WiFi Access Point bestuur je vanaf elk apparaat met een browser via een webpagina.
  # Bijvoorbeeld om deze uit te schakelen, want de Raspberry Pi heeft geen Aan/Uit schakelaar
  # Webserver
  sudo apt install apache2 php libapache2-mod-php -y
  sudo systemctl restart apache2.service

  # Download de webpagina met de handleiding en de knop Afsluiten
  sudo wget -O /var/www/html/index.html https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/index.html
  sudo sed -i.ori "s/snt-guest/$HOSTNAME/g" /var/www/html/index.html
  sudo wget -O /var/www/html/pinda.png https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/pinda.png
  sudo wget -O /var/www/html/koffer.png https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/koffer.png
  sudo wget -O /var/www/html/brugge.svg https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/brugge.svg
  sudo wget -O /var/www/html/fileshare.svg https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/fileshare.svg
  sudo wget -O /var/www/html/guest_wifi.svg https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/guest_wifi.svg
  sudo wget -O /var/www/html/system.php https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/system.php

  # Geef webpagina's (gebruiker www-data) de mogelijkheid om de Raspberry Pi af te sluiten
  echo "www-data ALL = NOPASSWD: /sbin/shutdown -h now" | sudo tee -a /etc/sudoers

  # Zorg voor het automatische alleen lezen koppelen van ingeplugde USB sticks
  # Automount
  echo 'ACTION=="add", KERNEL=="sd*", TAG+="systemd", ENV{SYSTEMD_WANTS}="usbstick-handler@%k"' | sudo tee /etc/udev/rules.d/usbstick.rules
  sudo wget -O /lib/systemd/system/usbstick-handler@.service https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/usbstick-handler
  sudo wget -O /usr/local/bin/automount https://raw.githubusercontent.com/pindanet/Raspberry/master/softap/automount
  sudo chmod +x /usr/local/bin/automount
  sudo apt install exfat-fuse -y

  # Deel de inhoud van automatisch gekoppelde USB sticks
  # Share automounted USB-sticks
  # Installeer Samba
  sudo apt install samba samba-common-bin -y
  # Configureer Samba en deel de USB stick voor iedereen op het netwerk (openbaar)
  echo "[Media]" | sudo tee -a /etc/samba/smb.conf
  echo "  comment = SoftAP-Network-Attached Storage" | sudo tee -a /etc/samba/smb.conf
  echo "  path = /media" | sudo tee -a /etc/samba/smb.conf
  echo "  public = yes" | sudo tee -a /etc/samba/smb.conf
  echo "  force user = $USER" | sudo tee -a /etc/samba/smb.conf
  sudo systemctl restart smbd.service

  # Voor Windows 10 gebruikers en waarschijnlijk ook Windows 8
  # Patch for Windows Web Service Discovery
  wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py
  sudo mv wsdd.py /usr/bin/wsdd
  sudo chmod +x /usr/bin/wsdd
  wget https://raw.githubusercontent.com/christgau/wsdd/master/etc/systemd/wsdd.service
  sudo mv wsdd.service /etc/systemd/system/
  sudo sed -i.ori "s/User=nobody/User=$USER/g" /etc/systemd/system/wsdd.service
  UserGroup=$(id -gn)
  sudo sed -i "s/Group=nobody/Group=$UserGroup/g" /etc/systemd/system/wsdd.service
  sudo systemctl daemon-reload
  sudo systemctl start wsdd.service
  sudo systemctl enable wsdd.service

  # SoftAP
  # Geef tweemaal het WiFi wachtwoord in, de tweede maal om typfouten uit te sluiten
  while true; do
    read -s -p "WiFi Access Point Password: " password
    echo
    read -s -p "WiFi Access Point Password (again): " password2
    echo
    [ "$password" = "$password2" ] && break
    echo "Please try again"
  done
  # Installeer de WiFi Access Point software
  sudo apt install hostapd bridge-utils -y
  sudo systemctl stop hostapd

  # Configureer het netwerk als WiFi Access Point
  echo "denyinterfaces wlan0" | sudo tee -a /etc/dhcpcd.conf
  echo "denyinterfaces eth0" | sudo tee -a /etc/dhcpcd.conf
  sudo brctl addbr br0
  sudo brctl addif br0 eth0
  echo "# Bridge setup" | sudo tee -a /etc/network/interfaces
  echo "auto br0" | sudo tee -a /etc/network/interfaces
  echo "iface br0 inet manual" | sudo tee -a /etc/network/interfaces
  echo "bridge_ports eth0 wlan0" | sudo tee -a /etc/network/interfaces

  # Configureer het WiFi Access Point
  # Mocht je teveel storing hebben door andere WiFi Access Points, pas dan channel aan
  # In Europa kan je kanalen tussen 1 en 13 gebruiken.
  cat > hostapd.conf <<EOF
interface=wlan0
bridge=br0
#driver=nl80211
ssid=$HOSTNAME
country_code=BE
hw_mode=g
channel=7
# Wireless Multimedia Extension/Wi-Fi Multimedia needed for
# IEEE 802.11n (HT)
wmm_enabled=1
# 1 to enable 802.11n
ieee80211n=1
ht_capab=[HT20][SHORT-GI-20][DSSS_CK-HT40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=$password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
  sudo mv hostapd.conf /etc/hostapd/hostapd.conf

  # Zorg dat het WiFi Access Point systeem automatisch start bij het opstarten van de Raspberry Pi
  sudo systemctl disable hostapd
  cat > hostapd.service <<EOF
[Unit]
Description=advanced IEEE 802.11 management
Wants=network-online.target
After=network.target network-online.target

[Service]
ExecStart=/usr/sbin/hostapd  /etc/hostapd/hostapd.conf
PIDFile=/run/hostapd.pid
RestartSec=5
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  sudo mv hostapd.service /etc/systemd/system/
  sudo systemctl daemon-reload
  sudo systemctl enable hostapd.service

fi
# Restart Raspberry Pi
sudo shutdown -r now