Apache 2: Authentifizierungsmethoden über Source-IP steuern

Mit den normalen Bordmitteln des Apache2 ist es aktuell nicht möglich, zwei verschiedene Authentifizierungsmethoden zu verwenden. Gebrauchen kann man das aber beispielsweise sehr gut, wenn man einen webbasierten Dienst hat, welchen man für das interne Firmennetzwerk gegen LDAP und von extern über MOTP authentifizieren lassen möchte. Vorteil ist dabei, dass die nach außen offene Seite nicht durch Bruteforce-Attacken “gehackt” werden kann.
Um diese Unterscheidung der Netze zu realisieren, wird eine iptables-Regel eingerichtet, welche alle Anfragen einer bestimmten Quelle auf einen anderen Port umleitet. Zusätzlich muss noch ein VHost angelegt werden, welcher auf diesem Port lauscht und die gewünschte Authentifizierung anbietet.
Ein kleines Praxisbeispiel:
Ich möchte, dass alle Anfragen, welche von extern kommen, gegen MOTP authentifiziert werden. Dafür lege ich einen VHost an, der auf Port 80 lauscht und MOTP als Authentifizierung anbietet.
Mein internes Netz, welches durch NAT nur eine IP (1.2.3.4) nach außen besitzt, soll sich gegen LDAP authentifizieren. Dafür lege ich ebenfalls einen VHost an, der auf Port 81 lauscht.
Nun leite ich den Verkehr, der von meinem Router des internen Netzes (IP 1.2.3.4) kommt auf Port 81 um. Da ich nicht will, dass alle Anfragen umgeleitet werden, weil ich noch mehrere Seiten auf meinem Server betreibe, habe ich zusätzlich den “LDAP-VHost” auf die IP 127.0.0.2 gebunden.
Jetzt richte ich meine iptables-Regel ein:

iptables -t nat -A PREROUTING -s 1.2.3.4 -d 127.0.0.2 \
                -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 81

Nun werden alle Anfragen wie gewünscht umgeleitet. Mit iptables-save kann ich mir die aktuellen Einstellungen ausgeben lassen und sie später per init-Skript wieder mit aufnehmen. Somit sind die Einstellungen auch “rebootfest”. Wichtig sei noch zu erwähnen, dass pro VHost eine eigene, externe IP benötigt wird.

Einfache Lastverteilung unter Linux ohne Loadbalancer

Wer eine einfache und robuste Methode zur Lastverteilung seines Netztraffics sucht, wird bei netfilter fündig. Mit dem Target CLUSTERIP lässt sich auf einfachste Weise ein mehrere Knoten umfassender Cluster aufbauen. Zum Verfahren: Es findet eine gemeinsame IP-Adresse auf allen Knoten Verwendung und wird dort auch aufgesetzt, so dass nun alle Knoten auf diese Adresse antworten könnten. Da dies natürlich zu Verwirrungen bei ARP-Anfragen vom anfragenden Host bzw. Router führt, verwendet CLUSTERIP eine Multicast MAC für die Cluster-IP-Adresse. D.h. eingehende Pakete werden auf allen beteiligten Knoten empfangen. Damit nun aber nicht jeder Knoten auf die Anfrage antwortet, verwendet CLUSTERIP einen Hash über wahlweise die Source-IP, Source-IP und -Port oder Source-IP,-Port und Destination-Port, um zu entscheiden, ob er auf die Anfrage antworten darf. Somit ist auch keine Kommunikation der Knoten untereinander nötig, um zu entscheiden wer der “richtige” Knoten ist.
Hier nun ein kleines Beispiel, eines Webclusters, bestehend aus den beiden Knoten node1 und node2. Es reichen jeweils zwei Kommandos aus, den Cluster zu erzeugen.
Kommandos auf node1:
root@node1# iptables -A INPUT -i eth1 -d 192.168.56.20 -p tcp –dport 80 -j CLUSTERIP –new –hashmode sourceip –clustermac 01:23:45:67:89:AB –total-nodes 2 –local-node 1
root@node1# ifconfig eth1:0 192.168.56.20/24 up
Analog ist auf node2 mit
root@node2# iptables -A INPUT -i eth1 -d 192.168.56.20 -p tcp –dport 80 -j CLUSTERIP –new –hashmode sourceip –clustermac 01:23:45:67:89:AB –total-nodes 2 –local-node 2
root@node2# ifconfig eth1:0 192.168.56.20/24
die Konfiguration abgeschlossen. Die Destination-Adresse ist die geimeinsame IP, wir verwenden in diesem Beispiel nur die Source-IP als Hash. Da in diesem Beispiel auf beiden Konten das gleiche Interface eth1 werwendet wird, unterscheiden sich die beiden Befehle lediglich in der Option  –local-node, welche die “Position” im Cluster bestimmt bzw. um den wievielten Knoten es sich handelt. Dies kann nun auch mit
root@node1# cat /proc/net/ipt_CLUSTERIP/192.168.56.20
dem Kernel entnommen werden. Hier steht also drin, für was der jeweilige Host zuständig ist. Möchte man nun z.B. node1 aus dem Cluster herausnehmen, muss man dies über eine Konfiguration auf beiden Hosts vornehmen.
root@node1# echo “-1” > /proc/net/ipt_CLUSTERIP/192.168.56.20
root@node2# echo “+1” > /proc/net/ipt_CLUSTERIP/192.168.56.20

Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.