Achtung: Versuchsbetrieb!
wrt54g

Howto Installation Webserver/ftp-Server auf DD-WRT

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.

Vorbereitungen in DD-WRT

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

Vorbereitung der Optware-Paketverwaltung (ipkg-opt)

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":

Anlegen eines Startupscriptes (startup.sh)

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.

FTP-Server installieren (xinetd, vsftpd)

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.

Webserver installieren (lighttpd)

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.

Sicherungsscript für den Inhalt der SD-/MMC-Karte

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"

Abschließender Neustart des Systems

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
Geändert am 22.06.2009 Kontakt