Tips en Trucs 2014

OpenSUSE router (deel 2)

Nieuwe versie

De versie (augustus 2015) op basis van openSUSE 13.2 kan je samenstellen met de beschrijving in deze tip.

Aanpassingen op 12 januari 2015

Tijdens het gebruik bleek netwerkverkeer tussen de twee interne netwerken (bekabeld en draadloos) niet mogelijk. M.a.w. een via WiFi aangesloten apparaat kon geen verbinding maken met een dienst op een computer die aangesloten is op het bekabelde LAN netwerk en omgekeerd. Hoewel niet iedereen deze functionaliteit nodig heeft, heb ik de routerconfiguratie aangepast om dit netwerkverkeer toe te laten. Zo kan in de lessen Thuisnetwerken draadloze verbonden toestellen zoals smartphones en tablets de webcam gedeeld worden met de computers op het bekabelde netwerk.

De twee plaatsen waar opdrachten aangepast werden, worden voorafgegaan door commentaar die eindigt op (12/01/2015).

Inleiding

Aangezien dit een een vervolg is op de tip OpenSUSE router, lees je deze beter eerst. Deze tip gaat namelijk verder op de daar beschreven bouw van een router. We zijn ondertussen drie maand verder en de router heeft bijna zijn uiteindelijke productiestadium bereikt. M.a.w. er zijn een aantal zaken vereenvoudigd en dus verbeterd (DHCP) en er is een boel extra functionaliteit toegevoegd. 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 wordt gebruikt, is een standaard wachtwoord wel gemakkelijk.

De router is getest bij het opmaken van de cursus Thuisnetwerken bij mij thuis, wordt in de aanloop van het schooljaar in het schoolnetwerk opgenomen en wordt uiteindelijk in september echt op de proef gesteld door het gebruik van de cursisten in klas.

De router kan niet zomaar klakkeloos overgenomen worden, zo gebruik ik hier een bepaald type USB WLAN stick. Bij het gebruik van een andere stick, ga je waarschijnlijk zowel de USB WLAN stick configuratie als 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.

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=enp2s0
lan=enp10s9
lanip=192.168.0.1
lansubnet=192.168.0.0
lanrange='192.168.0.100,192.168.0.200'
wlans="wlp0s29f7u"    # Netwerkverbinding naar het LAN (WiFi met WLAN USB stick), laatste cijfer ontbreekt om alle USB poorten te kunnen gebruiken
wlanip=192.168.2.1
wlansubnet=192.168.2.0
wlanrange='192.168.2.100,192.168.2.200'
ntpserver=`dig be.pool.ntp.org | grep ^be.pool.ntp.org | head -1 | awk '{print $5}'`
gateway=192.168.1.1
wachtwoord=snt+4567
domein='pinda.snt'
dnsserver1=$gateway
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.

# LAN verbinding initialiseren
echo "BOOTPROTO='static'" > /etc/sysconfig/network/ifcfg-$lan
echo "BROADCAST=''" >> /etc/sysconfig/network/ifcfg-$lan
echo "ETHTOOL_OPTIONS=''" >> /etc/sysconfig/network/ifcfg-$lan
echo "IPADDR='$lanip/24'" >> /etc/sysconfig/network/ifcfg-$lan
echo "MTU=''" >> /etc/sysconfig/network/ifcfg-$lan
echo "NAME='RTL-8169 Gigabit Ethernet'" >> /etc/sysconfig/network/ifcfg-$lan
echo "NETWORK=''" >> /etc/sysconfig/network/ifcfg-$lan
echo "REMOTE_IPADDR=''" >> /etc/sysconfig/network/ifcfg-$lan
echo "STARTMODE='auto'" >> /etc/sysconfig/network/ifcfg-$lan
echo "USERCONTROL='no'" >> /etc/sysconfig/network/ifcfg-$lan

# WLAN verbindingen initialiseren
for wlan in 1 2 3 4 5 6 7 8; do
  echo "BOOTPROTO='static'" > /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "BROADCAST=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "ETHTOOL_OPTIONS=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "IPADDR='$wlanip/24'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "MTU=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "NAME='802.11 n WLAN'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "NETWORK=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "REMOTE_IPADDR=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "STARTMODE='hotplug'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  echo "USERCONTROL='no'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
done

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
wlan=""
for usb in 1 2 3 4 5 6 7 8; do
  wlan+=" $wlans$usb"
done
sed -i "s|^\(FW_DEV_INT=\).*$|\1\"$lan$wlan\"|" /etc/sysconfig/SuSEfirewall2
sed -i "s|^\(FW_MASQUERADE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
# Netwerkverkeer tussen draadloos en bekabeld intern netwerk toelaten (12/01/2015)
sed -i "s|^\(FW_FORWARD=\).*$|\1\"$lansubnet/24,$wlansubnet/24 $wlansubnet/24,$lansubnet/24\"|" /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 en proxy. 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.pinda.snt.

# DNS proxy en DHCP server http://www.linux.com/learn/tutorials/516220-dnsmasq-for-easy-lan-name-services
zypper --non-interactive install dnsmasq
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
echo 'domain-needed' > /etc/dnsmasq.conf
echo 'bogus-priv' >> /etc/dnsmasq.conf
echo "domain=$domein" >> /etc/dnsmasq.conf
echo 'expand-hosts' >> /etc/dnsmasq.conf
echo "local=/$domein/" >> /etc/dnsmasq.conf
echo 'listen-address=127.0.0.1' >> /etc/dnsmasq.conf
echo "listen-address=$lanip" >> /etc/dnsmasq.conf
echo 'bind-interfaces' >> /etc/dnsmasq.conf
echo "dhcp-range=lan,$lanrange,4h" >> /etc/dnsmasq.conf
echo "dhcp-range=wlan,$wlanrange,4h" >> /etc/dnsmasq.conf
# standaard gateway (0.0.0.0) gebruiken om de interne netwerken te verbinden (12/01/2015)
echo '#set default gateway' >> /etc/dnsmasq.conf
echo "dhcp-option=lan,3,0.0.0.0" >> /etc/dnsmasq.conf
echo "dhcp-option=wlan,3,0.0.0.0" >> /etc/dnsmasq.conf
echo '#set DNS server' >> /etc/dnsmasq.conf
echo "dhcp-option=lan,6,$lanip" >> /etc/dnsmasq.conf
echo "dhcp-option=wlan,6,$wlanip" >> /etc/dnsmasq.conf
echo "server=$dnsserver1" >> /etc/dnsmasq.conf
echo "server=$dnsserver2" >> /etc/dnsmasq.conf
echo "server=$dnsserver3" >> /etc/dnsmasq.conf

# Router intern bereikbaar via router.pinda.snt
echo "$lanip     router" >> /etc/hosts

Als je met een USB WLAN stick werkt, moet je de DHCP-server bij een aansluiten van de USB WLAN stick activeren voor het WiFi Access Point en deze terug deactiveren bij het loskoppelen. Dit kan met hotplug scripts. Let wel: deze scripts (de)activeren ook de hostapd server die instaat voor het Access Point (zie verder).

# Hotplug WLAN USB stick
echo '#!/bin/bash' > /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# if-up-dnsmasq-hostapd-hook - script to restart dhcpd and start hostapd on virtual interfaces' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# 2014-08 Dany Pinoy <pindanet.be>' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# This program is free software: you can redistribute it and/or modify' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# it under the terms of the GNU General Public License as published by' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# the Free Software Foundation, either version 3 of the License, or' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# (at your option) any later version.' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# This program is distributed in the hope that it will be useful,' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# but WITHOUT ANY WARRANTY; without even the implied warranty of' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# GNU General Public License for more details.' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# You should have received a copy of the GNU General Public License' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '# along with this program.  If not, see <http://www.gnu.org/licenses/>.' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo 'INTERFACE="$1"' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "if [[ \$INTERFACE == $wlans? ]]; then" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  /usr/bin/echo 'listen-address=$wlanip' >> /etc/dnsmasq.conf" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '  /usr/bin/systemctl restart dnsmasq.service' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  /usr/sbin/iw list | grep HT20/HT40" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  if [ \$? == 0 ]; then" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "    /usr/bin/echo \"ieee80211n=1\" >> /etc/hostapd.conf" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  else" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "    /usr/bin/sed -i '/ieee80211n=1/d' /etc/hostapd.conf" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  fi" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  /usr/bin/sed -i \"s|^\\(interface=\\).*\$|\\1\$INTERFACE|\" /etc/hostapd.conf" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo '  /usr/bin/systemctl start hostapd.service' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  /usr/bin/sed -i \"s|^\\(network_interface=$lan\\).*\$|\\1,\$INTERFACE|\" /etc/minidlna.conf" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo "  /usr/bin/systemctl restart minidlna.service" >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo 'fi' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook
echo 'exit' >> /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook

chmod +x /etc/sysconfig/network/if-up.d/61-dnsmasq-hostapd-hook

echo '#!/bin/bash' > /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# if-down-dnsmasq-hostapd-hook - script to restart dhcpd and stop hostapd on virtual interfaces' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# 2014-08 Dany Pinoy <pindanet.be>' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# This program is free software: you can redistribute it and/or modify' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# it under the terms of the GNU General Public License as published by' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# the Free Software Foundation, either version 3 of the License, or' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# (at your option) any later version.' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# This program is distributed in the hope that it will be useful,' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# but WITHOUT ANY WARRANTY; without even the implied warranty of' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# GNU General Public License for more details.' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# You should have received a copy of the GNU General Public License' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '# along with this program.  If not, see <http://www.gnu.org/licenses/>.' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '#' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo 'INTERFACE="$1"' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo "if [[ \$INTERFACE == $wlans? ]]; then" >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo "  /usr/bin/sed -i '/listen-address=$wlanip/d' /etc/dnsmasq.conf" >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '  /usr/bin/systemctl restart dnsmasq.service' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo '  /usr/bin/systemctl stop hostapd.service' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo 'fi' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook
echo 'exit' >> /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook

chmod +x /etc/sysconfig/network/if-down.d/61-dnsmasq-hostapd-hook

systemctl enable dnsmasq.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. Het WiFi Access Point werkt nog niet. Let op: door de herstart moeten de variabelen met de router instellingen terug geïnitialiseerd worden.

# Variabelen met routerinstellingen heruitvoeren

Je kunt de router ook gebruiken om bestanden te delen. Dit wordt op school gebruikt om oefenbestanden ter beschikking van de cursisten te stellen. We gebruiken daarvoor een Samba server. Elk besturingssysteem kan met Samba gedeelde mappen en bestanden bereiken.

# Samba server
zypper --non-interactive remove patterns-openSUSE-minimal_base-conflicts
zypper --non-interactive install samba
mkdir /home/sntbeheerder/public
echo -e '[SNTcursist]\n\tcomment = Public\n\tpath = /home/sntbeheerder/public\n\tread only = yes\n\tpublic = yes\n\thide dot files = no\n' >> /etc/samba/smb.conf
(echo $wachtwoord; echo $wachtwoord) | smbpasswd -a sntbeheerder -s
chown -R sntbeheerder:users /home/sntbeheerder/public/
# 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
# schrijftoegang via smb://sntbeheerder@192.168.0.1/users/sntbeheerder/public/

Hoewel de router in normale omstandigheden zonder scherm werkt, schakelen we de schermbeveiliging toch uit en plaatsen we wat extra informatie op het scherm.

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

# IP adres op het scherm tonen
echo '[Unit]' > /lib/systemd/system/pinda.service
echo 'Description=Login message' >> /lib/systemd/system/pinda.service
echo 'After=syslog.target network.target time-sync.target' >> /lib/systemd/system/pinda.service
echo >> /lib/systemd/system/pinda.service
echo '[Service]' >> /lib/systemd/system/pinda.service
echo 'Type=simple' >> /lib/systemd/system/pinda.service
echo 'ExecStart=/bin/sh -c "/root/bin/pindaExecStart.sh"' >> /lib/systemd/system/pinda.service

echo '[Install]' >> /lib/systemd/system/pinda.service
echo 'WantedBy=multi-user.target' >> /lib/systemd/system/pinda.service

echo '# wacht tot netwerkverbinding klaar is' > /root/bin/pindaExecStart.sh
echo 'sleep 15' >> /root/bin/pindaExecStart.sh
echo "IPadres=\`/sbin/ip -f inet -oneline addr show $wan | cut -d \" \" -f7\`" >> /root/bin/pindaExecStart.sh
echo '# plaats het IP adres op het scherm' >> /root/bin/pindaExecStart.sh
echo 'echo -ne "\n\nWelkom op de router\nDeze router is bereikbaar via SSH op $IPadres\n2014 Dany Pinoy voor SNT Brugge\n\nusers login: " > /dev/tty1' >> /root/bin/pindaExecStart.sh

chmod +x /root/bin/pindaExecStart.sh
systemctl start pinda.service
systemctl enable pinda.service

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 install exim
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
systemctl enable exim.service
systemctl start exim.service
# # Mailserver testen vanaf andere computer
# echo "Bericht van dany" | mail -S smtp=smtp://192.168.0.1:25 -s "Testbericht" pc01@pinda.snt
# # Ontvangen mails opvragen op de router
# zypper install mailx
# 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 dovecot21
sed -i.ori "s/#mail_location =/mail_location = mbox:~\/Mail:INBOX=\/var\/spool\/mail\/%u/" /etc/dovecot/conf.d/10-mail.conf
systemctl enable dovecot.service
systemctl start dovecot.service
# # Testen
# telnet localhost 143
#   1 login pc01 snt+4567
#   1 select inbox
#   1 logout

Om mails via een webinterface te kunnen beheren, hebben we een webserver nodig.

# Webserver
zypper --non-interactive install apache2 apache2-mod_fcgid php5-bcmath php5-bz2 php5-calendar php5-ctype php5-curl php5-dom php5-ftp php5-gd php5-gettext php5-gmp php5-iconv php5-imap php5-ldap php5-mbstring php5-mcrypt php5-mysql php5-odbc php5-openssl php5-pcntl php5-pgsql php5-posix php5-shmop php5-snmp php5-soap php5-sockets php5-sqlite php5-sysvsem php5-tokenizer php5-wddx php5-xmlrpc php5-xsl php5-zlib php5-exif php5-fastcgi php5-pear php5-sysvmsg php5-sysvshm ImageMagick curl apache2-mod_php5
echo "APACHE_MODULES=\"actions php5 alias auth_basic authn_file authz_host authz_groupfile authz_user autoindex cgi dir env expires include log_config mime negotiation setenvif ssl userdir reqtimeout authn_core authz_core\"" >> /etc/sysconfig/apache2
systemctl enable apache2.service
systemctl start apache2.service
yast2 firewall services add zone=EXT service=service:apache2
# # Test Webserver met PHP
# echo "<?php phpinfo(); ?>" > /srv/www/htdocs/info.php
# rm /srv/www/htdocs/info.php

De door ons gebruikte webinterface voor mails gebruikt een mysql database.

# MariaDB server
zypper --non-interactive install mariadb phpmyadmin
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/
/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

En uiteindelijk kunnen we de RoundCube webmail installeren.

# Webmail http://trac.roundcube.net/wiki/Howto_Install
wget http://downloads.sourceforge.net/project/roundcubemail/roundcubemail/1.0.2/roundcubemail-1.0.2.tar.gz
tar xfz roundcubemail-1.0.2.tar.gz -C /srv/www/htdocs/
rm roundcubemail-1.0.2.tar.gz
mv /srv/www/htdocs/roundcubemail-1.0.2/ /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
rm -rf /srv/www/htdocs/webmail/installer

Om draadloze apparaten te kunnen bedienen, hebben we een WiFi Access Point nodig. Let op: aangezien ik hier werk met een USB WLAN stick, heb je ook de hotplug opdrachten nodig.

# Access Point met WLAN USB stick
zypper --non-interactive install hostapd iw
cp /etc/hostapd.conf /etc/hostapd.conf.ori
echo "interface=$wlan" > /etc/hostapd.conf
echo "driver=nl80211" >> /etc/hostapd.conf
echo "channel=6" >> /etc/hostapd.conf
echo "ssid=SoftAP-SNT" >> /etc/hostapd.conf
echo "hw_mode=g" >> /etc/hostapd.conf
echo "auth_algs=1" >> /etc/hostapd.conf
echo "wmm_enabled=1" >> /etc/hostapd.conf
# enkel voor moderne WLAN kaarten
# echo "ieee80211n=1" >> /etc/hostapd.conf
echo "ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]" >> /etc/hostapd.conf
echo "wpa=2" >> /etc/hostapd.conf
echo "wpa_passphrase=$wachtwoord" >> /etc/hostapd.conf
echo "wpa_key_mgmt=WPA-PSK" >> /etc/hostapd.conf
echo "wpa_pairwise=TKIP CCMP" >> /etc/hostapd.conf
echo "rsn_pairwise=CCMP" >> /etc/hostapd.conf
systemctl start hostapd.service
systemctl enable hostapd.service

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.1.3/minidlna-1.1.3_static.tar.gz
tar xvzf minidlna-1.1.3_static.tar.gz -C /
sed -i.ori "/#network_interface=eth0/anetwork_interface=$lan" /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_-_snippets_640x368.mp4
wget --directory-prefix=/home/sntbeheerder/Videos/ https://webdesign.pindanet.be/deel2/Linecraft/films/kajimba.jpg

echo '[Unit]' > /usr/lib/systemd/system/minidlna.service
echo 'Description=MiniDLNA UPnP-A/V and DLNA media server' >> /usr/lib/systemd/system/minidlna.service
echo 'After=network.target' >> /usr/lib/systemd/system/minidlna.service
echo '' >> /usr/lib/systemd/system/minidlna.service
echo '[Service]' >> /usr/lib/systemd/system/minidlna.service
echo 'Type=forking' >> /usr/lib/systemd/system/minidlna.service
echo 'PIDFile=/var/run/minidlna.pid' >> /usr/lib/systemd/system/minidlna.service
echo 'ExecStart=/usr/sbin/minidlnad -P /var/run/minidlna.pid -f /etc/minidlna.conf' >> /usr/lib/systemd/system/minidlna.service
echo '' >> /usr/lib/systemd/system/minidlna.service
echo '[Install]' >> /usr/lib/systemd/system/minidlna.service
echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/minidlna.service
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 ownCloud.

# OwnCloud
zypper addrepo http://download.opensuse.org/repositories/isv:ownCloud:community/openSUSE_13.1/isv:ownCloud:community.repo
zypper --gpg-auto-import-keys refresh
zypper --non-interactive install owncloud php5-fileinfo

# Surf naar router.pinda.snt/owncloud
curl --request POST "http://$lanip/owncloud/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/owncloud/data" --data-urlencode "dbtype=sqlite" --data-urlencode "dbuser=" --data-urlencode "dbpass=" --data-urlencode "dbpass-clone=" --data-urlencode "dbname=" --data-urlencode "dbhost=localhost"
# Owncloud URL aanpassen voor werking op router (proxy)
sed -i.ori "/  'installed' => true,/a  'overwritehost' => '$lanip'," /srv/www/htdocs/owncloud/config/config.php
# Aanmaken gebruikers https://gitorious.org/osama-scripts/osama-scripts/source/5f535e45c63843144415b7e3abeaad25eb689f3f:create_oc_user.py
login_requesttoken=`curl --cookie-jar /tmp/cookies.txt "http://$lanip/owncloud/index.php" | grep 'name="requesttoken"'| awk -F "\"" '{print $6}'`
oc1d6beae686=`more /tmp/cookies.txt | grep "/owncloud" | awk '{print $7}'`
curl --cookie /tmp/cookies.txt --cookie-jar /tmp/cookies.txt --referer "http://$lanip/owncloud" --request POST "http://$lanip/owncloud/index.php" --data-urlencode "user=root" --data-urlencode "password=$wachtwoord" --data-urlencode "requesttoken=$login_requesttoken" --data-urlencode "remember_login=1" --data-urlencode "timezone-offset=3"
oc_username=`more /tmp/cookies.txt | grep "oc_username" | awk '{print $7}'`
oc_token=`more /tmp/cookies.txt | grep "oc_token" | awk '{print $7}'`
oc_remember_login=`more /tmp/cookies.txt | grep "oc_remember_login" | awk '{print $7}'`
requesttoken=`curl --cookie /tmp/cookies.txt --cookie-jar /tmp/cookies.txt --referer "http://$lanip/owncloud" --request POST "http://$lanip/owncloud/index.php/settings/users" | grep data-requesttoken | awk -F "\"" '{print $4}'`
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
  curl --include --header "requesttoken: $requesttoken" --cookie /tmp/cookies.txt --cookie-jar /tmp/cookies.txt --referer "http://$lanip/owncloud" --request POST "http://$lanip/owncloud/index.php/settings/ajax/createuser.php" --data-urlencode "username=pc$gebruiker" --data-urlencode "password=$wachtwoord"
done

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 het schooljaar.

shutdown -h now

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

# ToDo