<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ufw – Serverküche</title><link>https://serverkueche.de/tags/ufw/</link><description>Ufw – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/ufw/index.xml" rel="self" type="application/rss+xml"/><item><title>Firewall mit UFW einrichten</title><link>https://serverkueche.de/tutorials/firewall-ufw-einrichten/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/firewall-ufw-einrichten/</guid><description>Mit UFW in wenigen Minuten eine Host-Firewall aufsetzen: alles blocken außer SSH, HTTP und HTTPS – ohne dich dabei selbst auszusperren.</description><content:encoded><![CDATA[<p>Dein Server nimmt standardmäßig Verbindungen auf allen offenen Ports entgegen. Eine
<strong>Firewall</strong> dreht das um: Sie blockt alles und lässt nur durch, was du ausdrücklich
erlaubst. <strong>UFW</strong> („Uncomplicated Firewall&quot;) macht das mit wenigen, gut lesbaren
Befehlen – die perfekte erste Verteidigungslinie.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>UFW</strong> auf deinem <strong>Debian 13</strong> mit der Grundregel „<strong>alles eingehende
blocken</strong>&quot;, geöffnet sind nur <strong>SSH</strong> (dein Zugang) sowie <strong>HTTP/HTTPS</strong> (Port 80/443,
die du später für Traefik brauchst). Ausgehende Verbindungen bleiben erlaubt. Das
Wichtigste dabei: Wir gehen so vor, dass du dich <strong>nicht selbst aussperrst</strong>.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <a href="/tutorials/ssh-absichern/">abgesicherter Server</a> mit sudo-Benutzer</li>
<li>Du weißt, auf welchem <strong>Port dein SSH</strong> läuft (Standard: 22)</li>
</ul>
<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-ufw-installieren">Schritt 1: UFW installieren</h3>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install -y ufw</span></span></code></pre></div>
</div>
<p>Prüfe die Version – UFW ist zunächst <strong>inaktiv</strong>, das ist gewollt:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ufw version</span></span></code></pre></div>
</div>
<h3 id="schritt-2-grundregeln-festlegen">Schritt 2: Grundregeln festlegen</h3>
<p>Zuerst die Standardrichtung: alles Eingehende ablehnen, alles Ausgehende erlauben.</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw default deny incoming
</span></span><span class="line"><span class="cl">sudo ufw default allow outgoing</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Default incoming policy changed to &#39;deny&#39;
</span></span><span class="line"><span class="cl">(be sure to update your rules accordingly)
</span></span><span class="line"><span class="cl">Default outgoing policy changed to &#39;allow&#39;
</span></span><span class="line"><span class="cl">(be sure to update your rules accordingly)</span></span></code></pre></div>
</div>
<p>Diese Regeln greifen noch nicht – UFW ist ja inaktiv. Deshalb kommen jetzt die
Ausnahmen, <strong>bevor</strong> wir einschalten.</p>
<h3 id="schritt-3-ssh-freigeben--zuerst-sonst-aussperrung">Schritt 3: SSH freigeben – zuerst, sonst Aussperrung</h3>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-paprika-400 bg-paprika-50 dark:border-paprika-700 dark:bg-paprika-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🔥</span>Erst SSH erlauben, dann aktivieren
  </p>
  <div class="prose-kitchen text-sm">Schaltest du UFW mit der Regel „deny incoming&quot; ein, <strong>ohne</strong> vorher SSH erlaubt zu
haben, kappt der nächste Befehl deine eigene Verbindung – und du kommst per SSH nicht
mehr rein. Diese Reihenfolge ist nicht verhandelbar.</div>
</div>
<p>Wenn dein SSH auf dem Standardport 22 läuft (und <code>openssh-server</code> installiert ist),
gibt es dafür ein fertiges Profil:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw allow OpenSSH</span></span></code></pre></div>
</div>
<p>Hast du den SSH-Port geändert (z. B. auf 2222), erlaube stattdessen genau diesen Port:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw allow 2222/tcp</span></span></code></pre></div>
</div>
<h3 id="schritt-4-http-und-https-freigeben">Schritt 4: HTTP und HTTPS freigeben</h3>
<p>Für den späteren <a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a>
brauchst du die Web-Ports. Öffne sie gleich mit:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw allow 80/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 443/tcp</span></span></code></pre></div>
</div>
<p>Jede Regel bestätigt UFW mit <code>Rules updated</code> und <code>Rules updated (v6)</code> (die
IPv6-Variante).</p>
<h3 id="schritt-5-firewall-aktivieren-und-prüfen">Schritt 5: Firewall aktivieren und prüfen</h3>
<p>Jetzt einschalten:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw enable</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
</span></span><span class="line"><span class="cl">Firewall is active and enabled on system startup</span></span></code></pre></div>
</div>
<p>Kontrolliere das Ergebnis:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw status verbose</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Status: active
</span></span><span class="line"><span class="cl">Logging: on (low)
</span></span><span class="line"><span class="cl">Default: deny (incoming), allow (outgoing), disabled (routed)
</span></span><span class="line"><span class="cl">New profiles: skip
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">To                         Action      From
</span></span><span class="line"><span class="cl">--                         ------      ----
</span></span><span class="line"><span class="cl">OpenSSH                    ALLOW IN    Anywhere
</span></span><span class="line"><span class="cl">80/tcp                     ALLOW IN    Anywhere
</span></span><span class="line"><span class="cl">443/tcp                    ALLOW IN    Anywhere
</span></span><span class="line"><span class="cl">OpenSSH (v6)               ALLOW IN    Anywhere (v6)
</span></span><span class="line"><span class="cl">80/tcp (v6)                ALLOW IN    Anywhere (v6)
</span></span><span class="line"><span class="cl">443/tcp (v6)               ALLOW IN    Anywhere (v6)</span></span></code></pre></div>
</div>
<p><code>Status: active</code> und deine drei Freigaben – fertig. Teste <strong>zur Sicherheit in einer
zweiten SSH-Sitzung</strong>, dass du dich weiterhin verbinden kannst, bevor du die erste
schließt.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Nach <code>ufw enable</code> kommst du per SSH nicht mehr rein.</p>
<p><strong>Ursache &amp; Lösung:</strong> Die SSH-Regel fehlte oder betraf den falschen Port. Verbinde
dich über die <strong>Konsole im netcup SCP</strong> (VNC, unabhängig von SSH), erlaube dort
deinen SSH-Port (<code>sudo ufw allow …</code>) und teste erneut. Genau davor warnt Schritt 3.</p>
<p><strong>Symptom:</strong> <code>ERROR: Could not find a profile matching 'OpenSSH'</code></p>
<p><strong>Ursache &amp; Lösung:</strong> Das OpenSSH-Profil existiert nur, wenn <code>openssh-server</code>
installiert ist. Nutze stattdessen die Portnummer: <code>sudo ufw allow 22/tcp</code> (bzw.
deinen Port). <code>sudo ufw app list</code> zeigt die verfügbaren Profile.</p>
<p><strong>Symptom:</strong> Ein Docker-Container ist von außen erreichbar, obwohl UFW den Port
nicht freigibt.</p>
<p><strong>Ursache &amp; Lösung:</strong> Kein Fehler von dir – <strong>Docker umgeht UFW</strong>. Docker schreibt
seine Regeln direkt in <code>iptables</code> und hängt sie vor die UFW-Ketten. Ein
veröffentlichter Container-Port (<code>ports:</code> in der compose.yaml) ist damit offen,
egal was UFW sagt. Die saubere Lösung ist eine zweite Firewall-Ebene <strong>vor</strong> dem
Server (ein vorgelagerter Perimeter, z. B. eine Cloud-/Provider-Firewall). Auf dem
Host hilft außerdem, Container-Ports nur an <code>127.0.0.1</code> zu binden statt an <code>0.0.0.0</code>.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Regeln ansehen und löschen:</strong> <code>sudo ufw status numbered</code> nummeriert alle Regeln;
<code>sudo ufw delete 3</code> entfernt Regel 3. So räumst du auf, wenn ein Dienst wegfällt.</li>
<li><strong>Neue Dienste:</strong> Für jeden zusätzlichen öffentlichen Port eine gezielte Regel –
nie „mal eben alles&quot; öffnen. Was nicht offen sein muss, bleibt zu.</li>
<li><strong>Kein Backup nötig,</strong> aber notiere dir deine Freigaben (oder halte sie im selben
Dokument wie deine DNS-Records fest). Der Regelsatz ist in Sekunden neu getippt.</li>
<li><strong>Grenzen kennen:</strong> UFW schützt den Host, aber nicht gegen die Docker-Lücke oben.
Eine vorgelagerte Provider-/Perimeter-Firewall ergänzt UFW zu zwei Ebenen, die
sich gegenseitig absichern – ideal, sobald Container mit offenen Ports laufen.</li>
</ul>
]]></content:encoded></item></channel></rss>