AG-Intra.net Arbeitsgemeinschaft
Intranet

Home
Was ist ein Intranet
Grundlagen
Netzwerke
Linux
Windows
Java
Sicherheit
Datenbanken
Projekte
Links
Impressum
Mitmachen ?
Diskussionsforum
Letztes Update:
07.06.2003
Liebe Besucher, ein aktueller Hinweis in eigener Sache:
Es ist beabsichtigt, diese Seiten und die Domain im Januar/Februar 2004 auf einen anderen Server umzuziehen. Es ist leider nicht auszuschließen, daß es während des Umzugs zu technischen Problemen mit diesen Seiten kommen wird. Insbesondere im eMail-Bereich wird es vermutlich Probleme geben. Wenn Sie fragen haben oder mich sonstwie erreichen wollen empfehle ich an rebel@snafu.de zu posten.
Nachdem der Umzug abgeschlossen ist, wird es allerdings auch inhaltliche Änderungen während des ersten Halbjahrs 2004 geben. Keine Angst. Es werden keine Inhalte verlorengehen, aber die Struktur der Seiten wird komplett geändert. Diese Seite hat eben eine andere Entwicklung genommen seit 2000, als das Projekt gestartet wurde ;-) Ich werde mich bemühen, daß bei ihnen vorhandene alte Bookmarks wenigstens zu einem Verweis auf die Neustruktur führen, und die gesuchten Inhalte für sie trotzdem leicht und schnell auffindbar sein werden.
Die eigentlich zu dieser Seite gehörenden Domains ag-intra.com, ag-intra.org und ag-intra.de werden von mir geschlossen bzw. gelöscht und unregistriert.

Anleitung - Viele Server: Virtual Hosts mit Apache und DynDNS 
Copyright 2003 by Frank Gehde

Getestet mit SuSE 8.2 (und 8.0)
Einen eigenen Webserver auf einem Rechner zuhause laufen lassen, der auch unter einem echten Namen zu erreichen ist? Oder mehrere? Dank DynDNS und Apache kein Problem.
Zwei Probleme gibt es dabei in der Regel zu lösen. Wie bekomme ich einen festen Namen zu meiner dynamischen DSL-IP-Adresse (also DSL ist fast Minimum. Natürlich geht das auch über ISDN oder Modem, aber selbst die 128 K Up-Stream von DSL werden sie in der Praxis lahm finden) und wie kann ich ein extra Verzeichnis oder mehrere für einen neuen Webserver verwenden.

DynDNS
Wenden wir uns erstmal dem dynamischen DNS zu. Dies ist ein Service, der einen Nameserver betreibt, und den Kunden mit dynamischen IP-Adressen verwenden können. Dazu läuft auf dem Rechner, auf dem auch der entsprechende Webserver läuft, ein Client Programm. Dieses Programm kontrolliert regelmäßig die IP-Adresse des Rechners. In dem Augenblick, wo sie sich ändert, nimmt sie Kontakt mit dem Nameserver auf, und teilt die neue IP-Adresse zu dem entsprechenden Namen mit. Trotz Nameservercaches etc. funktioniert das richtig gut und der Rechner ist in kürzester Zeit mit der neuen IP unter dem gewohnten Namen zu erreichen.
Ein beliebter Anbieter für kostenloses DynDNS ist http://www.dyndns.org. Dort kann man sich einen Namen als Subdomain unter verschiedenen SecondLevel Domains aussuchen. Als Beispiel nehme ich ag-intranet.homelinux.net und frankie.gotdns.org (das sind nur  Beispiele, die habe ich nicht registriert.)

Apache
Nachdem wir uns also entsprechende Subdomains bei dyndns.org registriert haben, können wir nun den Apache entsprechend aufbauen. Im Grunde genommen betreibe ich drei Webserver. Einen, der nur aus dem Intranet erreichbar sein soll, und zwei, die von aussen aus dem Internet unter den bei dyndns.org registrierten Namen erreichbar sein sollen. Damit die drei Server laufen, starte ich nicht dreimal Apache, sondern verwende die Fähigkeit von Apache sogenannte Virtual Hosts auf Namensbasis zu kontrollieren. Meine drei Server sollen ja verschiedene Inhalte präsentieren, laufen aber unter der gleichen IP-Adresse. Apache kann nun anhand des Domainnamens, der vom Client im HTTP-Protokoll übertragen wird unterscheiden, welcher Server/welche Webseiten angefordert werden.
Unter SuSE 8.2 befindet sich das eigentliche Rootverzeichnis für den Standard Apache unter /srv/www/htdocs (früher /usr/local/httpd/htdocs). Dieses Verzeichnis werde ich als das Standardverzeichnis meines internen Webservers verwenden, also für den, der nur aus dem Intranet zugänglich ist. Für meine beiden neuen Server, die auch von aussen erreichbar sein sollen, lege ich jeweils ein eigenes Verzeichnis unter /srv/www/ag-intranet und /srv/www/frankiean. Zum Testen bekommt jedes Verzeichnis eine entsprechende index.html Seite spendiert, oder schon die fertigen Inhalte. Nun muß dem Apache gesagt werden, daß er Virtuelle Hosts verwenden soll, und welche. Dazu ändere ich zwei Zeilen in der /etc/httpd/httpd.conf und füge einige neue hinzu. Zunächst die Änderungen. Etwa in Zeile 196 befindet sich der folgende Eintrag, bei dem das Kommentarzeichen (die Raute) entfernt werden muß:

BindAdress *

Etwa in Zeile 1329 befindet sich der folgende Eintrag, bei dem auch das Kommentarzeichen entfernt werden muß:

NameVirtualHost *

Direkt dahinter befindet sich ein auskommentierter Block mit der Überschrift VirtualHostExample. Hinter diesem Block füge ich nun meine Definitionen für meine drei virtuellen Server ein. Dabei ist zu beachten, daß der erste definierte Server als Standard verwendet wird. Bekommt Apache also eine Anfrage, die er nicht direkt einem der drei Einträge zuordnen kann, geht er davon aus, daß der erste Eintrag gemeint ist. Daher steht mein interner Server nicht als erstes dort. Den dieser soll ja auch im Fehlerfall nicht standardmäßig nach aussen angezeigt werden. Ausserdem ist zu beachten, daß der dritte, also mein interner Server nicht unbedingt als virtueller Host eingerichtet sein muß, sondern auch als _der_ normale Apache betrachtet werden könnte. Wie man sieht, geht es aber auch so. Nun also die Einträge:

<VirtualHost *>
    ServerAdmin root@lago.heim.netz
    DocumentRoot /srv/www/ag-intranet
    ServerName ag-intranet.heimlinux.net
    ErrorLog /var/log/httpd/http.ag-intranet.error
    CustomLog /var/log/httpd/access_log.ag-intranet common
</VirtualHost>

<VirtualHost *>
    ServerAdmin root@lago.heim.netz
    DocumentRoot /srv/www/frankie
    ServerName frankie.gotdns.org
    ErrorLog /var/log/httpd/http.frankie.error
    CustomLog /var/log/httpd/access_log.frankie common
</VirtualHost>

<VirtualHost *>
    ServerAdmin root@lago.heim.netz
    DocumentRoot /srv/www//htdocs
    ServerName www.heim.netz
    ErrorLog /var/log/http.intranet.error
    CustomLog /var/log/access_log.intranet common
</VirtualHost>


Ich habe hier die o.g. Namen, und die Beispiel-Namen aus meiner Nameserver Anleitung verwendet. Der dritte Eintrag funktioniert natürlich so nur, wenn bei mir ein Nameserver läuft und einen CNAME Eintrag für www.heim.netz besitzt.
Der Aufbau ist ansonsten einfach. In der ersten Zeile eines Blocks findet sich die eMail-Adresse an die Apache eMail schicken soll, falls es Probleme mit dem Server gibt. In der zweiten Zeile wird das Hauptverzeichnis des jeweiligen virtuellen Servers angegeben. In der dritten Zeile steht der Name des Servers (damit Apache die Domainnamen aus dem HTTP-Protokoll zuordnen kann). Die letzen beiden Zeilen bestimmen, wohin Logausgaben für den jeweiligen Server gehen sollen. Es gibt noch mehr Konfigurationsmöglichkeiten, aber dies sind die wesentlichen für den Betrieb von virtuellen Servern. Sie können beliebig viele derartige Blöcke einfügen und damit beliebig viele virtuelle Server betreiben (okay, beliebig nicht. Irgendeine Grenze wird es schon geben. Ich weiß leider grad nicht welche das ist, aber bei den wenigen Servern die ich betreibe geht das. Provider, die mehr Bedarf haben, werden schon wissen, wo man die Zahl hochschrauben kann :)) Übrigens könnte man die Blöcke auch in einer gesonderten Datei aufführen und über eine Include Anweisung in die httpd.conf aufnehmen (der von SuSE empfohlene Weg).
Nun sollten Sie über den Runlevel Editor (der aus dem YaST2 Controlcenter) den Apache neustarten (oder überhaupt starten, wenn Sie dies noch nicht getan haben). Dabei liest er die neue Konfiguration ein. Zum Testen sollte der interne Server nun schon funktionieren (wenn Sie einen Nameserver laufen haben :).
Damit ist der Apache eigentlich soweit fit. Sollten Sie Ihre Firewall mit Iptables komplett zugenagelt haben (wie z.B. in meiner DSL-Anleitung beschrieben), können Sie mit

iptables -I INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT

den Port 80 nach aussen freigeben (ändern Sie ihr Firewallscript auch so ab, daß der Port 80 auch nach dem nächsten booten offen ist).
Machen wir die anderen beiden Server nun startklar.

DDClient
Wir haben den Apache fit, und die beiden Subdomains bei dyndns.org registriert. Nun muß dem Nameserver von dyndns.org nur noch die richtige IP-Adresse mitgeteilt werden. Und dies möglichst auch nach jedem IP-Wechsel. Dazu kann der bei SuSE 8.2 mitgelieferte ddclient verwendet werden. Das ist ein kleines Perl Programm, welches als Daemon laufen kann, und dann z.B. alle 5 Minuten überprüft, ob sich die IP-Adresse geändert hat. Wenn dies der Fall ist, wird die IP an dyndns.org übermittelt, damit der Zugriff über den Namen klappt.
Zunächst sollte die Konfigurationsdatei /etc/ddclient.conf angepasst werden. Für mein Beispiel sieht sie so aus (um alle Kommentarzeilen gekürzt):

daemon=300                  # check every 300 seconds
syslog=yes                  # log update msgs to syslog
mail=root                   # mail all msgs to root
mail-failure=root           # mail failed update msgs to root
pid=/var/run/ddclient.pid   # record PID in file.

use=if,        if=ppp0      # interface to observe

login=frankie-intranet               
password=MeInGeHeImNiS                   

server=members.dyndns.org,        \
protocol=dyndns2                  \
ag-intranet.homelinux.net

server=members.dyndns.org,        \
protocol=dyndns2                  \
frankie.gotdns.org


Der erste Block konfiguriert ddclient selbst. Als zweites folgt das Interface, daß von ddclient auf IP-Wechsel überwacht werden soll. Das ist bei meiner DSL-Leitung natürlich ppp0. Dann folgen Nutzername und Passwort für den dyndns Account. Dann folgen die Blöcke für die Subdomains, die hier verwendet werden sollen. Das Backslashzeichen darf auf keinen Fall vergessen werden :) Die 300 bei Daemon ist im übrigen das Intervall, in dem ddclient auf eine neue IP checken soll. Hier sind es 300 Sekunden, was im schlimmsten Fall heisst, daß der Rechner täglich maximal 5 Minuten nicht erreichbar ist (geschickter Weise sorgt man dafür, daß die Zwangstrennung vom Provider irgendwann nachts gegen 04:00 Uhr oder so stattfindet, und der IP-Wechsel damit selten auffällt).
Nun muss das ganze konsistent gemacht werden. ddclient soll nach jedem Booten starten. Dazu verwende ich das folgende Startscript, daß ich nach /etc/init.d/ddclient kopiert habe:

#!/bin/sh
#
# ddclient      This shell script takes care of starting and stopping
#               ddclient.
#
# chkconfig: 2345 65 35
# description: ddclient provides support for updating dynamic DNS services.

[ -f /etc/ddclient.conf ] || exit 0

PATH=/usr/sbin:/root/bin:${PATH}
COLUMNS=9999
export PATH COLUMNS

program=ddclient
# See how we were called.
case "$1" in
  start)
    # Start daemons.
    echo -n "Starting ddclient: "
    ddclient -daemon 300
    echo   
    ;;
  stop)
    # Stop daemons.
    echo -n "Shutting down ddclient: "
    kill `ps -aef | awk '/[ \/]perl.*ddclient/ { print $2}'`
    echo
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  status)
    pids=`ps -aef | awk '/[ \/]perl.*ddclient/ { print $2}'`
    if test "$pids"
    then
        for p in $pids
        do
            echo "$program (pid $p) is running"
        done
    else
        echo "$program is stopped"
    fi
    ;;
  *)
    echo "Usage: ddclient {start|stop|restart|status}"
    exit 1
esac

exit 0


Das Script muss nun mit

chmod a+x ddclient

noch ausführbar gemacht werden. Dann können über den Runleveleditor die entsprechernden Start- und Stopscripte in den rc-Directories angelegt werden. Dort kann das Script auch gleich zum ersten Mal gestartet werden. Dabei wird nun die aktuelle IP an dyndns.org übertragen. Bei mir ist es so, daß ich wirklich kurz danach meine beiden Webserver schon über den Namen ansprechen konnte. Fertig :)

Sicherheit
Wie üblich zum Schluß ein kleiner Sicherheitshinweis. In der Praxis habe ich gesehen, wie selbst Rechner, die mit ständig wechselnder dynamischer IP-Adresse ans Internet angebunden waren gehackt worden sind. Dadurch, daß ein Rechner über einen festen Namen erreichbar ist, erhöht sich dieses Risiko noch. Jeder Service, der auf dem Rechner läuft und von aussen erreichbar ist, stellt ein Sicherheitsrisiko dar. Hier ist es der Apache. Beschäftigen Sie sich mit dem Thema Sicherheit, updaten Sie ihr System regelmäßig und verfolgen Sie Sicherheitsmeldungen im Internet. Beschäftigen Sie sich mit der Firewall Iptables und anderen Sicherheitsmechanismen. Selbst wenn Sie der Meinung sind, daß es auf Ihrem Rechner oder in Ihrem Netz keine Dateien gibt, die interessant für einen Hacker sind, denken Sie mal darüber nach, wie es aussieht, wenn von Ihrem Rechner aus andere Systeme angegriffen werden, 20 Millionen Spams verschickt werden, oder auf einmal verbotene Dateien auf Ihrem Rechner sind, die vorher nicht da waren.



Copyright 2003 by Frank Gehde