{"id":11116,"date":"2023-11-19T11:07:30","date_gmt":"2023-11-19T10:07:30","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=11116"},"modified":"2023-11-19T11:41:18","modified_gmt":"2023-11-19T10:41:18","slug":"iptables-die-firewall-unter-linux-professionell-konfigurieren","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2023\/11\/19\/iptables-die-firewall-unter-linux-professionell-konfigurieren\/","title":{"rendered":"Iptables &#8211; die Firewall unter Linux professionell konfigurieren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Wie in einem schon bestehenden Artikel versprochen (<em>leider wei\u00df ich nicht mehr in welchem<\/em>) &#8211; hier die professionelle Konfiguration der Firewall unter Linux. Hier wird noch die Konfiguration mit <strong>Iptables<\/strong> beschrieben &#8211; inzwischen ist auch <strong>Nftables<\/strong> vorhanden. Beide Anwendungen k\u00f6nnen zur Konfiguration genutzt werden, die Nftables sind angeblich einfacher zu nutzen &#8211; damit habe ich mich jedoch noch nicht befasst, kommt in einem sp\u00e4teren Artikel. \u00dcbrigens werden die Iptables heute noch immer als Standard etwa auf Cisco-Checkpoints genutzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Zur grunds\u00e4tzlichen Information:<\/strong> Weder die <strong>Iptables<\/strong>, noch die <strong>Nftables<\/strong>, <strong><a href=\"https:\/\/linux-bibel.at\/index.php\/2023\/09\/13\/ufw-die-einfache-firewall-unter-linux\/\" data-type=\"post\" data-id=\"4000\">UFW<\/a><\/strong> oder <strong><a href=\"https:\/\/linux-bibel.at\/index.php\/2023\/09\/13\/gufw-einfache-grafische-firewall-unter-linux\/\" data-type=\"post\" data-id=\"3983\">GUFW<\/a><\/strong> sind die Firewall &#8211; die Firewall unter Linux nennt sich <strong>Netfilter<\/strong>. Alle anderen Anwendungen dienen zur Konfiguration des Netfilters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Netfilter wird mit den Iptables als root am Terminal konfiguriert, hier ist um einiges mehr an Wissen n\u00f6tig, als mit UFW oder gar GUFW. Wichtig auch &#8211; haben Sie bereits eine andere Software zur Konfiguration der Firewall laufen, deaktivieren Sie diese.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Installation der Iptables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unter auf Debian basierenden Linux-Distributionen installieren Sie diese Software zur Konfiguration der Firewall wie \u00fcblich \u00fcber die Paket-Verwaltung durch die Pakete &#8222;<strong>iptables iptables-persistent<\/strong>&#8222;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen des Netfilters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wie der Netfilter arbeitet, mag zu Beginn etwas kompliziert sein &#8211; man versteht es jedoch schnell, wenn man will. Der Netfilter arbeitet mit drei wichtigen Dingen:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tabellen (tables)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Tabellen werden genutzt, um der Firewall (<em>eben dem Netfilter<\/em>) zu zeigen, was zu tun ist &#8211; folgende Tabellen gibt es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>filter<\/strong> &#8211; dies ist die meistgenutzte Tabelle im Home-Bereich, hier werden Ports gesperrt und ge\u00f6ffnet. Um diesen Bereich werden wir uns in diesem Artikel aus k\u00fcmmern.<\/li>\n\n\n\n<li><strong>nat<\/strong> &#8211; die Tabelle, um Ports weiterzuleiten, etwa auf andere Computer.<\/li>\n\n\n\n<li><strong>mangle<\/strong> &#8211; hier lassen sich Datenpakete manipulieren.<\/li>\n\n\n\n<li><strong>raw<\/strong> &#8211; hier lassen sich unter anderem Ausnahmen festlegen.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Regelketten (chains)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In den Regelketten legen Sie fest, wann eine Regel zutreffen soll &#8211; Regelketten liegen wiederum in den Tabellen (<em>tables<\/em>), in diesem Beitrag also nur in der Tabelle &#8222;<em>filter<\/em>&#8222;. Folgende Regelketten gibt es (<em>es gibt noch weitere, diese sind jedoch sehr speziell<\/em>):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>INPUT<\/strong> &#8211; in dieser Regelkette legen Sie fest, was mit eingehenden Datenpaketen geschehen soll.<\/li>\n\n\n\n<li><strong>OUTPUT<\/strong> &#8211; diese Regelkette dient dazu, festzulegen, was mit ausgehenden Datenpaketen passieren soll.<\/li>\n\n\n\n<li><strong>FORWARD<\/strong> &#8211; die Regelkette f\u00fcr an andere Computer weiterzuleitende Pakete.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Ziele (targets)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ziele liegen wieder in den gerade vorgestellten Regelketten &#8211; sie dienen dazu, was mit entsprechenden Paketen geschehen soll. Folgende Ziele k\u00f6nnen Sie nutzen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ACCEPT<\/strong> &#8211; das Datenpaket wird in das System gelassen.<\/li>\n\n\n\n<li><strong>DROP<\/strong> &#8211; das Datenpaket wird nicht in das System gelassen, also gesperrt.<\/li>\n\n\n\n<li><strong>REJECT<\/strong> &#8211; wie DROP, jedoch wird hier der Sender des Paketes \u00fcber die Sperre informiert.<\/li>\n\n\n\n<li><strong>LOG<\/strong> &#8211; egal was mit dem Paket zuvor auch gemacht wird, es wird in die Logdatei der Firewall geschrieben.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regeln erstellen<\/h3>\n\n\n\n<p class=\"has-luminous-vivid-orange-background-color has-background wp-block-paragraph\"><strong>Wichtig:<\/strong> egal, was auch immer Sie vorhaben &#8211; wenn Sie auf einen Computer keinen physischen Zugang haben, denken Sie vorher, planen Sie Ihre Regeln &#8211; ein kleiner Fehler und Sie k\u00f6nnten sich selbst aussperren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein kleiner <strong>Tipp<\/strong>: haben Sie keinen physischen Zugang zum Computer &#8211; solange Sie die neuen Regeln nicht tats\u00e4chlich speichern, sind neu erstellte Regeln nach einem Neustart wieder weg. Richten Sie einen automatischen Neustart ein, erstellen in dieser Zeit Ihre Regeln und testen diese. Mit folgendem Beispiel als root:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shutdown -r +10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">startet das System nach zehn Minuten neu. Sie haben in diesem Beispiel zehn Minuten Zeit, um die Regeln zu erstellen und zu testen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beitrag werden wir nur eingehende Datenpakete bearbeiten, also solche in der Regelkette INPUT. OUTPUT ist dasselbe, FORWARD wird nur in speziellen F\u00e4llen genutzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zu Beginn leeren wir einmal m\u00f6glicherweise schon bestehende Regeln, dies gelingt durch den Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -F<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt sehen wir uns die Syntax an, um Regeln zu erstellen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -OPTION TABELLE -i Netzwerkschnittstelle -p Protokoll --dport Port -j ZIEL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zu Beginn finden Sie nat\u00fcrlich den grundlegenden Befehl <code>iptables<\/code>, anschlie\u00dfend folgt mit <code>-OPTION<\/code> &#8211; wo soll die Regel in der Regelkette stehen? Regeln liegen in einer einfachen Textdatei &#8211; jede Regel steht in einer eigenen Zeile, die Regeln werden von oben nach unten vom Netfilter ausgef\u00fchrt. Sehen wir uns die m\u00f6glichen Optionen an:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A<\/strong> &#8211; die Regel wird an bestehende Regeln angef\u00fcgt, ist noch keine vorhanden, ist dies die erste Regel, besteht schon eine oder mehrere, wird die neue Regel darunter gestellt.<\/li>\n\n\n\n<li><strong>I N<\/strong> &#8211; die neue Regel landet an der durch &#8222;<strong>N<\/strong>&#8220; angegebenen Stelle eingef\u00fcgt. Ganz oben steht die Regel Nummer eins. W\u00fcrden Sie also etwa &#8222;N&#8220; durch &#8222;2&#8220; ersetzen, w\u00fcrde die neue Regel in der zweiten Zeile eingef\u00fcgt, die Regel, die sich bisher an zweiter Stelle befand, eine Zeile nach unten verschoben.<\/li>\n\n\n\n<li><strong>D N<\/strong> &#8211; die Regel in der durch &#8222;<strong>N<\/strong>&#8220; angegebenen Zeile wird gel\u00f6scht.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nach der Option folgt die zu nutzende <code>TABELLE<\/code>, also etwa &#8222;<em>filter<\/em>&#8222;, mit <code>-i<\/code> geben Sie die Netzwerkschnittstelle an, es folgt mit <code>-p<\/code> das Protokoll, mit <code>--dport<\/code> der zu nutzende Port und mit <code>-j<\/code> wird das Ziel angegeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kommen wir zur ersten Regel &#8211; diese werde ich hier nicht weiter aufschl\u00fcsseln, sondern nur erkl\u00e4ren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -I INPUT 1 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ohne diese Regel w\u00fcrde f\u00fcr jedes Datenpaket eine neue Verbindung gestartet, der Datentransfer w\u00fcrde um vieles l\u00e4nger dauern, die Verbindung w\u00fcrde immer wieder abbrechen. Wie Sie in diesem Beispiel sehen, k\u00f6nnen Sie die Zeile (<em>oben &#8222;n&#8220;<\/em>) auch nach der Tabelle angeben. Diese Regel sollte immer an erster (<em>oberster Stelle stehen<\/em>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt wollen wir einen ersten Port freigeben, dieser ist besonders dann absolut wichtig, wenn Sie keinen physischen Zugang zum Computer haben und sich \u00fcber <a href=\"https:\/\/linux-bibel.at\/index.php\/2023\/09\/10\/ssh-secure-shell-unter-linux-am-terminal-und-auf-der-grafischen-oberflaeche\/\" data-type=\"post\" data-id=\"2501\">SSH<\/a> (<em>Secure Shell<\/em>) mit diesem verbinden. Hier f\u00fcgen wir mit der Option <code>-A<\/code> die neue Regel an bestehende an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -p tcp --dport ssh -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Regel gilt also f\u00fcr eingehende Datenpakete &#8211; <code>INPUT<\/code> auf der Schnittstelle <code>eth0<\/code> auf f\u00fcr das Protokoll <code>tcp<\/code> auf dem Port <code>ssh<\/code> und solche Pakete werden mit <code>ACCEPT<\/code> akzeptiert. Statt den Port auszuschreiben, k\u00f6nnen Sie auch die Nummer des Ports angeben &#8211; f\u00fcr SSH also &#8222;22&#8220;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Liste der g\u00e4ngigsten Ports finden Sie unter <a href=\"https:\/\/de.wikipedia.org\/wiki\/Liste_der_standardisierten_Ports\">Wikipedia<\/a>. Jetzt wollen wir beispielsweise auch den Port 443 erlauben oder eben https &#8211; wir h\u00e4ngen diese einfach an die bestehenden Regeln an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wir k\u00f6nnen auch einen Port-Bereich angeben. Nehmen wir etwa <a href=\"https:\/\/linux-bibel.at\/index.php\/2023\/09\/10\/kde-connect-linux-im-wlan-mit-android-verbinden\/\" data-type=\"post\" data-id=\"2983\">Kdeconnect<\/a> &#8211; die Software ben\u00f6tigt folgende offene Ports: 1714 bis 1764, mit dem Protokoll udp und 1714 bis 1764, mit dem Protokoll tcp. Dies w\u00fcrde folgende beide neuen Regeln ergeben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -p udp --dport 1714:1764 -j ACCEPT\niptables -A INPUT -i eth0 -p tcp --dport 1714:1764 -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Statt der Option <code>-i<\/code> k\u00f6nnen wir auch eine IP-Adresse angeben &#8211; in diesem Fall kann man mit der angegebenen IP-Adresse auf den Computer zugreifen, mit anderen IP&#8217;s nicht (wenn Sie keine weiteren angeben und alles andere sperren):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -s 123.456.78.9 -p tcp --dport ssh -j ACCEPT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt wollen wir einen IP-Adressbereich sperren &#8211; etwa, weil aus diesen Bereichen sehr viele Verbindungsversuche per SSH kommen, oder Spam in das Forum. Nehmen wir den Bereich 101.55.224.0 bis 101.55.231.255:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -s 101.55.224.0:101.55.231.255 -p tcp --dport ssh -j DROP\niptables -A INPUT -i eth0 -s 101.55.224.0:101.55.231.255 -p tcp --dport 443<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem Sie alle Regeln erstellt haben &#8211; also alles, was Sie erlauben wollen und sperren,  gilt es noch alles andere zu sperren, was Sie nicht definiert haben. Dies gelingt mit folgendem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -j DROP<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig &#8211; diese Regel muss am Ende der Regelkette liegen, also ganz unten &#8211; mit Ausnahme einer Regel: Wollen Sie unerlaubte Zugriffsversuche loggen, folgt diese Regel zuletzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -A INPUT -i eth0 -j LOG --log-prefix \"DROP - \"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit folgendem Befehl k\u00f6nnen Sie sich die aktuell bestehenden Regeln ansehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables -L<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Firewall-Regeln mit den Iptables speichern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wie schon beschrieben, bleiben erstellte Regeln nur bis zum n\u00e4chsten Neustart erhalten &#8211; starten Sie das System neu, sind die Regeln verschwunden. Sie m\u00fcssen neu erstellte Regeln, auch zu bestehenden Regeln neu hinzu gef\u00fcgte speichern &#8211; dies gelingt mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iptables-save &gt; \/etc\/iptables\/rules.v4<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie in einem schon bestehenden Artikel versprochen (leider wei\u00df ich nicht mehr in welchem) &#8211; hier die professionelle Konfiguration der Firewall unter Linux. Hier wird noch die Konfiguration mit Iptables beschrieben &#8211; inzwischen ist auch Nftables vorhanden. Beide Anwendungen k\u00f6nnen zur Konfiguration genutzt werden, die Nftables sind angeblich einfacher zu nutzen &#8211; damit habe ich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":11118,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[402,72],"tags":[37],"class_list":["post-11116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-firewall","category-sicherheit","tag-sicherheit"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/11116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=11116"}],"version-history":[{"count":2,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/11116\/revisions"}],"predecessor-version":[{"id":11120,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/11116\/revisions\/11120"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/11118"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=11116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=11116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=11116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}