Marc Reichelt: Apache2: VirtualHosts und default-Konfiguration

Hallo an alle,

ich möchte gerne ein folgendes VirtualHost-System auf meinem Debian-Testserver aufsetzen:

  • alle Anfragen, die an den Server gestellt werden, sollen grundsätzlich verboten sein (Deny from all)
  • dann möchte ich erst für jeden einzelnen VirtualHost dieses Verbot aufheben.

In meinem Beispiel existieren die beiden folgenden Dateien:
/etc/apache2/sites-available/default
/etc/apache2/sites-available/linux-mobil.net.conf

Beide Dateien sind korrekt symbolisch nach /etc/apache2/sites-enabled/ verlinkt.

Nun möchte ich in der default-Datei erreichen, dass keine Requests auf den Server (Verzeichnis /var/www/) erlaubt sind:
DocumentRoot /var/www/
<Directory />
        Options FollowSymLinks
        AllowOverride None
</Directory>
<Directory /var/www/>
        Order allow,deny
        deny from all
</Directory>

Das Ganze geschieht ohne VirtualHosts - es sollen einfach alle Requests abgebrochen werden. Wahrscheinlich könnte ich das Ganze noch wesentlich einfacher gestalten, schließlich soll /var/www/ an sich gar kein DocumentRoot sein, sondern nur Unterordner davon - oder brauche ich den DocumentRoot?

In der linux-mobil.net.conf-Datei werden dann die folgenden Zeilen (den ganzen anderen Quatsch mal weggelassen) hineingeschrieben:
<VirtualHost www.linux-mobil.net>
        ServerName www.linux-mobil.net
        ServerAlias linux-mobil.net

DocumentRoot /var/www/linux-mobil.net/htdocs/
        <Directory /var/www/linux-mobil.net/htdocs/>
                Order deny,allow
                allow from all
        </Directory>
</VirtualHost>

Nun werden allerdings alle Zugriffe auf meinen Testserver verweigert, auch die auf www.linux-mobil.net.

Wie erreiche ich mein Vorhaben möglichst einfach bzw. was habe ich falsch gemacht?
Der Testserver ist zwar online, aber unter www.linux-mobil.net erreicht man nur meinen normalen Server. Also nicht beschweren wenn es dort ganz anders aussieht. ;)

Grüße & vielen Dank

Marc Reichelt || http://www.marcreichelt.de/

--
Linux is like a wigwam - no windows, no gates and an Apache inside!
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
  1. Hallo,

    ich möchte gerne ein folgendes VirtualHost-System auf meinem Debian-Testserver aufsetzen:

    Also Deine Allow/Deny-Kombinationen funktionieren bei mir so. Hast Du mal probiert, ob das ganze überhaupt funktioniert, wie gewünscht, wenn Du alles Allow/Deny man weglässt?

    Ich frage weil:

    <VirtualHost www.linux-mobil.net>
            ServerName www.linux-mobil.net
            ServerAlias linux-mobil.net

    DocumentRoot /var/www/linux-mobil.net/htdocs/
            <Directory /var/www/linux-mobil.net/htdocs/>
                    Order deny,allow
                    allow from all
            </Directory>
    </VirtualHost>

    Du willst wirklich IP-based Virtual Hosts einrichten? Dein Server hat für jeden VHost eine eigene IP? Wenn es noch einen Host gibt für den das DNS die selbe IP ausliefert wie für www.linux-mobil.net, dann greift immer der erste Host. Das sollte aber auch eine Fehlermeldung beim Apache-Start geben: "virtualhost ... overlaps with virtualhost ..."

    viele Grüße

    Axel

  2. Hi Marc,

    Nun möchte ich in der default-Datei erreichen, dass keine Requests auf den Server (Verzeichnis /var/www/) erlaubt sind:

    In der apache2.conf im Verzeichnis /etc/apache2 (ich gehe mal davon aus, dass du einen Apache2 über das Packetmanagment-System installiert hast) müsste irgendwo so etwas stehen:

    <Directory />
      Order deny,allow
      Deny from all
    </Directory>

    Dass dies dort steht ist wichtig - dadurch werden nämlich bereits sämtliche Anfragen auf ALLE Verzeichnisse deines Servers verboten.

    Wenn du den Virtual-Host, der unter Debian standardmäßig mit dem Namen "default" betitelt wird nicht haben willst - dann lösche doch einfach den Link auf die Datei in sites-enabled!

    Allerdings ist dieser VirtualHost ganz praktisch - ich würde diesen VirtualHost wieder anlegen mit:

    <VirtualHost _default_:*>
      ServerAdmin du@host
      DocumentRoot /var/www/default
      <Directory /var/www/default>
        Order allow,deny
        Allow from all
      </Directory>
    </VirtualHost>

    In /var/www/default kannst du dann eine index.* legen, in die du einfach reinschreibst "Diese Webseite wird leider nicht oder nicht mehr auf diesem Server gehostet." (Wenn du willst kannst du dann auch noch alle Aufrufe per mod_rewrite auf diese index Datei umleiten.)

    Folgende Vorteile hast du:

    • Alle nicht existierenden Seiten, d.h. nicht konfigurierten Domains werden von diesem VHost beantwortet
    • Der Besucher bekommt eine Fehlerseite, die du nach belieben gestalten kannst.

    Das Ganze geschieht ohne VirtualHosts - es sollen einfach alle Requests abgebrochen werden. Wahrscheinlich könnte ich das Ganze noch wesentlich einfacher gestalten, schließlich soll /var/www/ an sich gar kein DocumentRoot sein, sondern nur Unterordner davon - oder brauche ich den DocumentRoot?

    Wie bereits gesagt - kein Mensch zwingt dich /var/www irgendwo als DocumentRoot zu nutzen. Wenn du diesen DocumentRoot außerhalb eines VirtualHost Containers notierst und dann im späteren Verlauf doch noch Virtuelle Hosts verwendest, so wird meines Wissen der globale Host sowieso ignoriert und undefinierte Seiten fallen auf den ersten VHost oder den mit _default_ bezeichneten VHost zurück.

    In der linux-mobil.net.conf-Datei werden dann die folgenden Zeilen (den ganzen anderen Quatsch mal weggelassen) hineingeschrieben:
    <VirtualHost www.linux-mobil.net>
            ServerName www.linux-mobil.net
            ServerAlias linux-mobil.net

    DocumentRoot /var/www/linux-mobil.net/htdocs/
            <Directory /var/www/linux-mobil.net/htdocs/>
                    Order deny,allow
                    allow from all
            </Directory>
    </VirtualHost>

    Würde ich so nicht machen - verwende lieber:

    <VirtualHost *:80>

    Oder - wenn 123.456.789.0 die IP deines Server ist:

    <VirtualHost 123.456.789.0:80>

    Aus optischen Gründen und weil du die Datei linux-mobil.net genannt hast, würde ich dann noch die Werte von ServerName und ServerAlias miteinander vertauschen ;-)

    Nun werden allerdings alle Zugriffe auf meinen Testserver verweigert, auch die auf www.linux-mobil.net.

    Möglicherweise das bereits erwähnte Phänomen: Wenn du einen VHost anlegst, existiert der globale Server nicht mehr - und da dein VHost oben vermutlich fehlerhaft konfiguriert ist, nimmt der Server eben gar nichts mehr an.

    Desweiteren stelle bitte sicher, dass - am besten irgendwo am Ende der apache2.conf, BEVOR die VirtualHosts included werden eine der folgenden Zeilen steht:

    NameVirtualHost *
    NameVirtualHost *:80
    NameVirtualHost 123.456.789.0
    NameVirtualHost 123.456.789.0:80

    Ich persöhnlich würde die erste oder zweite Methode bevorzugen - wenn du eine der letzten Methoden verwendest, MUSS der VirtualHost mit <VirtualHost 123.456.789.0> definiert sein, andernfalls kannst du <VirtualHost *:80> (also mit Wildcard) verwenden.

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
    Patch zur Verwendung von PATHINFO in JLog
    Was ich genau weiß, ist, dass es keinen Sinn hat darüber nachzudenken. Male dir neunundneunzig Variationen aus und du stolperst in Szenario Nummer hundert. (Andreas Steinhöffel, Die Mitte der Welt)
    1. Hallo Dennis,

      dein Post war sehr hilfreich, vielen Dank! Darauf, dass es einen "_default_"-Host geben könnte, bin ich noch gar nicht gekommen. So ist die Konfiguration optimal. Nun denn, bald mach ich mich an suEXEC ran. *g*

      Grüße

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)