Gute iptables-Regelsätze für IPv4 und IPv6 in Geth Ethereum Node

Derzeit verwende ich die folgenden iptables-Regeln für meinen entfernten (Server-) Geth-Knoten:

V4

*filter

# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT

# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Allow TCP and UDP connections from anywhere
-A INPUT -p tcp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30301 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied.
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7

# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding.
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT

V6

*filter

# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT

# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Allow TCP and UDP connections from anywhere
-A INPUT -p tcp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30303 -m state --state NEW -j ACCEPT
-A INPUT -p udp --dport 30301 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied.
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7


# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding.
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT

Gibt es eine Möglichkeit, die Regeln sicherer zu machen? Außerdem würde ich gerne wissen, ob die gleichen gut genug für einen Paritätsknoten sind.

+1, tolle Frage. Ich würde auch gerne wissen, ob dies weiter auf den Benutzer beschränkt werden kann, der den Geth - Client ausführt (z. B. mit so etwas wie den Regeln -m owner --uid-owner ... iptables).

Antworten (2)

Netzwerksicherheit ist nicht mein Spezialgebiet, aber ich dachte, ich würde ein Feedback zu dem geben, was mir offensichtlich erscheint.

  • Es könnte gut sein, ein VPN für sich selbst einzurichten. Im Allgemeinen ist es am besten, Datenverkehr von nicht vertrauenswürdigen Quellen einfach blind abzulehnen. Wenn sie keine Verbindung zu Ihrem Server herstellen können, ist es viel schwieriger, auf Schwachstellen zu testen. Sobald dies konfiguriert ist, können Sie Ihre SSH-Regel strenger machen mit:

    sudo iptables -A INPUT -p tcp -s $vpn_connection --dport 80 -j ACCEPT # erlaubt alle TCP-Verbindungen von $vpn_connection zu Port 80

  • Dies ist nur eine allgemeine Regel, um Sie vor sich selbst zu schützen. Sie können wählen, ob Sie sie hinzufügen möchten oder nicht. Diese Regel besagt im Grunde, dass jede neue Regel, die Sie hinzufügen, keine bestehenden Verbindungen trennt (d. h. wenn Sie versehentlich eine Regel hinzufügen, die Ihre eigene aktive SSH-Verbindung trennt):

    sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # verhindern, dass hinzugefügte Regeln bestehende Verbindungen trennen

Was die allgemeinen Anmerkungen betrifft, gefällt mir, dass Sie Ihren Regelsatz mit einem Drop-Befehl für alle verbleibenden Anfragen beendet haben. Abgesehen davon kann ich nicht mehr betonen, wie wichtig es ist, ein VPN einzurichten, um SSH und andere sichere Verbindungen einzuschränken. Viel Glück und hoffentlich kann mich jemand anderes für alles kritisieren, was ich vergessen habe (ich würde es zu schätzen wissen).

Hey, danke für die Antwort, zwei Fragen zu deinem Vorschlag. VPNs neigen dazu, Verbindungen abzubrechen, was zwar sehr ungewöhnlich, aber möglich ist. Besteht die Möglichkeit, in diesem Fall von meiner eigenen Instanz isoliert zu bleiben, d. h. der Server kann sich nicht wieder mit dem VPN verbinden? Und zweitens, die zweite Regel, wenn sie enthalten wäre, wo genau wäre ein guter Platz in Bezug auf die restlichen Regeln, ganz unten?

Es gab viele gute Antworten und Vorschläge zu diesem Reddit-Thread , die ich versuchen werde, zusammenzufassen.

Iptables-Regeln allein reichen bei einem großen oder organisierten Angriff nicht aus, das Rechenzentrum muss über einen angemessenen DDoS-Schutz in seinem Netzwerk verfügen. Dies ist von größter Bedeutung im Umgang mit DDoS-Angriffen.

  • Alle Anfragen löschen / Beginnen Sie mit einer standardmäßigen DROP-Richtlinie

Es ist eine gute Strategie, mit einer standardmäßigen DROP-Richtlinie zu beginnen und einfach alles Notwendige auf die Whitelist zu setzen.

Eine gute Empfehlung ist, alle Anfragen zu verwerfen, außer denen, die der Server zu empfangen oder zu machen erwartet. Eine weitere gute Idee ist es, Port 0 explizit fallen zu lassen, einige Angriffe machten sich das zunutze, da einige DDoSer den Angriff auf diesen Port immer noch umgehen konnten. Es ist nicht sicher, ob dies nur ein Problem ist, das ältere iptables/Betriebssysteme geplagt hat.

Ein Beispiel für solche Regeln ist wie folgt:

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 30303 -j ACCEPT
iptables -A INPUT -p udp --dport 30303 -j ACCEPT

iptables -P FORWARD DROP

.. etc

  • Verwenden von netstat, um zu sehen, welche Ports pro Dienst benötigt werden

Zusätzlich zu einer "DROP"-Richtlinie ist es ein guter Ansatz, netstat zu verwenden, um Ports einzubeziehen, die für beliebige Dienste benötigt werden, und sie in die iptables-Regeln aufzunehmen. In diesem Beispiel schließen wir zusätzlich zu den Ports von Geth die Daemons-Ports von Bitcoin und Litecoin-Client ein

#!/bin/bash
IPT="/sbin/iptables"
# This is the iptables script that will be loaded through a cronjob, every time the system boots. 
# First we will flush old rules and then fill iptables with policies and rules specified below.
# Iptables on
systemctl start iptables
# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

### POLICIES ###
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP

### INPUT RULES ###
# accept local port use, for example so you can use json-rpc on the    servers cli
$IPT -A INPUT -i lo -j ACCEPT
# accept other nodes data reply in case for example a peer request your Geth made to another node
$IPT -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
# ssh from your home
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# accept your local crypto daemons to receive connections
# Bitcoin
$IPT -A INPUT -p tcp --dport 18333 -s 0.0.0.0/0 -j ACCEPT
# Litecoin
$IPT -A INPUT -p tcp --dport 19333 -s 0.0.0.0/0 -j ACCEPT
# Go-Ethereum (Geth)
$IPT -A INPUT -p tcp --dport 30303 -s 0.0.0.0/0 -j ACCEPT
  • Akzeptieren Sie SSH nur von Ihrer Heim-IP-Adresse

Etwas Ähnliches tun:

$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s [your home ip]/32 -j ACCEPT

Um den Zugriff auf alle Personen zu beschränken, mit Ausnahme eines Benutzers, der Ihre Privatadresse verwendet, kann der unerwünschte Zugriff eingeschränkt werden. Warnung ISPs können Ihre IP-Adresse ohne vorherige Benachrichtigung ändern, was Ihren Zugriff auf Ihren Remote-Server unmöglich macht. Erwägen Sie, es nur zu verwenden, wenn Sie eine feste IP-Adresse haben oder wenn Sie dies über das Bedienfeld oder die Konsole (z. B. AWS) tun können.

  • Ändern des Standard-SSH-Ports

Eine weitere Empfehlung ist, den Standard-SSH-Port auf etwas Zufälliges zu ändern, viele chinesische Server versuchen, den Standardport brutal zu erzwingen. Es ist eine gute Idee, sicherzustellen, dass auch eine Ratenbegrenzung für die Versuche vorhanden ist.

  • Ping verbieten

Der Host muss nicht auf Pings antworten, Sie müssen keine ICMP-Echos zulassen.

  • Fügen Sie SSH ein VPN hinzu

Es könnte gut sein, ein VPN für sich selbst einzurichten. Man kann die SSH-Regel strenger machen mit:

sudo iptables -A INPUT -p tcp -s $vpn_connection --dport 80 -j ACCEPT # allow all tcp connections by $vpn_connection to port 80
  • Fügen Sie eine Regel hinzu, um Sie vor sich selbst zu schützen

Dies ist nur eine allgemeine Regel, um den Host vor Ihnen selbst zu schützen. Diese Regel besagt im Grunde, dass jede neue Regel, die Sie hinzufügen, keine bestehenden Verbindungen trennt (d. h. wenn Sie versehentlich eine Regel hinzufügen, die Ihre eigene aktive SSH-Verbindung trennt):

sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # prevent added rules from severing existing connections

Dank an:

Für ihre Antworten und an 5chdn für die Veröffentlichung der Frage auf Reddit.