Hier eine 10-Minuten-Schritt-für-Schritt-Anleitung zur Einrichtung eines öffentlichen Webservers (lighttpd) und eines privaten ftp-Servers (vsftpd via xinetd) auf dem WRT. Damit kann eineöffentlichen Webseite betrieben werden, welche aus dem lokalen LAN per ftp verwaltet werden kann. Voraussetzungen für die Installation sind DD-WRT v24SP1 als Routerfirmware und eine erfolgreich installierte SD-/MMC-Karte.
Innerhalb der Administrations-Webseite von DD-WRT müssen folgende Einstellungen getroffen werden:
Administration->Management:
Administration->Commands wird folgendes als Startupskript hinterlegt
mkdir /mmc/opt mount -o bind /mmc/opt /opt /opt/etc/startup.sh
Jetzt muss der Router noch neu gebootet werden, damit die Einstellungen übernommen werden. Den Reboot erledigt man am besten mit dem Schalter unter Administration->Management->Reboot
Die Installation der Optware-Paketverwaltung folgt im wesentlichen der Anleitung im DD-WRT-Wiki.
Dazu wird an der ssh-Console des Routers folgendes Eingegeben:
wget http://www.wlan-sat.com/boleo/optware/optware-install-ddwrt.sh -O - | tr -d '\r' > /tmp/optware-install.sh # alternativly use # wget http://r3network.dyndns.org/files/optware-install-ddwrt.sh sh /tmp/optware-install.sh export PATH=/opt/bin:/opt/sbin:$PATH unset LD_LIBRARY_PATH ipkg-opt update
Im folgenden wird der Texteditor "nano" installiert, der später für diverse Konfigurationsarbeiten benötigt wird.
# install an editor ipkg-opt install nano
Beachten sie Folgendes im späteren Umgang mit "nano":
Das im Folgenden angelegte Startupscript wird beim Systemstart von DD-WRT ausgeführt und startet unsere Dienste, legt Profilinformationen an und bereitet das System für die Softwareverwaltung über die Console vor.
Zum Anlegen des Startupscriptes öffnen Sie nano (Fenster breitziehen!) mit folgendem Befehl an der ssh-Console:
nano /opt/etc/startup.sh
In den geöffneten Editor kopieren Sie folgenden Text:
#!/bin/sh
LOG=/tmp/my_bootlog
##################################
# config-webserver auf port 81
##################################
killall httpd
httpd -p 81 -h /www >> $LOG
##################################
# Profil anpassen
##################################
rm -f /tmp/newProfile
#head -n1 /etc/profile | sed s!=!=/opt/sbin:/opt/bin:! >> /tmp/newProfile
echo "export PATH=/opt/bin:/opt/sbin:/opt/etc:$PATH" >> /tmp/newProfile
echo "export LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:$LD_LIBRARY_PATH" >> /tmp/newProfile
mount --bind /tmp/newProfile /etc/profile >> $LOG
##################################
# set variables for this script
##################################
export PATH=/opt/bin:/opt/sbin:/opt/etc:$PATH
export LD_LIBRARY_PATH=/opt/lib:/opt/usr/lib:$LD_LIBRARY_PATH
#################################
# neue Benutzer anlegen
#################################
# vsftpd mit Passwort vsftp
echo 'vsftp:3kadi/1vGZOVM:0:0:Linux User,,,:/mmc:/bin/sh' >> /etc/passwd
#################################
# Startskripte ausführen
#################################
if [ -d /opt/etc/init.d ]; then
for f in /opt/etc/init.d/S* ; do
echo "Starte $f" >> $LOG
[ -x $f ] && $f start >> $LOG
sleep 1
done fi
#################################
# Scripte kopieren
#################################
cp /opt/etc/restart.sh /tmp/root/
cp /opt/etc/backup.sh /tmp/root/
Nach dem Speichern des neuen Scriptes ("Strg-x" -> "y") geben Sie an der ssh-Console folgendes ein:
# set executable chmod a+x /opt/etc/startup.sh
Auf der SD-Karte wird von DD-WRT ein ext2-Dateisystem installiert, welches leider keine Journaling-Funktionalität besitzt. Wird der Router ausgeschaltet oder neugestartet, während noch Dateien auf der Karte geöffnet sind, kann das Dateisystem Schaden nehmen. Um dies zu verhindern, müssen alle Dateien vor einem Neustart geschlossen werden und die gemounteten Verzeichnisse zuvor ausgehängt werden.
Dies erledigt am besten ein kleines Skript für uns, welches unmittelbar vor jedem Neustart ausgeführt werden sollte.
Um dieses Script anzulegen öffnen Sie nano mittels folgender Eingabe an der ssh-Console:
#create restartscript nano /opt/etc/restart.sh
Kopieren Sie in das erscheinende Editorfenster folgenden Text:
#!/bin/sh
echo "Start from /tmp/root!"
echo "Kill processes"
killall vsftpd
killall lighttpd
killall xinetd
sleep 2
echo "OK - killed processes"
ps
echo "-----------------------"
sync
echo "try to unmount"
i=1
while [ $i -le 3 ]
do
umount /etc/profile
umount /jffs
umount /jffs
umount /opt
umount /mmc
echo "umount-Durchlauf $i"
i=`expr $i + 1`
sleep 1
done
sync
echo "OK - unmounted"
echo "-----------------------"
mount
echo "-----------------------"
echo "OK - if _all_ ext2 is umounted type reboot, halt or shutdown"
echo "If there is ext2 left, try to end processes by hand and run this script again!"
#/sbin/reboot
Nach dem Speichern wird an der ssh-Console folgender Befehl ausgeführt:
# make executable chmod a+x /opt/etc/restart.sh
Damit sind die wesentlichen Vorbereitungen dür die Serverinstallation abgeschlossen.
Also ftp-Server- installieren wir vsftpd, welcher bei Bedarf vom "Superserver" "xinetd" gestartet wird. Da im Normalfall (keine ftp-Verbindung) nur xinetd läüft, wird der Bedarf an chronisch knappen Speicher minimiert.
Installiert werden die benötigten Pakete mit folgendem Befehl an der ssh-Console:
#install ftp-server - runs via xinetd ipkg-opt install xinetd ipkg-opt install vsftpd
Die Konfigurationsdatei von xinetd muss jetzt noch angepasst werden. Starten Sie den Texteditor an der ssh-Console:
#configure xinetd - change 192.168.2.0/24 to your adressspace nano /opt/etc/xinetd.conf
Und kopieren Sie folgenden Text in das geöffnete Editorfenster:
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# Sample configuration file for xinetd
defaults
{
only_from = localhost 192.168.2.0/24
instances = 4
log_type = FILE /tmp/var/log/xinetd.log
log_on_success = HOST PID EXIT DURATION
log_on_failure = HOST ATTEMPT
cps = 25 30
}
service ftp
{
disable = no
socket_type = stream
user = root
server = /opt/sbin/vsftpd
server_args = /opt/etc/vsftpd.conf
wait = no
nice = 10
only_from = localhost 192.168.2.0/24
}
Ersetzen Sie die im Beispiel verwendeten IP-Masken ("192.168.2.0/24") mit den von Ihnen verwendeten Werte!
Um den ftp-Server zu konfigurieren, müssen lediglich ein paar Zeilen ans Ende seiner bestehenen Standardkonfigurationsdatei angefügt werden. Am schnellsten geht das mittels dieser Befehle an der ssh-Console:
#configure vsftpd - we just ADD 2 Lines at the end of vsftpd.conf # type at the console: echo 'secure_chroot_dir=/mmc' >> /opt/etc/vsftpd.conf echo 'listen=NO' >> /opt/etc/vsftpd.conf echo 'nopriv_user=vsftp' >> /opt/etc/vsftpd.conf echo 'chroot_local_user=YES' >> /opt/etc/vsftpd.conf
Der FTP-Server ist nun konfiguriert und nimmt (nach einem Reboot) Verbindungen aus dem angegebenen Netzwerk entgegen. Login und Passwort sind "vsftp" und "vsftp". Übrigens: Der Benutzer "vsftp" wurde in der Datei "/opt/etc/startup.sh" im Bereich "Profil anlegen" festgelegt.
Der Webserver wird mittels ssh-Consolenbefehl
#install webserver lighttpd ipkg-opt install lighttpd
installiert. Einige Anpassungen an der Konfiguration sind noch notwendig. Starten Sie dazu nano an der ssh-Console:
#configure lighttpd nano /opt/etc/lighttpd/lighttpd.conf
In der geöffneten Datei müssen im Texteditor noch zwei Änderungen vorgenommen werden. (Nebenbei: Die Textsuche innerhalb von nano funktioniert über "Strg-w") Ändern Sie die Zeile
server.port = 8081 --> zu server.port = 80
Ebenso ändern sie den Inhalt der Zeile
#server.bind = "grisu.home.kneschke.de" --> zu server.bind = "0.0.0.0"
Der HTTP-Server lauscht jetzt an allen Interfaces auf Port 80. Allerdings muss die Firewall des Routers noch angepasst werden. Eingehende Pakete auf Port 80 müssen noch an den HTTP-Server weitergereicht werden. Ebenso können wir mittels dieser Einstellungen die maximale Anzahl der parallel geöffneten Verbindungen auf dem Serverport einstellen. Um eine DoS-Attacke zu erschweren, legen wir diese Anzahl auf 6 fest. Hinterlegen Sie dazu auf der Administrations-Webseite von DD-WRT (192.168.2.1:80 oder 192.168.2.1:81 - nach einem Restart) im Bereich Administration->Commands->Firewall folgende Befehle:
iptables -I INPUT -p tcp -d $(nvram get wan_ipaddr) --dport 80 -j logaccept iptables -t nat -I PREROUTING -p tcp -d $(nvram get wan_ipaddr) --dport 80 -j DNAT --to $(nvram get wan_ipaddr):80 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 6 -j DROP
Damit ist die Konfiguration des HTTP-Servers im Wesentlichen abgeschlossen.
Für eine Sicherung benötigen wir zwei zusätzliche Pakete, welche wir mittels des folgenden Befehls an der ssh-Console starten:
#install backuptools ipkg-opt install tar ipkg-opt install gzip mkdir /mmc/backup #create backupscript für /mmc - use by calling backup.sh echo '/opt/bin/tar czvf /mmc/backup/wrt_backup-`date +"%Y-%m-%d_%H%M%S"`.tar.gz /mmc --exclude=/mmc/backup' > /mmc/opt/etc/backup.sh chmod a+x /mmc/opt/etc/backup.sh # copy unmount and backupscripts cp /opt/etc/restart.sh /tmp/root/ cp /opt/etc/backup.sh /tmp/root/
Um eine sicherung des gesamten Inhaltes der SD-Karte anzulegen, braucht man jetzt nur noch das Script "backup.sh" an der ssh-Console im Homeverzeichnis aufzurufen:
# go to home-dir cd ~ # backup install to /mmc/backup/ ./backup.sh
Die Datei mit den gesicherten Daten befindet sich nach Abschluss des Vorganges im Verzeichnis "/mmc/backup"
Wie oben bereits erwähnt müssen vor einem Neustart des Systems zukünftig alle Mountpoints des ext2-Dateisystems der SD-/MMC-Karte ausgehängt werden. Dazu wurde bereits ein Script ("restart.sh") angelegt und ins home-Verzeichnis kopiert.
Gestartet wir das Script durch folgenden Aufruf an der ssh-Console:
# unmount all ext2-systems ./restart.sh
Falls in der angezeigten Mountpoint-Liste noch immer ext2-Einträge erscheinen, so konnten Mountpoints nicht ausgehängt werden. Der Grund dafür sind meist von Prozessen noch geöffnete Dateien. Beenden Sie in Frage kommende Prozesse:
Nach dem Beenden der Prozesse kann "restart.sh" einfach nochmals aufgerufen werden.
Wenn in der angezeigten Mountpoint-Liste keine ext2-Einträge mehr erscheinen, kann der Router neugestartet werden, durch Eingabe des ssh-Consolen-Befehls:
# if there is NO mount on an ext2-filesystem left, you can reboot reboot
Um den Router auszuschalten, gibt es den Befehl "poweroff" an der ssh-Console:
poweroff