Tips en Trucs 2017

OpenSUSE router

Nieuwe versie

De volledige beschrijving en alle scripts staan op GitHub.

De router configuratie voor de lessen die starten in september heeft een nieuwe versie gekregen. Dit is nodig omdat de netwerkbehoeften van verschillende cursussen en gebruikte software elk jaar evolueren. Deze router is gebaseerd op openSUSE Leap 42.3 waarin heel wat is verandert.

Nieuw is de ondersteuning van IPV6 in het LAN-netwerk. Of de IPV6 ondersteuning volledig geslaagd is, zal pas duidelijk worden in klas tijdens de lessen. De smtp- en imap servers zijn nu ook vanuit het LAN netwerk te gebruiken, waardoor naast webmail ook mail-clients op de computers bruikbaar zijn. Voor de lessen Raspberry Pi staat op de router een mirror van de Raspbian repository. Deze repository wordt gebruikt omdat de commerciële firewall bij ons op school sommige Raspbian mirrors blokkeert, maar enkel als je ze via http benadert. Deze repository wordt via rsync bijgewerkt. Realtec USB WiFi sticks (met rtl8188eu chip zoals de TL-WN725N) kunnen nu ook als WiFi Access Point gebruikt worden.

Inleiding

De basis van de router is een minimale openSUSE Leap 42.3 installatie. Let wel, deze router wordt opgenomen in een reeds afgeschermde beveiligde omgeving. M.a.w. gebruik deze router niet zonder aanpassingen voor rechtstreekse toegang op het internet. Zo gebruik ik voor alle wachtwoorden hetzelfde niet veilige wachtwoord snt+4567. Aangezien deze router gebruikt wordt om een klas met computers te bedienen en eveneens als oefenrouter voor de lessen Thuisnetwerken en Raspberry Pi wordt gebruikt, is een standaard wachtwoord wel gemakkelijk.

De router is enkel getest bij mij thuis en wordt nog deze week in het schoolnetwerk opgenomen. De grote test komt pas bij de start van het schooljaar in september.

De router kan niet zomaar klakkeloos overgenomen worden, zo gebruik ik hier een bepaald type WLAN USB stick. Bij het gebruik van een andere WLAN kaart (USB stick), ga je waarschijnlijk de hostapd configuratie voor het ter beschikking stellen van een WiFi Access Point moeten aanpassen. Je hoeft ook niet alles over te nemen, gebruik wat je nodig hebt. Heb je geen geïntegreerde FTP-server nodig, laat die dan weg. Hoe minder servers draaien, hoe eenvoudiger het onderhoud en beveiliging wordt. Heb je de router functie niet nodig, dan nog kan je onderdelen afzonderlijk gebruiken. Denk aan Windows gedeelde mappen met Samba, enz. Let bij het gebruik van afzonderlijke onderdelen op het initialiseren van bepaalde variabelen (zie Router instellingen).

De configuratie gebeurt bij mij via een SSH-verbinding waardoor ik de hier gepubliceerde opdrachten gewoon via kopiëren en plakken kan uitvoeren.

Zorg dat het openSUSE systeem up to date is.

zypper up
shutdown -r now

Om de router snel te kunnen opnemen in het schoolnetwerk beginnen we met het definiëren van enkele instellingen voor de router. Deze instellingen plaatsen we in variabelen.

# Router Instellingen
wan=eth1
lan=eth0
lanip=192.168.0.1     # SNT: 192.168.2.1
lansubnet=192.168.0.0 # SNT: 192.168.2.0
lanrange='192.168.0.2,192.168.0.200'  # SNT: 192.168.2.100,192.168.2.200
wlan="wlan0"    # Netwerkverbinding WiFi Access Point
gateway=`ip route show | grep 'default' | awk '{print $3}'`
wachtwoord=snt+4567
domein='pindanet.home'     # SNT: snt.local
dnsserver1=$gateway    # SNT: 10.10.0.240
dnsserver2='8.8.8.8'   # Google Public DNS
dnsserver3='208.67.220.220' # OpenDNS

Daarna initialiseren we de LAN netwerkverbindingen. De WAN netwerkverbinding wordt automatisch geïnitialiseerd met behulp van DHCP op het bestaande schoolnetwerk.

  zypper --non-interactive up
  # LAN verbinding initialiseren (de netwerkaart moet actief zijn bij het opstarten van de computer)
  cat <<EOF > /etc/sysconfig/network/ifcfg-$lan
BOOTPROTO='none'
BROADCAST=''                                                                                                                         
ETHTOOL_OPTIONS=''                                                                                                                   
IPADDR=''                                                                                                                            
MTU=''                                                                                                                               
NAME='RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller'
NETMASK=''
NETWORK=''
PREFIXLEN=''
REMOTE_IPADDR=''
STARTMODE='auto'
EOF

  # LAN-Bridge verbinding
  # hostapd initialiseert en koppelt wlan0 aan de bridge
  zypper --non-interactive install bridge-utils
  cat <<EOF > /etc/sysconfig/network/ifcfg-br0
BOOTPROTO='static'
BRIDGE='yes'
BRIDGE_FORWARDDELAY='0'
BRIDGE_PORTS='$lan'
BRIDGE_STP='off'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR='$lanip/24'
MTU=''
NAME=''
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
IPADDR_0='fd86:d61b:4c69:e4e6::1'
PREFIXLEN_0='64'
EOF

Het doorsturen van de netwerkpakketten naar de juiste netwerkkaarten gebeurt via het instellen van routes en de firewall. De Gateway (toegangspoort) tot de rest van de wereld, kan je op een bestaand systeem opvragen met de opdracht route.

  # Routering
  echo "default $gateway - -" > /etc/sysconfig/network/routes

  # Firewall
  sed -i.ori "s|^\(FW_ROUTE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
  sed -i "s|^\(FW_DEV_INT=\).*$|\1\"br0\"|" /etc/sysconfig/SuSEfirewall2
  sed -i "s|^\(FW_MASQUERADE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2

Om de LAN computers te voorzien van IP adressen hebben we een DHCP-server nodig. Daarvoor gebruiken we dsnmasq die naast een DHCP-server ook zorgt voor een DNS-server, proxy en TFTP-server. De DNS-proxy zorgt voor een ontlasten van het netwerk, waardoor bijvoorbeeld het surfen op internet veel vlotter verloopt. Ondertussen geven we de router de netwerknaam router.pindanet.home. De TFTP-server zorgt voor het opstarten van computers via het netwerk, wat vooral handig is bij het installeren van verschillende computers. De TFTP-server bedient enkel nog computers die UEFI ondersteunen, de BIOS code is nog aanwezig maar werd niet getest en/of aangepast. SystemRescueCD start enkel op als je Grub als EFI bootmanager gebruikt en WinPE enkel als je iPXE als EFI bootmanager gebruikt. Ik heb dus naargelang het geval, beiden geïmplementeerd.

  # DNS proxy en DHCP server http://www.linux.com/learn/tutorials/516220-dnsmasq-for-easy-lan-name-services
  zypper --non-interactive install dnsmasq
  mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
  cat <<EOF > /etc/dnsmasq.conf
domain-needed
bogus-priv
domain=$domein
expand-hosts
local=/$domein/
listen-address=127.0.0.1
listen-address=$lanip
bind-interfaces
dhcp-range=lan,$lanrange,4h
dhcp-option=lan,3,0.0.0.0
dhcp-option=lan,6,$lanip
server=$dnsserver1
server=$dnsserver2
server=$dnsserver3
dhcp-option=pxe,66,$lanip
dhcp-match=set:ipxe,175 # iPXE sends a 175 option.
dhcp-boot=tag:ipxe,http://$lanip/menu.ipxe
# Voor BIOS
# dhcp-boot=pxelinux.0
# Voor SystemRescueCD met Grub
dhcp-boot=bootx64.efi
# Voor WinPE met iPXE
# dhcp-boot=ipxe.efi
enable-tftp
tftp-root=/srv/tftpboot
interface=br0
# IPV6
dhcp-fqdn
enable-ra
dhcp-option=option6:dns-server,[::]
#dhcp-option=option6:dns-name,pindanet.home
dhcp-range=::100,::1ff, constructor:br0, ra-names, ra-stateless, 64, 12h
EOF
  
  # Router intern bereikbaar via router.pindanet.home
  echo "$lanip     router.$domein router" >> /etc/hosts

  systemctl enable dnsmasq.service

Om computers via het netwerk te laten opstarten, gebruiken we een TFTP boot server. Via DHCP wordt de computer op de hoogte gebracht dat er vanaf het netwerk gestart kan worden. Daarenboven moeten we zorgen voor een netwerk bootmanager (Grub en iPXE) en besturingssystemen (WinPE voor de installatie van Windows 10 en SystemRescueCD voor de installatie van een backupsysteem).

  # TFTP boot server
  chmod o+rx /srv/tftpboot/
  
  mkdir /srv/www/htdocs/tftpboot
  # De SystemRescueCD systeembestanden moeten wel in /var/backup staan
  cp /var/backup/sysrcd/* /srv/www/htdocs/tftpboot/
  
  # voor BIOS
#   wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
#   tar xfz syslinux-6.03.tar.gz
#   rm syslinux-6.03.tar.gz
#   cp syslinux-6.03/bios/core/pxelinux.0 /srv/tftpboot/
#   cp syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 /srv/tftpboot/
#   cp syslinux-6.03/bios/com32/lib/libcom32.c32 /srv/tftpboot/
#   cp syslinux-6.03/bios/com32/libutil/libutil.c32 /srv/tftpboot/
#   cp syslinux-6.03/bios/com32/menu/vesamenu.c32 /srv/tftpboot/
#   cp syslinux-6.03/bios/memdisk/memdisk /srv/tftpboot/
#   rm -r syslinux-6.03/
# 
#   mkdir /srv/tftpboot/pxelinux.cfg
#   cat <<EOF > /srv/tftpboot/pxelinux.cfg/default
# UI vesamenu.c32
# 
# label winpe
#         menu label ^1) WinPE
#         kernel memdisk
#         append iso raw
#         initrd WinPE_amd64.iso
# LABEL systemrescuecd
#         MENU LABEL ^2) SystemRescueCD
#         KERNEL rescue64
#         APPEND initrd=initram.igz dodhcp netboot=http://router.$domein/tftpboot/sysrcd.dat setkmap=be ar_source=http://router.$domein/tftpboot
# EOF
  
  # Voor EFI met iPXE voor WinPE
  wget -P /srv/tftpboot/ http://boot.ipxe.org/ipxe.efi
  wget http://git.ipxe.org/releases/wimboot/wimboot-latest.zip
  unzip wimboot-latest.zip
  rm wimboot-latest.zip
  cp wimboot-*-signed/wimboot /srv/www/htdocs/
  rm -r wimboot-*-signed/
  
  cat <<EOF > /srv/www/htdocs/menu.ipxe
#!ipxe
kernel wimboot
initrd windows/Boot/BCD         BCD
initrd windows/Boot/boot.sdi    boot.sdi
initrd windows/sources/boot.wim boot.wim
boot
EOF
  
  # Voor EFI met Grub voor SystemRescueCD
  mkdir -p /srv/tftpboot/boot/grub
cat <<EOF > /srv/tftpboot/boot/grub/grub.cfg
set timeout=5
menuentry 'SystemRescueCD' --class os {
     insmod net
     insmod efinet
     insmod tftp
     insmod gzio
     insmod part_gpt
     insmod efi_gop
     insmod efi_uga
     # dhcp, tftp server in my network
     set net_default_server=$lanip
     # auto dhcp setup did not work for me, no idea why
     # net_bootp
     # ok let's assign a static address for now
     net_add_addr eno0 efinet0 192.168.0.201
     echo 'Network status: '
     net_ls_cards
     net_ls_addr
     net_ls_routes
     echo 'Loading SystemRescueCD ...'
     linux (http)/tftpboot/rescue64 dodhcp netboot=nfs://$lanip:/srv/www/htdocs/tftpboot/ setkmap=be
     echo 'Loading initial ramdisk ...'
     initrd (http)/tftpboot/initram.igz
}
EOF

  cd /srv/tftpboot/
  grub2-mkstandalone -d /usr/lib/grub2/x86_64-efi/ -O x86_64-efi --fonts="unicode" -o bootx64.efi boot/grub/grub.cfg
  cd
  
  zypper --non-interactive install nfs-kernel-server
  echo "/srv/www/htdocs/tftpboot/     $lansubnet/24(ro,sync,no_root_squash,no_all_squash,no_subtree_check)" >> /etc/exports
  systemctl enable rpcbind.service
  systemctl start rpcbind.service
  systemctl enable nfsserver.service
  systemctl start nfsserver.service

  # Download bij het opstarten van SystemRescueCD automatisch een script
  echo "wget -P /root/ https://raw.githubusercontent.com/pindanet/router/master/clients/part.sh" > /srv/www/htdocs/tftpboot/autorun

Om draadloze apparaten te kunnen bedienen, hebben we een WiFi Access Point nodig.

  # SoftAP
  zypper --non-interactive install hostapd iw
  cp /etc/hostapd.conf /etc/hostapd.conf.ori
  cat <<EOF > /etc/hostapd.conf
interface=$wlan
driver=nl80211
channel=11
ssid=SoftAP-SNT
hw_mode=g
auth_algs=1
wmm_enabled=1
ieee80211n=1
# ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]
wpa=2
wpa_passphrase=$wachtwoord
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
bridge=br0
EOF

Hoewel de router in normale omstandigheden zonder scherm werkt, schakelen we de schermbeveiliging toch uit.

  # Uitschakelen schermbeveiliging
  echo -ne "\033[9;0]" >> /etc/issue

Met behulp van systemd timers volgen we de werking van enkele diensten op het scherm. Tegelijkertijd kunnen we optreden bij problemen (dnsmasq). Hier wordt voor het opstarten van de WiFi Access Point nagegaan of een WiFi USB stick met rtl8188eu chip wordt gebruikt waarvoor een aangepaste hostapd wordt gestart.

  # Simple monitor 04/2016
  # http://jason.the-graham.com/2013/03/06/how-to-use-systemd-timers/
  cat <<EOF > /root/PindaNetRouter.sh
#!/bin/bash
# scherm wissen
printf "\033c" > /dev/tty1
# if [ \`ls -1 /sys/class/net/ | grep "wlan"\` ]; then
#   hostapd=\`/usr/bin/systemctl is-active hostapd.service\`
#   if [ \$hostapd == "inactive" ] || [ \$hostapd == "failed" ] || [ \$hostapd == "unknown" ]; then # herstart hostapd noodzakelijk
#     wlandev=\`ls -1 /sys/class/net/ | grep "wlan"\`
#     sed -i "s/wlan./\$wlandev/" /etc/hostapd.conf
#     /usr/bin/systemctl restart hostapd.service
#   fi
# else
#   /usr/bin/systemctl stop hostapd.service
# fi
if [ \`ls -1 /sys/class/net/ | grep "wlan"\` ]; then
  /sbin/lsmod | grep "8188eu"
  if [ \$? == 1 ]; then
    hostapd=\`/usr/bin/systemctl is-active hostapd.service\`
    if [ \$hostapd == "inactive" ] || [ \$hostapd == "failed" ] || [ \$hostapd == "unknown" ]; then # herstart hostapd noodzakelijk
      wlandev=\`ls -1 /sys/class/net/ | grep "wlan"\`
      sed -i "s/wlan./\$wlandev/" /etc/hostapd.conf
      /usr/bin/systemctl restart hostapd.service
    fi
  else # voor rtl8188eu aangepaste hostapd versie gebruiken
    hostapd=\`/usr/bin/systemctl is-active hostapd-rtl8188eu.service\`
    if [ \$hostapd == "inactive" ] || [ \$hostapd == "failed" ] || [ \$hostapd == "unknown" ]; then # herstart hostapd noodzakelijk
      wlandev=\`ls -1 /sys/class/net/ | grep "wlan"\`
      sed -i "s/wlan./\$wlandev/" /etc/hostapd-rtl8188eu.conf
      /usr/bin/systemctl restart hostapd-rtl8188eu.service
      /sbin/brctl addif br0 \$wlandev
    fi
  fi
else
  /usr/bin/systemctl stop hostapd.service
  /usr/bin/systemctl stop hostapd-rtl8188eu.service
  /sbin/modprobe -r r8188eu
fi
dnsmasq=\`/usr/bin/systemctl is-active dnsmasq.service\`
if [ \$dnsmasq == "inactive" ] || [ \$dnsmasq == "failed" ]; then # herstart dnsmasq noodzakelijk
  /usr/bin/systemctl restart dnsmasq.service
fi
/usr/bin/systemctl status dnsmasq.service > /dev/tty1
/usr/bin/systemctl status hostapd.service > /dev/tty1
/usr/bin/systemctl status hostapd.service-rtl8188eu > /dev/tty1
# plaats het IP adres op het scherm
IPadres=\`/sbin/ip -f inet -oneline addr show $wan | cut -d " " -f7\`
echo
echo -ne "Welkom op de router\nDeze router is bereikbaar via SSH op \$IPadres
2017 Dany Pinoy voor SNT Brugge\n\nusers login: " > /dev/tty1
EOF
  chmod a+x /root/PindaNetRouter.sh
  
  cat <<EOF > /etc/systemd/system/PindaNetRouter.timer
[Unit]
Description=Router Monitor
[Timer]
OnBootSec=1min
OnUnitActiveSec=1m
Unit=PindaNetRouter.service
[Install]
WantedBy=multi-user.target
EOF

  cat <<EOF > /etc/systemd/system/PindaNetRouter.service
[Unit]
Description=Check router every minute
[Service]
Type=simple
ExecStart=/root/PindaNetRouter.sh
EOF
  
  systemctl enable /etc/systemd/system/PindaNetRouter.timer
  systemctl start PindaNetRouter.timer

  # volgen met journalctl -f -u PindaNetRouter.service
  # systemctl list-timers

Om het SystemRescue systeem via TFTP te kunnen opstarten, hebben we een eenvoudige webserver nodig.

# Webserver
  zypper --non-interactive install apache2 apache2-mod_fcgid
  systemctl enable apache2.service
  systemctl start apache2.service
  yast2 firewall services add zone=EXT service=service:apache2

Om op de klascomputers Windows 10 via de router te kunnen installeren, moeten we de installatiebestanden via een Samba server ter beschikking stellen. Tegelijkertijd delen we een map voor de cursisten (alleen lezen) en dezelfde map voor de leerkracht-beheerder (lezen en schrijven). Zo kan de leerkracht bestanden klaarzetten voor de cursisten. Elk besturingssysteem kan met Samba gedeelde mappen en bestanden bereiken.

# Samba server
  zypper --non-interactive install samba
  echo -e '[SNTcursist]\n\tcomment = Cursist\n\tpath = /usr/home/Documents\n\tread only = yes\n\tpublic = yes\n\thide dot files = no\n' >> /etc/samba/smb.conf
  # schrijftoegang
  echo -e '[SNTbeheerder]\n\tcomment = Leerkracht\n\tpath = /usr/home/Documents\n\thide dot files = no\n\tadmin users = sntbeheerder\n\tforce user = root\n\tforce group = root\n\twritable = yes\n' >> /etc/samba/smb.conf
  (echo $wachtwoord; echo $wachtwoord) | smbpasswd -a sntbeheerder -s
  # execute rechten voor Windows setup
  sed -i -e "/\[global\]/aacl allow execute always = True" /etc/samba/smb.conf

  # Enkel nodig als je via WAN toegang tot smb wilt
  yast2 firewall services add zone=EXT service=service:samba-server

  systemctl start smb.service
  systemctl enable smb.service

Om de router verder te kunnen opbouwen, moet je deze nu herstarten.

  # herstart noodzakelijk
  shutdown -r now

Na deze herstart, moet de router reeds werken via de ethernet verbinding en het WiFi Access Point verbinding. Let op: door de herstart moeten de variabelen met de router instellingen terug geïnitialiseerd worden.

# Variabelen met routerinstellingen heruitvoeren

Voor verschillende diensten (waaronder mail) hebben we gebruikers nodig.

# Gebruikers aanmaken
  for gebruiker in pc01 pc02 pc03 pc04 pc05 pc06 pc07 pc08 pc09 pc10 pc11 pc12 pc13 pc14 pc15 pc16 pc17 pc18 pc19 pc20 pc21 pc22 pc23 pc24 pc25 pc26 pc27 pc28 pc29 pc30; do
  useradd $gebruiker -p $wachtwoord -d /srv/www/htdocs/$gebruiker -s /bin/false;
  passwd $gebruiker <<EOF
$wachtwoord
$wachtwoord
EOF
  mkdir /srv/www/htdocs/$gebruiker
  chown $gebruiker:users /srv/www/htdocs/$gebruiker
  done

Om mails op de router te kunnen ontvangen, hebben we een mail server nodig.

# Mailserver
  zypper --non-interactive remove postfix
  zypper --non-interactive install exim mailx
  sed -i.ori "s/# primary_hostname =/primary_hostname = $domein/" /etc/exim/exim.conf
  sed -i 's/  require verify        = sender/#  require verify        = sender/' /etc/exim/exim.conf
  yast2 firewall services add zone=EXT tcpport=25
  systemctl enable exim.service
  systemctl start exim.service
# Mailboxen initialiseren
  for gebruiker in pc01 pc02 pc03 pc04 pc05 pc06 pc07 pc08 pc09 pc10 pc11 pc12 pc13 pc14 pc15 pc16 pc17 pc18 pc19 pc20 pc21 pc22 pc23 pc24 pc25 pc26 pc27 pc28 pc29 pc30; do
    echo "Veel plezier met uw electronische Mailbox." | mail -s "Welkom" $gebruiker@$domein
  done
  # # Mailserver testen vanaf andere computer
  # echo "Bericht van dany" | mail -S smtp=smtp://router.pindanet.home:25 -s "Testbericht" pc01@pindanet.home
  # # Ontvangen mails opvragen op de router
  # mail -u pc01

Om de ontvangen mails ter beschikking van een mail client te stellen, hebben we een IMAP server nodig.

# IMAP server
  zypper --non-interactive install dovecot
  sed -i.ori "s/#mail_location =/mail_location = mbox:~\/Mail:INBOX=\/var\/spool\/mail\/%u/" /etc/dovecot/conf.d/10-mail.conf
  # Uitschakelen gebruik van ssl certificaten
  sed -i.ori "s/#ssl = yes/ssl = no/" /etc/dovecot/conf.d/10-ssl.conf
  # Inschakelen onsleutelde wachtwoorden
  sed -i.ori "s/#disable_plaintext_auth = yes/disable_plaintext_auth = no/" /etc/dovecot/conf.d/10-auth.conf
  yast2 firewall services add zone=EXT service=service:dovecot
  systemctl enable dovecot.service
  systemctl start dovecot.service
  # # Testen
  # telnet localhost 143
  #   1 login pc01 snt+4567
  #   1 select inbox
  #   1 logout

De door ons gebruikte webinterface om mails te beheren, gebruikt een mysql database.

# MariaDB server
  zypper --non-interactive install mariadb
  systemctl enable mysql.service
  systemctl start mysql.service
  # mysqladmin -u root password "$wachtwoord"
  # Alternatief voor mysql_secure_installation --use-default op http://howtolamp.com/lamp/mysql/5.6/securing/
  
  # ToDO http://www.esecurityplanet.com/open-source-security/securing-mysql-dbms-1.html
  
  /usr/bin/mysql -e "set password for 'root'@'localhost' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'127.0.0.1' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'::1' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'$HOSTNAME' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "update mysql.user set password = password('$wachtwoord') where user = '';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "delete from mysql.db where Db like 'test%';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "drop user ''@'localhost';"
  /usr/bin/mysql --password=$wachtwoord -e "drop user ''@'$HOSTNAME';"

  /usr/bin/mysql --password=$wachtwoord -e "drop database test;"

#  rm $HOME/.mysql_history
#  ln -s /dev/null $HOME/.mysql_history

  sed -i.ori "/# skip-networking/askip-networking" /etc/my.cnf
  service mysql restart

  # /usr/bin/mysql --password=$wachtwoord -e "update mysql.user set user="sqlbeheerder" where user="root";"
  # /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    query="CREATE USER 'pc$gebruiker'@'localhost' IDENTIFIED BY '$wachtwoord';"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="GRANT USAGE ON * . * TO 'pc$gebruiker'@'localhost' IDENTIFIED BY '$wachtwoord' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="CREATE DATABASE IF NOT EXISTS \`database$gebruiker\`;"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="GRANT ALL PRIVILEGES ON \`database$gebruiker\` . * TO 'pc$gebruiker'@'localhost';"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
  done
  
  # ToDo phpMyAdmin geavanceerde functies instellen

Nu kunnen we RoundCube webmail installeren.

# Webmail
  zypper --non-interactive install php7-pear php7-fileinfo php7-intl php7-bcmath php7-bz2 php7-calendar php7-ctype php7-curl php7-dom php7-ftp php7-gd php7-gettext php7-gmp php7-iconv php7-imap php7-ldap php7-mbstring php7-mcrypt php7-mysql php7-odbc php7-openssl php7-pcntl php7-pgsql php7-posix php7-shmop php7-snmp php7-soap php7-sockets php7-sqlite php7-sysvsem php7-tokenizer php7-wddx php7-xmlrpc php7-xsl php7-zlib php7-exif php7-fastcgi php7-pear php7-sysvmsg php7-sysvshm ImageMagick curl apache2-mod_php7
  # activeer php7
  a2enmod php7
  # # Test Webserver met PHP
  # echo "<?php phpinfo(); ?>" > /srv/www/htdocs/info.php
  # rm /srv/www/htdocs/info.php

  wget https://github.com/roundcube/roundcubemail/releases/download/1.3.0/roundcubemail-1.3.0-complete.tar.gz
  tar xfz roundcubemail-1.3.0-complete.tar.gz -C /srv/www/htdocs/
  rm roundcubemail-1.3.0-complete.tar.gz
  mv /srv/www/htdocs/roundcubemail-1.3.0/ /srv/www/htdocs/webmail/
  chown -R wwwrun /srv/www/htdocs/webmail/temp/
  chown -R wwwrun /srv/www/htdocs/webmail/logs/

  # zypper --non-interactive install roundcubemail
  systemctl restart apache2.service
  /usr/bin/mysql --password=$wachtwoord -e "CREATE USER 'roundcube'@'localhost' IDENTIFIED BY '$wachtwoord';"
  /usr/bin/mysql --password=$wachtwoord -e "GRANT USAGE ON * . * TO 'roundcube'@'localhost' IDENTIFIED BY '$wachtwoord' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;"
  /usr/bin/mysql --password=$wachtwoord -e "CREATE DATABASE IF NOT EXISTS \`roundcubemail\`;"
  /usr/bin/mysql --password=$wachtwoord -e "GRANT ALL PRIVILEGES ON \`roundcubemail\` . * TO 'roundcube'@'localhost';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"
  mysql -u root --password=$wachtwoord 'roundcubemail' < /srv/www/htdocs/webmail/SQL/mysql.initial.sql
  cp /srv/www/htdocs/webmail/config/config.inc.php.sample /srv/www/htdocs/webmail/config/config.inc.php
  sed -i.ori "s|^\(\$config\['default_host'\] =\).*$|\1 \'localhost\';|" /srv/www/htdocs/webmail/config/config.inc.php
  sed -i "s|^\(\$config\['db_dsnw'\] =\).*$|\1 \'mysqli://roundcube:${wachtwoord}@localhost/roundcubemail\';|" /srv/www/htdocs/webmail/config/config.inc.php
  sed -i.ori "s|^\(\$config\['mail_domain'\] =\).*$|\1 \'$domein\';|" /srv/www/htdocs/webmail/config/defaults.inc.php
  sed -i.ori "s|^\(\$config\['language'\] =\).*$|\1 \'nl_BE\';|" /srv/www/htdocs/webmail/config/defaults.inc.php
  # Aanmaken standaard postvakken
  sed -i "s|^\(\$config\['create_default_folders'\] =\).*$|\1 true;|" /srv/www/htdocs/webmail/config/defaults.inc.php
  # Geen Authentificatie nodig voor het verzenden van mails 
  sed -i.ori "s|^\(\$config\['smtp_user'\] =\).*$|\1 \'\';|" /srv/www/htdocs/webmail/config/config.inc.php
  sed -i.ori "s|^\(\$config\['smtp_pass'\] =\).*$|\1 \'\';|" /srv/www/htdocs/webmail/config/config.inc.php
  rm -rf /srv/www/htdocs/webmail/installer

Om muziek en films te delen, gebruiken we een DLNA server. Ondertussen plaatsen we twee kleine mediabestanden op de DLNA server. Handig om te testen.

# ReadyMedia
  wget http://downloads.sourceforge.net/project/minidlna/minidlna/1.2.0/minidlna-1.2.0_static.tar.gz
  tar xvzf minidlna-1.2.0_static.tar.gz -C /
  rm minidlna-1.2.0_static.tar.gz
  sed -i.ori "/#network_interface=eth0/anetwork_interface=br0" /etc/minidlna.conf
  sed -i "/#user=jmaggard/auser=root" /etc/minidlna.conf
  sed -i "s/media_dir=\/opt/#media_dir=\/opt/" /etc/minidlna.conf
  sed -i "/#media_dir=\/opt/amedia_dir=A,\/home\/sntbeheerder\/Music" /etc/minidlna.conf
  sed -i "/#media_dir=\/opt/amedia_dir=V,\/home\/sntbeheerder\/Videos" /etc/minidlna.conf
  sed -i "/#friendly_name=My DLNA Server/afriendly_name=Pinda DLNA Server" /etc/minidlna.conf

  mkdir /home/sntbeheerder/Videos
  chown sntbeheerder:users /home/sntbeheerder/Videos
  mkdir /home/sntbeheerder/Music
  chown sntbeheerder:users /home/sntbeheerder/Music
  wget --directory-prefix=/home/sntbeheerder/Music/ https://webdesign.pindanet.be/deel2/Linecraft/muziek/erotic_dream.mp3
  wget --output-document=/home/sntbeheerder/Music/erotic_dream.jpg https://webdesign.pindanet.be/deel2/Linecraft/muziek/speedsound.jpg
  wget --output-document=/home/sntbeheerder/Videos/kajimba.mp4 https://webdesign.pindanet.be/deel2/Linecraft/films/Kajimba.mp4
  wget --directory-prefix=/home/sntbeheerder/Videos/ https://webdesign.pindanet.be/deel2/Linecraft/films/kajimba.jpg

  cat <<EOF > /etc/systemd/system/minidlna.service
[Unit]
Description=MiniDLNA UPnP-A/V and DLNA media server
After=network.target
[Service]
Type=forking
PIDFile=/var/run/minidlna.pid
ExecStart=/usr/sbin/minidlnad -P /var/run/minidlna.pid -f /etc/minidlna.conf
[Install]
WantedBy=multi-user.target
EOF
  systemctl start minidlna.service
  systemctl enable minidlna.service

Een goede oude FTP server om bestanden uit te wisselen mag ook niet ontbreken.

# FTP server
  zypper --non-interactive install vsftpd
  sed -i.ori "s|^\(anonymous_enable=\).*$|\1NO|" /etc/vsftpd.conf
  # sed -i "s|^\(local_enable=\).*$|\1YES|" /etc/vsftpd.conf
  sed -i "s|^\(write_enable=\).*$|\1YES|" /etc/vsftpd.conf
  sed -i "s/#chroot_local_user=YES/chroot_local_user=YES/" /etc/vsftpd.conf
  sed -i "s/#chroot_list_enable=YES/chroot_list_enable=NO/" /etc/vsftpd.conf
  echo 'allow_writeable_chroot=YES' >> /etc/vsftpd.conf
  echo 'user_config_dir=/home' >> /etc/vsftpd.conf
  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    echo "local_root=/srv/www/htdocs/pc$gebruiker" > /home/pc$gebruiker
    echo 'dirlist_enable=YES' >> /home/pc$gebruiker
    echo 'download_enable=YES' >> /home/pc$gebruiker
    echo 'write_enable=YES' >> /home/pc$gebruiker
  done
  systemctl start vsftpd
  systemctl enable vsftpd
  yast2 firewall services add zone=EXT service=service:vsftpd

Om met onze tijd mee te zijn installeren we NextCloud.

# NextCloud
  zypper addrepo http://download.opensuse.org/repositories/server:/php:/applications/openSUSE_Leap_42.3/server:php:applications.repo
  zypper --gpg-auto-import-keys refresh
  zypper --non-interactive install nextcloud php7-fileinfo

  systemctl restart apache2.service
  # Surf naar router.pindanet.home/nextcloud
  curl --request POST "http://router.$domein/nextcloud/index.php" --data-urlencode "install=true" --data-urlencode "adminlogin=root" --data-urlencode "adminpass=$wachtwoord" --data-urlencode "adminpass-clone=$wachtwoord" --data-urlencode "directory=/srv/www/htdocs/nextcloud/data" --data-urlencode "dbtype=sqlite" --data-urlencode "dbuser=" --data-urlencode "dbpass=" --data-urlencode "dbpass-clone=" --data-urlencode "dbname=" --data-urlencode "dbhost=localhost"

  # Laat het gebruik van ENV Variabelen in PHP cli toe
  sed -i.ori "s|^\(variables_order =\).*$|\1 \"EGPCS\"|" /etc/php7/cli/php.ini
  chmod +x /srv/www/htdocs/nextcloud/occ
  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    sudo -u wwwrun sh -c "export OC_PASS=$wachtwoord; /srv/www/htdocs/nextcloud/occ user:add --password-from-env pc$gebruiker"
  done
  sudo -u wwwrun /srv/www/htdocs/nextcloud/occ user:report
  sed -i -e "/installed/a\  'default_language' => 'nl'," /srv/www/htdocs/nextcloud/config/config.php
  sed -i -e "/installed/a\  'force_language' => 'nl'," /srv/www/htdocs/nextcloud/config/config.php
#  sed -i -e "/return array(/a\'nl'=>'Nederlands'," /srv/www/htdocs/nextcloud/settings/languageCodes.php

Om de prestaties van de router in de gaten te houden installeren we de monitor Linux Dash.

# Monitor Linux Dash
  wget https://github.com/afaqurk/linux-dash/archive/master.zip
  unzip master.zip -d /srv/www/htdocs/
  rm master.zip
  # bekijken via http://router.pindanet.home/linux-dash-master/
Linux Dash

Om een commerciële firewallregel te omzeilen, maken we een Raspian spiegel softwarebron (repository mirror). Daarbij worden alle mirrordirector.raspbian.org URL's naar de softwarebron op de router omgeleid.

# Raspbian repository mirror
  mkdir /srv/www/htdocs/raspbian
  mkdir -p /usr/home/Documents/raspbian/raspbian.org
  echo "/usr/home/Documents/raspbian/raspbian.org /srv/www/htdocs/raspbian/ none  defaults,bind         0 0" >> /etc/fstab
  mount -a
  cat <<EOF > /srv/www/htdocs/raspbian/index.html
<!DOCTYPE html>
<html>
<head>
<title>Raspbian repository</title>
</head>
<body>
<h1>Raspbian repository mirror</h1>
<p>Aangeboden door PindaNet.be.</p>
</body>
</html>
EOF
echo "address=/mirrordirector.raspbian.org/$lanip" >> /etc/dnsmasq.conf

Om WiFi USB sticks met een rtl8188eu chip (zoals de TL-WN725N) te kunnen gebruiken, moeten we een aangepaste hostapd en configuratie aanmaken.

# Hostapd versie voor Realtec WiFi USB adapters zoals de TL-WN725N
# https://nikunjlahoti.wordpress.com/2016/09/07/run-your-wifi-dongle-as-access-point-soft-ap-8188eu-on-linux/
# http://www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge.html
  if true; then
    wget https://github.com/jenssegers/RTL8188-hostapd/archive/master.zip
    unzip master.zip
    zypper install gcc make
    cd RTL8188-hostapd-master/hostapd/
    make
    # mv /usr/sbin/hostapd /usr/sbin/hostapd.ori
    cp hostapd /usr/sbin/hostapd-rtl8188eu
    cp /etc/hostapd.conf /etc/hostapd-rtl8188eu.conf
    sed -i "s/nl80211/rtl871xdrv/" /etc/hostapd-rtl8188eu.conf
    cat <<EOF > /etc/systemd/system/hostapd-rtl8188eu.service
[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=network.target
[Service]
ExecStart=/usr/sbin/hostapd-rtl8188eu /etc/hostapd-rtl8188eu.conf 
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
EOF
  fi

De router werk je af door te herstarten, waardoor je deze direct in dienst kunt nemen, of door deze af te sluiten tot het begin van de lessen.

  shutdown -h now

Het tijdelijk beschikbaar maken van de Windows installatiebestanden gebeurt met de volgende opdrachten:

  # Windows 10 installatiebestanden eenmalig ter beschikbaar stellen
  mkdir /srv/www/htdocs/windows
  mount /usr/home/Documents/WinPE_amd64.iso /srv/www/htdocs/windows/ -o loop
  mkdir /usr/home/Documents/windows
  mount /usr/home/Documents/Windows.iso /usr/home/Documents/windows/ -o loop

Een router is nooit klaar, is steeds voor verbetering vatbaar en kan steeds verder uitgebreid worden.

# ToDo
# Horde Groupware
# Prosody IM Jabber/XMPP Server