IPTABLES: Verweigern Sie allen außer einer kleinen Liste von IPs den Zugriff auf die Domäne

IPTABLES: Verweigern Sie allen außer einer kleinen Liste von IPs den Zugriff auf die Domäne

Ich habe ein paar öffentliche Webserver und einige Ubuntu-Rechner zu Hause. Ich verwalte ein paar Domänen speziell zur Überwachung von Dingen wie MySQL und Memcache. Im Idealfall könnte ich von meinen Heimrechnern aus eine Verbindung zu MySQL, Memcache usw. herstellen und allen anderen den Zugriff verweigern.

Meine Iptables sind derzeit also:

ACCEPT     tcp  --  home ip              0.0.0.0/0            tcp dpt:3306
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     all  --  server 1 ip          0.0.0.0/0
ACCEPT     all  --  server 2 ip          0.0.0.0/0
ACCEPT     all  --  server 3 ip          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Ich möchte meine iptables so erweitern, dass ich von zu Hause aus auf alles zugreifen kann. Ich denke, es ist wahrscheinlich eine gute Vorgehensweise, für jeden gewünschten Port eine Zeile für meine Heim-IP hinzuzufügen, anstatt meiner Heim-IP Zugriff auf jeden Port zu gewähren. Aber vielleicht ist das auch egal. Außerdem möchte ich Dinge wie phpMemcachedAdmin ausführen, ohne ein Passwort zu benötigen.

Ich habe also ein paar Google-Suchen durchgeführt, um herauszufinden, wie ich der ganzen Welt den Zugriff auf eine Domain verweigern kann. Ich habe mir überlegt, dass ich eine Zeile einfüge, die meine IP auf Port 80 zulässt, direkt über der Zeile, die der ganzen Welt den Zugriff auf die Domain verweigert, und (Daumen drücken) sollte ich alle außer mir blockieren.

In den Beiträgen, die ich bei meinen Google-Suchen gesehen habe, hieß es, man könne eine Domain über -m string "Host: domain.com"oder über blockieren --string "domain.com". Beides scheint nicht zu funktionieren. Folgendes habe ich versucht:

sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP

Bei den ersten beiden tritt ein Fehler mit dem ungültigen Argument „Host: …“ auf und beim letzten ein Fehler mit der unbekannten Option „--string“.

Um die Sache noch ein wenig komplizierter zu machen, ist meine private IP dynamisch und nicht statisch. Daher wäre es schön (aber nicht unbedingt erforderlich), wenn ich meine private IP über eine von mir eingerichtete DynDNS-Domäne zulassen könnte. Ich habe ein Skript zum Stoppen und Starten von iptables, sodass ich es bei Bedarf jederzeit stoppen und neu starten kann, um die Aktualisierung der IP zu erzwingen. (Ich habe an mehreren Stellen gelesen, dass iptables nur beim Start nach einer IP für die Domäne sucht.)

Ich freue mich auch über sicherheitsrelevante Hinweise zur Verwendung von iptables für Ihren Standard-Webserver.

Danke


17.03.14 Ergänzungen: Ich habe den Syntaxfehler in meiner iptables-Zeile gefunden – es -m stringsollte lauten -m string --string. Jetzt sieht es so aus, als ob iptables die Domäne erkennt, von der ich Leute fernhalten möchte. Das Problem war dann jedoch die Reihenfolge der iptables-Regeln.

Meine neuen iptables wurden:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_for_matching" ALGO name bm TO 65535
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Die Idee wäre, meine IP vor dem DROP abzufangen, der mit der Zeichenfolge übereinstimmt. Wenn der DROP die erste Zeile ist, wird er abgefangen und ich erhalte einen 502-Fehler. Wenn die iptables jedoch so sind, wie ich sie aufgelistet habe, kommen die Anfragen durch – meine Heim-IP ist noch nicht in der Regeltabelle.

Die Version, die funktioniert, sieht so aus:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
ACCEPT     all  --  My Home IP           0.0.0.0/0
ACCEPT     all  --  My Laptop IP         0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_to_match" ALGO name bm TO 65535
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Ich konnte meine dynamischen IPs einbinden, indem ich einfach ihren DynDNS-Domänennamen anstelle einer IP verwendete.

Dies könnte wahrscheinlich die Antwort sein, ich hätte jedoch gern einige Ratschläge zur besten Vorgehensweise im Hinblick auf dieses Problem.

verwandte Informationen