Stellen Sie einige Firewall-Ports so ein, dass nur lokale Netzwerkverbindungen akzeptiert werden.

18

Wie richte ich die Firewall auf einem System in einem LAN ein, sodass einige Ports nur für Verbindungen vom lokalen Netzwerk und nicht von der Außenwelt geöffnet sind?

Ich habe zum Beispiel eine Box mit Scientific Linux 6.1 (eine RHEL-basierte Distribution) und möchte, dass ihr SSH-Server nur Verbindungen von localhost oder LAN akzeptiert. Wie mache ich das?

hpy
quelle

Antworten:

24

Wenn die Iptables des Kernels vollständig leer sind ( iptables -F), wird dies tun, was Sie fragen:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Dies besagt, dass alle LAN-Adressen mit TCP-Port 22 kommunizieren dürfen, dass localhost die gleiche Überlegung erhält (ja, 127. * nicht nur 127.0.0.1) und dass Pakete von jeder anderen Adresse, die nicht mit diesen ersten beiden Regeln übereinstimmen, kurzerhand abgelegt werden der kleine Eimer . Sie können REJECTanstelle von DROPeine aktive Zurückweisung (TCP RST) verwenden, anstatt TCP-Port 22 zu einem schwarzen Loch für Pakete zu machen.

Wenn Ihr LAN den 192.168.0. * -Block nicht verwendet, müssen Sie natürlich die IP-Adresse und die Maske in der ersten Zeile ändern, um sie an das IP-Schema Ihres LAN anzupassen.

Diese Befehle tun möglicherweise nicht das, was Sie möchten, wenn in Ihrer Firewall bereits einige Regeln konfiguriert sind. (Sagen Sie dies iptables -Lals root, um es herauszufinden.) Es kommt häufig vor, dass eine der vorhandenen Regeln die Pakete erfasst, die Sie filtern möchten, sodass das Anhängen neuer Regeln keine Auswirkungen hat. Während Sie verwenden können , -Istatt -Amit dem iptablesBefehl neuen Regeln in der Mitte einer Kette spleißen , anstatt sie anhängt, dann ist es in der Regel besser, um herauszufinden , wie die Ketten beim Systemstart bevölkert bekommen und das Verfahren zu ändern , so immer Ihre neuen Regeln in installiert werden die richtige Reihenfolge.

RHEL 7+

Bei neueren RHEL-Systemen ist dies am besten über die Verwendung firewall-cmdder entsprechenden GUI möglich. Hiermit wird dem firewalldDaemon des Betriebssystems mitgeteilt, was Sie möchten. Dies ist das, was tatsächlich aufgefüllt und bearbeitet wird, was Sie über sehen iptables -L.

RHEL 6 und früher

Auf älteren RHEL-Systemen können Sie die Firewall-Ketten am einfachsten bei der Bestellung ändern, indem Sie sie bearbeiten /etc/sysconfig/iptables. Die GUI- und TUI-Firewall-Tools des Betriebssystems sind recht simpel. Wenn Sie also anfangen, komplexere Regeln wie diese hinzuzufügen, ist es besser, zu guten alten Konfigurationsdateien zurückzukehren. Beachten Sie, dass Sie Ihre Änderungen verlieren können, wenn Sie jemals die Firewall-Tools des Betriebssystems verwenden, um die Konfiguration zu ändern, da dieses möglicherweise nicht weiß, wie es mit handgefertigten Regeln wie diesen umgeht.

Füge so etwas zu dieser Datei hinzu:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Wo Sie es hinzufügen, ist das schwierige Stück. Wenn Sie in dieser Datei eine Zeile finden, von der die Rede ist --dport 22, ersetzen Sie sie einfach durch die drei obigen Zeilen. Andernfalls sollte es wahrscheinlich vor der ersten vorhandenen Zeile mit der Endung enden -j ACCEPT. Im Allgemeinen müssen Sie sich mit der Funktionsweise von iptables vertraut machen. An diesem Punkt ist die richtige Einfügemarke offensichtlich.

Speichern Sie diese Datei und sagen Sie dann, dass Sie service iptables restartdie Firewall-Regeln neu laden möchten. Stellen Sie sicher, dass Sie dies tun, während Sie in der Konsole angemeldet sind, falls Sie die Änderungen fetten! Sie möchten sich nicht von Ihrem Computer ausschließen, während Sie über SSH angemeldet sind.

Die Ähnlichkeit zu den obigen Befehlen ist kein Zufall. Der größte Teil dieser Datei besteht aus Argumenten für den iptablesBefehl. Die Unterschiede zu den oben genannten bestehen darin, dass der iptablesBefehl gelöscht wird und der INPUTKettenname zur speziellen RHEL-spezifischen RH-Firewall-1-INPUTKette wird. (Wenn Sie die Datei genauer untersuchen möchten, sehen Sie weiter oben in der Datei, wo sie die INPUTKette im Wesentlichen umbenannt haben . Warum? Kann ich nicht sagen.)

Warren Young
quelle
4

Das Low-Level-Tool für die Firewall-Einrichtung unter Linux ist iptables . Es stehen auch übergeordnete Tools zur Verfügung. Ich weiß nicht, ob Scientific Linux ein empfohlenes Firewall-Tool hat.

Laut dieser Webseite (ich habe nicht überprüft, dass sie für 6.1 gilt) service iptables savewerden die aktuellen Firewall-Regeln gespeichert und diese gespeicherten Regeln werden beim Booten geladen. Sie müssen also die gewünschten Regeln mithilfe von iptablesBefehlen (oder auf andere Weise) einrichten und dann ausführen service iptables save, um die Einrichtung dauerhaft zu machen.

Der Blog-Beitrag von Scott Pack ist ein Anfang für das Verwerfen von "Oddball" -Paketen, die normalerweise nicht benötigt werden und ein hohes Risiko aufweisen, Teil eines Angriffs zu sein. Darüber hinaus möchten Sie alle eingehenden Ports schließen und nur die Ports öffnen, die Sie benötigen. Etwas wie das:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Gilles 'SO - hör auf böse zu sein'
quelle
1
Gilles, hast du die Frage nicht ein bisschen falsch verstanden? Ich verstehe, dass die Scientific Linux-Box einer der Computer im LAN ist, aber nicht die Firewall.
Rozcietrzewiacz
@ Gilles Ja, die Box ist einer der Computer im LAN.
HPY
@rozcietrzewiacz Ich verstehe, dass sich die Firewall auf demselben Computer wie der Server befindet. Ich stimme zu, dass die Frage bis zu einem gewissen Grad nicht eindeutig ist, aber da Penyuan nur das Betriebssystem einer Maschine erwähnte, gehe ich davon aus, dass alles auf dieser Maschine geschieht. Andernfalls wäre dies keine Unix-Frage, sondern eine unterbestimmte Frage für den Netzwerkadministrator.
Gilles 'SO - hör auf böse zu sein'
1

Der bevorzugte Weg ist mit iptables. Es sieht so aus, als ob dies von anderen hinreichend abgedeckt wurde. Aus Gründen der Vollständigkeit werde ich daher auf eine alternative Zugriffskontrollmethode hinweisen, die für viele Daemons in den meisten Linux-Distributionen verfügbar ist. Diese Zugriffskontrollmethode wird von der libwrapBibliothek bereitgestellt .

libwrapFühren Sie die folgenden Schritte aus , um zu überprüfen, ob Ihr Lieblingsdämon Unterstützung bietet:

ldd `which sshd` | grep libwrap

Wenn Sie ein nicht leeres Ergebnis erhalten, wie z

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

dann bist du definitiv gut zu gehen.

Es ist fast eine Gewissheit, dass Ihr sshdDaemon libwrapUnterstützung hat. Daher sollte er die /etc/hosts.allowund /etc/hosts.deny-Dateien zur Zugriffskontrolle konsultieren . Angenommen, Ihr lokales LAN-Netzwerk ist 192.168.100.0/24, können Sie den Zugriff auf sshdalle Clients mit Ausnahme der Clients auf dem lokalen Host oder im lokalen LAN verweigern , indem Sie Folgendes in Ihre /etc/hosts.denyDatei einfügen:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Beachten Sie, dass diese Methode an sich keine Ports öffnet oder schließt. Es teilt Dämonen, die diese Methode der Zugriffssteuerung verwenden, einfach mit, ob Verbindungsversuche von Clients akzeptiert oder abgelehnt werden sollen, die den angegebenen Mustern entsprechen.

Ausführliche Informationen finden Sie auf den Manpages, beginnend mit hosts_access(5).

Steven Montag
quelle
1

Wenn Sie eine eigene Linux-basierte Firewall haben, richten Sie diese am besten ein iptables, wie andere hier beschreiben. Wenn dies nicht der Fall ist und die Firewall Ihr Router ist, verhindert die Standardkonfiguration höchstwahrscheinlich bereits den Zugriff von außen, es sei denn, Sie aktivieren ausdrücklich die Portweiterleitung (wie ich kürzlich in der Antwort auf diese Frage beschrieben habe ).

Für zusätzliche Sicherheit können Sie darüber hinaus ein separates Subnetz für In-LAN-Verbindungen verwenden. Fügen Sie dazu für jeden Computer eine zweite IP-Adresse hinzu, die nur im LAN und nicht vom Router verwendet wird. Angenommen, das gesamte LAN verwendet jetzt 192.168.0.xxxAdressen und der Router (Gateway, Firewall) ist 192.168.0.1. Fügen Sie also für jeden Computer eine zweite Adresse hinzu - zum Beispiel:

ifconfig eth0:0 192.168.5.1/24

Bearbeiten Sie als Nächstes die sshdKonfiguration, um nur diese Adresse zu verwenden (damit keine Verbindungen hergestellt werden können 192.168.0.xxx). Bearbeiten /etc/ssh/sshd_configund ändern Sie sie ListenAddressin das neue Subnetz ( 192.168.5.1im obigen Beispiel). Das ist es! Wenn Sie das Gateway nicht so konfigurieren, dass die Kommunikation dieses Subnetzes weitergeleitet wird, sollte es von außen getrennt sein.

rozcietrzewiacz
quelle