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.
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).
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.
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
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
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.
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.
Der Host muss nicht auf Pings antworten, Sie müssen keine ICMP-Echos zulassen.
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
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.
Cédric Martin