firewall – Finn Christiansen https://blogarchive.finnchristiansen.de Softwareentwickler mit einer Vorliebe für freie Software und GNU / Linux Sat, 08 Dec 2018 16:50:58 +0000 de-DE hourly 1 https://wordpress.org/?v=5.1.1 https://blogarchive.finnchristiansen.de/wp-content/uploads/2017/01/cropped-FinnsBlog512-32x32.png firewall – Finn Christiansen https://blogarchive.finnchristiansen.de 32 32 Firewallkonfiguration unter Debian und Ubuntu mit IPTables https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/ https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/#comments Sun, 24 Apr 2016 08:50:39 +0000 https://www.finnchristiansen.de/?p=70 Continue reading ]]> Häufig sehe ich Server, die gar keine Firewall verwenden. In einem kleinen internen Netz mag das vielleicht noch vertretbar sein, aber spätestens wenn der Server öffentlich erreichbar ist, sollte man sich Gedanken um eine Firewall machen. Für viele ist das zwar selbstverständlich ein alter Hut, aber viele Dienste laufen gedankenlos auf der Listen-Adresse 0.0.0.0 bzw. :: und sind damit bei Verwendung einer öffentlichen IP-Adresse oder NAT ohne Firewall für jedermann erreichbar.

Um die IPTables Firewall unter Debian oder Ubuntu zu konfigurieren, verwende ich iptables-persistent. Die Firewall-Regeln werden dabei in Textdateien gespeichert und beim Starten geladen. Nach der Installation von iptables-persistent besteht die Möglichkeit, bereits vorhandene Regeln zu speichern, was zu empfehlen ist, da somit schon eine grundlegende Konfiguration erstellt wird. Die Installation selbst ist simpel:

apt-get intall iptables-persistent

Anschließend wird jeweils eine Datei für IPv4 und IPv6 angelegt. Anbei eine einfache Beispielkonfiguration, die entsprechend den eigenen Bedürfnissen erweitert werden kann:

# Generated by iptables-save v1.4.21 on Mon Mar  7 18:13:53 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

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

# HTTP(S)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# NRPE (monitoring)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5666 -s 78.46.251.28/32 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Mar  7 18:13:53 2016

Die Ketten INPUT, FORWARD und OUTPUT akzeptieren standardmäßig alle Verbindungen. Eingehender, zu anderen Verbindungen gehörender Verkehr (RELATED,ESTABLISHED) wird ebenfalls durchgelassen. Ebenso werden ICMP Pakete (Ping, -p icmp) aktzeptiert und auch Verbindungen zum lokalen Loopback Interface.

Dann werden die TCP Ports 22, 80 und 443 akzeptiert. Der Port 5666, auf welchem der NRPE Dienst hört, soll nur von einer IP Adresse erreichbar sein. Anschließend werden alle nicht vorher definierten eingehende und weiterzuleitende Verbindungen abgelehnt (-j REJECT –reject with icmp-host-prohibited). Alternativ können diese Zeilen entfernt werden, falls man die INPUT und FORWARD Kette standardmäßig auf REJECT stellt. Im Falle eines Fehlers in der Konfiguration ist es aber dann notwendig, physikalischen Zugriff auf den Server zu haben, da eventuell alle Verbindungen abgelehnt werden. Die Art der Konfiguration ist aber Geschmackssache, das Ergebnis ist gleich.

Für IPv6 sollen normalerweise etwa die gleichen Regeln gelten, ein paar Parameter (natürlich IPv6 anstatt IPv4 Adressen verwenden oder icmp6-adm-prohibited statt icmp-host-prohibited) müssen aber ausgetauscht werden. Das Ergebnis ist vergleichbar:

# Generated by iptables-save v1.4.21 on Mon Mar  7 18:13:53 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

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

# HTTP(S)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# NRPE
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5666 -s 2a01:4f8:c17:34ab::2/128 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT
# Completed on Mon Mar  7 18:13:53 2016

Diese Regeln sind recht schlicht, aber schon ein sehr brauchbarer Anfang. Zusätzlich können noch ausgehende Verbindungen eingeschränkt werden, falls dies gewünscht ist. Spätestens wenn Datenbanken oder ähnlich sensible Dienste über Netzgrenzen hinweg erreichbar sein sollen, sollte definitiv zumindest irgendeine Art Firewall eingesetzt werden.

]]>
https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/feed/ 2