[LINUX] Verwendung von iptables

Einführung

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.

Einstellungsbeispiel

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

Kommentar

Politik

*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.

Schleife zurück

#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.

SSH-Server

#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.

DNS-Client

#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.

Reflexion der Einstellungen

Bitte starten Sie iptables neu. Wenn Sie systemd wie Arch Linux verwenden:

# systemctl restart iptables

Recommended Posts

Verwendung von iptables
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Wie man Shogun benutzt
Verwendung von Pandas 2
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
Verwendung von Qt Designer
Verwendung der Suche sortiert
[gensim] Verwendung von Doc2Vec
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
[Python] Verwendung von Liste 1
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
Wie man Pandas Rolling benutzt
Verwendung von Redispy-Wörterbüchern
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
[Go] Verwendung von "... (3 Perioden)"
So bedienen Sie GeoIp2 von Django
[Python] Verwendung von input ()
Wie benutzt man den Dekorateur?
[Einführung] Verwendung von open3d
Wie benutzt man Python Lambda?
So verwenden Sie Jupyter Notebook
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
So verwenden Sie Google Colaboratory
Verwendung von Python-Bytes
Verwendung von cron (persönliches Memo)
Python: So verwenden Sie Async mit
Verwendung des optparse-Moduls
Wie man SWIG von waf benutzt