iptables sind Firewalls, die in den Linux-Kernel integriert sind. Es wird verwendet, um die Kommunikation auf diesem Host einzuschränken oder zu übertragen. Obwohl hier IPv4 angenommen wird, verfügt IPv6 auch über IP6-Tabellen, die fast auf die gleiche Weise verwendet werden können.
Eine ausführliche Erklärung wird später anhand eines Beispiels für die Konfigurationsdatei von iptables gegeben.
/etc/iptables/iptables.rules
#In der Regel ist jede Eingabe und Übertragung untersagt
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#Alle Verbindungen vom Loopback sind zulässig
-A INPUT -i lo -j ACCEPT
#Ermöglicht den Empfang von PING, begrenzt jedoch die Häufigkeit auf ungefähr einmal pro Sekunde pro Client
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_echo --hashlimit-mode srcip --hashlimit-upto 1/s --hashlimit-burst 5 --hashlimit-htable-expire 10000 -j ACCEPT
#Bereits eingerichtete Kommunikation ist unabhängig von der Portnummer zulässig
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#Erlauben Sie SSH-Verbindungen, aber beschränken Sie die Häufigkeit auf ungefähr einmal pro Minute pro Client
-A INPUT -m state --state NEW -m tcp -p tcp --syn --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit-mode srcip --hashlimit-upto 1/m --hashlimit-burst 5 --hashlimit-htable-expire 600000 -j ACCEPT
#Antwortempfang vom DNS-Server zulassen
-A INPUT -p udp --sport 53 -j ACCEPT
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
In der Regel ist jeglicher Paketempfang und jede Weiterleitung verboten, und die Übertragung ist zulässig. Natürlich möchte ich überhaupt keine Pakete empfangen, daher werde ich danach eine Ausnahme für diese Richtlinie festlegen.
#Alle Verbindungen vom Loopback sind zulässig
-A INPUT -i lo -j ACCEPT
Linux kann Sockets verwenden, um zwischen Prozessen sowie mit anderen Hosts zu kommunizieren. Die für einen solchen Host geschlossene Kommunikation wird als Loopback bezeichnet. Wenn Sie die Loopback-Kommunikation einschränken, besteht eine hohe Wahrscheinlichkeit, dass verschiedene Programme nicht normal funktionieren. Daher lassen wir dies uneingeschränkt zu.
Ping
#Ermöglicht den Empfang von PING, begrenzt jedoch die Häufigkeit auf ungefähr einmal pro Sekunde pro Client
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_echo --hashlimit-mode srcip --hashlimit-upto 1/s --hashlimit-burst 5 --hashlimit-htable-expire 10000 -j ACCEPT
Ermöglicht dem Host, auf Ping zu antworten. Die Frequenz ist jedoch als Gegenmaßnahme gegen ICMP-Flut (Ping-Flut) begrenzt, die das System durch das Senden einer großen Anzahl von Pings belastet. Verwenden Sie das Hash-Limit-Modul, um die Häufigkeit zu begrenzen, mit der Pakete empfangen (oder weitergeleitet oder gesendet) werden.
--hashlimit-name
ist der Name der Hash-Tabelle. Da es zur Verwendung dieses Moduls erforderlich ist, den Empfangsverlauf von Paketen aufzuzeichnen, legen Sie den Dateinamen des Speicherziels so fest, dass er sich nicht mit anderen Regeln überschneidet.
--hashlimit-mode
gibt an, in welchen Einheiten die Häufigkeit des Empfangs von Paketen begrenzt ist. Da hier "srcip" eingestellt ist, ist der Empfang von Paketen für jede Quell-IP-Adresse beschränkt. Es gibt andere Flags wie dstip`` srcport`` dstport
. Sie können auch mehrere Flags kombinieren. Wenn Sie diese Option weglassen, begrenzt das gesamte System die Häufigkeit, mit der Pakete empfangen werden, unabhängig von der Quelle oder dem Ziel.
--hashlimit-upto
und --hashlimit-Burst
legen speziell fest, wie oft Pakete empfangen werden dürfen. Um die Bedeutung dieser beiden Einstellungen zu verstehen, ist es hilfreich, die Häufigkeit, mit der Pakete empfangen werden dürfen, mit der Kapazität des Buckets zu vergleichen. Stellen Sie sich vor, Sie müssen einen Liter Wasser aus einem Eimer entfernen, um ein einzelnes Paket zu erhalten. Das System startet mit vollem Eimer, aber wenn nicht genügend Wasser vorhanden ist, kann es keine Pakete empfangen. "--hashlimit-upto 1 / s" bedeutet, dass Sie pro Sekunde 1 Liter Wasser in den Eimer gießen. "--Hashlimit-Burst 5" bedeutet jedoch, dass der Eimer nur 5 Liter Fassungsvermögen hat. Dies bedeutet, dass Sie unabhängig von der Dauer des Zyklus problemlos bis zu fünfmal empfangen können. Sie müssen jedoch warten, bis der Eimer wieder mit Wasser gefüllt ist, um weitere aufeinanderfolgende Pakete zu erhalten.
--hashlimit-htable-expire
gibt das Ablaufdatum des Hash-Tabellendatensatzes in Millisekunden an. Wenn Sie keinen größeren Wert als $ \ frac {hashlimit-Burst} {hashlimit-upto} $ festlegen, wird die Empfangsfrequenz nicht wie erwartet begrenzt. Hier wird mit einem Spielraum ein Wert von 10000 Millisekunden festgelegt, was dem doppelten Berechnungsergebnis (5 Sekunden) entspricht.
TCP
#Bereits eingerichtete Kommunikation ist unabhängig von der Portnummer zulässig
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Lassen Sie nach einmaligem Herstellen einer Verbindung mit TCP jedes Paket an diesem Port empfangen. Die unten beschriebenen SSH-Servereinstellungen erlauben nur Verbindungen zum Server, aber diese Einstellung ermöglicht auch die Kommunikation nach einer erfolgreichen Verbindung über die Firewall.
Sie können auch als Client mit dem oben genannten : OUTPUT ACCEPT [0: 0]
eine Verbindung zum Server herstellen. Dank dieser Einstellung können Sie nach einer erfolgreichen Verbindung Pakete empfangen.
#Erlauben Sie SSH-Verbindungen, aber beschränken Sie die Häufigkeit auf ungefähr einmal pro Minute pro Client
-A INPUT -m state --state NEW -m tcp -p tcp --syn --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit-mode srcip --hashlimit-upto 1/m --hashlimit-burst 5 --hashlimit-htable-expire 600000 -j ACCEPT
Ermöglicht Verbindungen zum TCP-Port 22. Wie bei Ping wird das Hash-Limit-Modul verwendet, um die Häufigkeit von Verbindungen zu begrenzen. Sie können es für andere Zwecke anwenden, indem Sie "--dport 22" in eine andere Portnummer ändern. Ermöglichen Sie beispielsweise die Kommunikation über Port 80 für HTTP und Port 443 für HTTPS. Für HTTP und HTTPS sollte das Hash-Limit-Limit jedoch etwas lockerer eingestellt werden.
#Antwortempfang vom DNS-Server zulassen
-A INPUT -p udp --sport 53 -j ACCEPT
DNS verwendet entweder TCP / UDP oder beides. Für TCP ist : OUTPUT ACCEPT [0: 0]
-A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
bereits zulässig. Es gibt kein Verbindungskonzept für UDP, daher müssen Sie explizit zulassen, dass von Port 53 gesendete Pakete empfangen werden.
Bitte starten Sie iptables neu. Wenn Sie systemd wie Arch Linux verwenden:
# systemctl restart iptables
Recommended Posts