<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
	<channel>
		<title>Homelab on sudoscience</title>
		<link>https://sudoscience.de/tags/homelab/</link>
		<description>Recent content in Homelab on sudoscience</description>
		<generator>Hugo -- 0.162.1</generator>
		<language>de-DE</language>
		<copyright>Vanderley Industries</copyright>
		<lastBuildDate>Tue, 31 Mar 2026 00:00:00 +0000</lastBuildDate>
		<atom:link href="https://sudoscience.de/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
		
		
		<item>
			<title>Homelab</title>
			<link>https://sudoscience.de/posts/homelab/</link>
			<pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><author>Art Vanderley</author><guid>https://sudoscience.de/posts/homelab/</guid>
			<description><![CDATA[Ein Homelab ist meist eine nie endende Baustelle, auf der ständig noch etwas angepasst, erweitert, zusammenlegt oder optimiert wird.]]></description><content type="text/html" mode="escaped"><![CDATA[<aside class="admonition info">
    <div class="admonition-title"><span class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-info">
      <circle cx="12" cy="12" r="10"></circle>
      <line x1="12" y1="16" x2="12" y2="12"></line>
      <line x1="12" y1="8" x2="12.01" y2="8"></line>
   </svg></span><b>Homelab</b></div>
    <div class="admonition-content"><p class="pinternal"><a href="#firewall"><strong>Firewall</strong></a></p>
<p class="pinternalsub"><a href="#firewallregeln">Firewall-Regeln</a></p>
<p class="pinternalsub"><a href="#deeppacketinspection">Deep-Packet-Inspection</a></p>
<p class="pinternal"><a href="#dnsserver"><strong>DNS-Server</strong></a></p>
<p class="pinternalsub"><a href="#adguardhome">AdGuard Home</a></p>
<p class="pinternalsub"><a href="#unbound">Unbound</a></p>
<p class="pinternal"><a href="#networksegmentation"><strong>Network-Segmentation</strong></a></p>
<p class="pinternalsub"><a href="#layer3">Layer-3</a></p>
<p class="pinternalsub"><a href="#layer2">Layer-2</a></p>
<p class="pinternal"><a href="#endpointsecurityserver"><strong>Endpoint-Security (Server)</strong></a></p>
<p class="pinternalsub"><a href="#updates">Updates</a></p>
<p class="pinternalsub"><a href="#sshlogin">SSH-Login</a></p>
<p class="pinternalsub"><a href="#iptables">Iptables</a></p>
<p class="pinternalsub"><a href="#systemzeit">Systemzeit</a></p>
<p class="pinternalsub"><a href="#backupserver">Backup (Restic)</a></p>
<p class="pinternalsub"><a href="#sandboxingserver">Sandboxing (AppArmor)</a></p>
<p class="pinternal"><a href="#endpointsecuritydesktop"><strong>Endpoint-Security (Desktop)</strong></a></p>
<p class="pinternalsub"><a href="#backupdesktop">Backup (Vorta)</a></p>
<p class="pinternalsub"><a href="#passwortmanager">Passwort-Manager</a></p>
<p class="pinternalsub"><a href="#firefox">Firefox</a></p>
<p class="pinternalsub"><a href="#sandboxingdesktop">Sandboxing (Firejail)</a></p>
</div>
</aside>




    <div class="image-gallery" id="gallery-ac8d99b0">
                        
                <a href="/images/homelab.jpg" class="gallery-item" data-lightbox-group="gallery-ac8d99b0" data-title="Homelab"><img src="/images/homelab_hu_bd48236d97bc47ce.jpg" alt="homelab" width="300" height="300" loading="lazy">
                    <div class="gallery-item-caption">Homelab</div>
                </a></div>
<h3 id="firewall">Firewall<a href="#firewall" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Die zentrale Rolle als Firewall- und Routing-Plattform des Homelabs spielt <font class='fhighlight'>OPNsense</font>. Dort sind die verschiedenen Netzsegmente als VLANs definiert, deren Datenverkehr durch entsprechende Firewall-Regeln gesteuert wird. Die Vergabe von IP-Adressen sowie die Zuweisung von Gateway und DNS-Servern für die einzelnen Netze erfolgt zentral über den integrierten DHCP-Server von <font class='fhighlight'>OPNsense</font>.
Bei Bedarf lässt sich der Internetverkehr einzelner VLANs auch über die WireGuard-Schnittstelle von <font class='fhighlight'>OPNsense</font> routen.</p>
<h4 id="firewallregeln">Firewall-Regeln<a href="#firewallregeln" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Die Reihenfolge der Firewall-Regeln ist entscheidend, da <font class='fhighlight'>OPNsense</font> diese strikt von oben nach unten verarbeitet. Sobald eine Regel greift, also eine Verbindung explizit erlaubt oder blockiert wird, erfolgt keine weitere Prüfung der nachfolgenden Regeln.<br />
<em>Es zählt somit immer die erste zutreffende Regel; alle weiteren Einträge bleiben für diese Verbindung unberücksichtigt.</em><br />
Ist die erste Regel beispielsweise eine &lsquo;Allow any&rsquo;-Regel, werden alle Verbindungen bereits dort erlaubt, selbst wenn darunter spezifischere Block-Regeln definiert sind. Deshalb sollten restriktive oder spezifische Regeln grundsätzlich vor allgemeineren Allow-Regeln platziert werden. Das folgende Schema kann dabei hilfreich sein:</p>
<table class="tblfwrules">
  <thead>
    <tr class="trfwrules">
      <th class="thfwrules">Action</th>
      <th class="thfwrules">Protocol</th>
      <th class="thfwrules">Source</th>
      <th class="thfwrules">Destination</th>
      <th class="thfwrules">Destination-Port</th>
      <th class="thfwrules">Description</th>
    </tr>
  </thead>
  <tbody>
    <tr class="trfwrules">
      <td class="tdfwrules">Pass</td>
      <td class="tdfwrules">IPv4+6 TCP/UDP</td>
      <td class="tdfwrules">VLAN21 net</td>
      <td class="tdfwrules">DNSlocal</td>
      <td class="tdfwrules">53</td>
      <td class="tdfwrules">[1] Allow internal DNS.</td>
    </tr>
    <tr class="trfwrules">
      <td class="tdfwrules">Block</td>
      <td class="tdfwrules">IPv4+6 TCP/UDP</td>
      <td class="tdfwrules">VLAN21 net</td>
      <td class="tdfwrules">any</td>
      <td class="tdfwrules">53</td>
      <td class="tdfwrules">[2] Block external DNS.</td>
    </tr>
    <tr class="trfwrules">
      <td class="tdfwrules">Pass</td>
      <td class="tdfwrules">IPv4+6 any</td>
      <td class="tdfwrules">VLAN21 net</td>
      <td class="tdfwrules">VLAN21 address</td>
      <td class="tdfwrules">any</td>
      <td class="tdfwrules">[3] Allow access to gateway.</td>
    </tr>
    <tr class="trfwrules">
      <td class="tdfwrules">Block</td>
      <td class="tdfwrules">IPv4+6 any</td>
      <td class="tdfwrules">VLAN21 net</td>
      <td class="tdfwrules">LocalNetworks</td>
      <td class="tdfwrules">any</td>
      <td class="tdfwrules">[4] Allow access to local networks.</td>
    </tr>
    <tr class="trfwrules">
      <td class="tdfwrules">Pass</td>
      <td class="tdfwrules">IPv4+6 any</td>
      <td class="tdfwrules">VLAN21 net</td>
      <td class="tdfwrules">any</td>
      <td class="tdfwrules">any</td>
      <td class="tdfwrules">[5] Allow to any.</td>
    </tr>
  </tbody>
</table>
<h4 id="deeppacketinspection">Deep-Packet-Inspection<a href="#deeppacketinspection" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Um zu verhindern, dass der lokale DNS-Server über verschlüsselte Protokolle umgangen wird, müssen DoH (DNS over HTTPS) und DoT (DNS over TLS) blockiert werden. Da sich insbesondere DoH im regulärem HTTPS-Verkehr verbirgt, scheidet klassisches Stateful-Packet-Filtering als Lösungsmöglichkeit aus. Mit der Analyse des Datenverkehrs auf Anwendungsebene &amp; der damit einhergehenden Applikationserkennung durch Deep-Packet-Inspection (DPI), können hingegen auch verschlüsselte Protokolle erkannt &amp; eingeschränkt werden.</p>
<p class="pfour"><font class='fhighlight'>OPNsense</font> ist keine vollwertige Next-Generation-Firewall (NGFW) und bietet daher keine umfassenden DPI-Fähigkeiten im Standardumfang. Durch die Integration von <font class='fhighlight'>Zenarmor</font> lässt sich diese Funktionalität jedoch nachrüsten.</p>
<hr class="seperatorsub"></hr>
<h3 id="dnsserver">DNS-Server<a href="#dnsserver" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Grundsätzlich werden alle DNS-Anfragen durch die Firewall blockiert, die nicht explizit an den lokalen DNS-Server gerichtet sind. Dort werden eingehende DNS-Anfragen zunächst durch
<font class='fhighlight'>AdGuard Home</font> auf Werbung, Tracking und Malware überprüft &amp; dann entsprechend blockiert, bzw. an AdGuards Upstream DNS-Server, <font class='fhighlight'>Unbound</font> weitergeleitet.</p>
<h4 id="adguardhome">AdGuard Home<a href="#adguardhome" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p><font class='fhighlight'>AdGuard Home</font> ist ein DNS-Server, der als sogenanntes DNS-Sinkhole arbeitet. Er übernimmt die Auflösung von Domainnamen in IP-Adressen, gleicht jedoch gleichzeitig alle DNS-Anfragen von Geräten im lokalen Netzwerk mit hinterlegten Filterlisten ab.</p>
<p class="pfour">Wird eine angefragte Domain in einer dieser Listen gefunden, liefert <font class='fhighlight'>AdGuard Home</font> statt der korrekten IP-Adresse bewusst eine ungültige Adresse zurück. Für den Webbrowser wirkt dies so, als existiere die Domain nicht, sodass die Verbindung nicht zustande kommt.
Auf diese Weise lassen sich Zugriffe auf Werbe-, Tracking- und potenziell schädliche Domains effektiv unterbinden. Besonders relevant ist dieser Ansatz für IoT-Geräte, die häufig nur unzureichende Sicherheitsmechanismen besitzen und daher von netzwerkseitiger Filterung profitieren.</p>
<h4 id="unbound">Unbound<a href="#unbound" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p><font class='fhighlight'>Unbound</font> ist ein rekursiver DNS-Resolver, der die Namensauflösung eigenständig durchführt und dabei nicht auf die DNS-Server von Providern oder Drittanbietern angewiesen ist. Statt Anfragen lediglich weiterzuleiten, löst <font class='fhighlight'>Unbound</font> Domains schrittweise selbst auf. Dabei kontaktiert <font class='fhighlight'>Unbound</font> zunächst einen Root-Nameserver, um den zuständigen Server für die jeweilige Top-Level-Domain (TLD) zu ermitteln. Anschließend fragt <font class='fhighlight'>Unbound</font> den entsprechenden TLD-Nameserver &amp; schließlich den autoritativen Nameserver der Ziel-Domain.</p>
<p class="pfour">Dieses Vorgehen verbessert die Privatsphäre, da keine einzelne externe Instanz die vollständige DNS-Anfrage einsehen kann. Zudem speichert <font class='fhighlight'>Unbound</font> erhaltene Antworten im lokalen Cache, wodurch häufig angefragte Domains schneller aufgelöst werden, was sich positiv auf Gesamtperformance auswirkt.</p>
<hr class="seperatorsub"></hr>
<h3 id="networksegmentation">Network-Segmentation<a href="#networksegmentation" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p><font class='fhighlight'>Netzwerksegmentierung</font> ist ein architektonischer Ansatz zur Aufteilung eines Netzwerks in logisch getrennte Segmente, die jeweils als eigenständige Teilnetze fungieren. <font class='fhighlight'>Netzwerksegmentierung</font> wird dabei häufig durch <font class='fhighlight'>Virtual-Local-Area-Networks (VLANs)</font> umgesetzt. VLANs ermöglichen die logische Trennung eines physischen Netzwerks, ohne dass separate Verkabelung oder dedizierte Hardware erforderlich sind.</p>
<p>Geräte innerhalb desselben VLANs können direkt miteinander kommunizieren, als befänden sie sich im gleichen physischen Segment. Kommunikation zwischen unterschiedlichen VLANs ist hingegen ausschließlich über die Firewall möglich, wo der Datenverkehr entsprechend gefiltert wird.</p>
<p>Diese Form der Isolation erhöht die Sicherheit erheblich, denn im Falle eines Sicherheitsvorfalls bleibt die Auswirkung in der Regel auf das betroffene Segment beschränkt, wodurch eine seitliche Ausbreitung innerhalb des Netzwerks effektiv verhindert wird.</p>
<h4 id="layer3">Layer-3<a href="#layer3" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Jedem <font class='fhighlight'>Switch-Port</font> ist ein bestimmtes <font class='fhighlight'>VLAN</font> zugewiesen. Für die Ports [1-8] der beiden Switches die VLANs [21-28], bzw. entsprechend die VLANs [31-38]
Die Adressvergabe (IPv4 &amp; IPv6) erfolgt via DHCP auf der <font class='fhighlight'>OPNsense</font> nach dem Schema:</p>
<table class="tblnetsegment">
  <thead>
    <tr class="trnetsegment">
      <th class="thnetsegment">Switch</th>
      <th class="thnetsegment">Port</th>
      <th class="thnetsegment">VLAN</th>
      <th class="thnetsegment">IPv4</th>
      <th class="thnetsegment">IPv6</th>
    </tr>
  </thead>
  <tbody>
    <tr class="trnetsegment">
      <td class="tdnetsegment">1</td>
      <td class="tdnetsegment">1</td>
      <td class="tdnetsegment">21</td>
      <td class="tdnetsegment">192.168.21.0/24</td>
      <td class="tdnetsegment">2a02:8071:XXXX:XXXX::21/64</td>
    </tr>
    <tr class="trnetsegment">
      <td class="tdnetsegment">1</td>
      <td class="tdnetsegment">8</td>
      <td class="tdnetsegment">28</td>
      <td class="tdnetsegment">192.168.28.0/24</td>
      <td class="tdnetsegment">2a02:8071:XXXX:XXXX::28/64</td>
    </tr>
    <tr class="trnetsegment">
      <td class="tdnetsegment">2</td>
      <td class="tdnetsegment">1</td>
      <td class="tdnetsegment">31</td>
      <td class="tdnetsegment">192.168.31.0/24</td>
      <td class="tdnetsegment">2a02:8071:XXXX:XXXX::31/64</td>
    </tr>
    <tr class="trnetsegment">
      <td class="tdnetsegment">2</td>
      <td class="tdnetsegment">8</td>
      <td class="tdnetsegment">38</td>
      <td class="tdnetsegment">192.168.38.0/24</td>
      <td class="tdnetsegment">2a02:8071:XXXX:XXXX::38/64</td>
    </tr>
  </tbody>
</table>
<h4 id="layer2">Layer-2<a href="#layer2" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour"><font class='fhighlight'>Port Isolation</font> beschränkt die Kommunikation zwischen bestimmten Ports auf demselben Switch. Wenn <font class='fhighlight'>Port Isolation</font> aktiviert ist, können Geräte, die an isolierte Ports angeschlossen sind, nicht miteinander kommunizieren. Sämtlicher Layer-2-Traffic zwischen den Switch-Ports [2-8] ist durch Port Isolation blockiert. Kommunikation zwischen Endgeräten an unterschiedlichen Switch-Ports muss damit zwingend über die Firewall erfolgen, die grundsätzlich jede Verbindung blockiert, die nicht explizit durch eine entsprechende Firewall-Regel erlaubt ist.</p>
<hr class="seperator"></hr>
<h3 id="endpointsecurityserver">Endpoint-Security (Server)<a href="#endpointsecurityserver" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Endpoint Security für Server sind Maßnahmen zum Schutz vor Angriffen, die durch die Firewall nicht abgewendet werden konnten. Ziel ist es, die Angriffsfläche der Server zu minimieren und Fehlkonfigurationen zu vermeiden. Zu den grundlegenden Schutzmaßnahmen zählen insbesondere ein konsequentes <font class='fhighlight'>Update-Management</font>, eine sichere <font class='fhighlight'>SSH-Konfiguration</font>, der Einsatz einer <font class='fhighlight'>lokalen Firewall</font>, regelmäßige <font class='fhighlight'>Backups</font> und <font class='fhighlight'>Sandboxing</font> zur Isolation potenziell unsicherer Prozesse.</p>
<h4 id="updates">Updates<a href="#updates" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Sobald eine Sicherheitslücke in einer Software öffentlich wird, beginnt ein Wettlauf zwischen Herstellern und Angreifern. Während die Hersteller versuchen die Sicherheitslücke möglichst schnell zu schließen &amp; entsprechende Patches zur Verfügung zu stellen, suchen die Angreifer nach Möglichkeiten die Schwachstelle auszunutzen. Daher ist es wichtig verfügbare Updates möglichst zeitnah durchzuführen. Unter Linux lassen sich Sicherheitsupdates durch die Installation von <font class='fhighlight'>unattended-upgrades</font> automatisieren.</p>
<p class="pbash">Aktivieren.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo dpkg-reconfigure unattended-upgrades
</span></span></code></pre></div><p class="pbash">Testen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo unattended-upgrade --dry-run -v
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h4 id="sshlogin">SSH-Login<a href="#sshlogin" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Eine wirkungsvolle Maßnahme zur Reduktion der Angriffsfläche eines Server-Systems ist das Deaktivieren des Passwort-Login. Stattdessen sollte der SSH-Login ausschließlich via <font class='fhighlight'>Public-Key-Authentifizierung</font> möglich sein. Selbst wenn starke Passwörter verwendet werden, bleibt das System grundsätzlich anfällig für Brute-Force-und Dictionary-Angriffe, wobei Angreifer systematisch Benutzername/Passwort-Kombinationen ausprobieren. Tools wie fail2ban können das Risiko zwar reduzieren, aber nicht vollständig eliminieren.</p>
<p class="pbash">Public-Key <code>~/.ssh/srv_root_nextcloud.pub</code> &amp; Private-Key <code>~/.ssh/srv_root_nextcloud</code> erstellen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen -t ed25519 -f ~/.ssh/srv_root_nextcloud -C <span class="s2">&#34;root@nextcloud.home.arpa&#34;</span>
</span></span></code></pre></div><p class="pbash">Alias für SSH-Login anlegen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;# ssh-login nextcloud.home.arpa&#34;</span> &gt;&gt; ~/.bashrc <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;alias ssh_nextcloud=&#39;ssh -i ~/.ssh/srv_root_nextcloud root@192.168.37.11&#39;&#34;</span> &gt;&gt; ~/.bashrc <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">unalias</span> -a <span class="o">&amp;&amp;</span> <span class="nb">source</span> ~/.bashrc
</span></span></code></pre></div><p class="pbashhint">Um Probleme mit SSH-Agent bei mehreren hinterlegten Schlüsseln zu vermeiden, empfiehlt es sich, entsprechende Aliase anzulegen, wo der jeweils zu verwendende Schlüssel explizit definiert ist.</p>
<p class="pbash">Konfiguration in <code>/etc/ssh/sshd_config</code> für Pubkey-Login-Setup anpassen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#Port 22/Port 22/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#AddressFamily any/AddressFamily inet/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#PermitRootLogin prohibit-password yes/PermitRootLogin yes/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl restart sshd
</span></span></code></pre></div><p class="pbash">Auf Ubuntu-Servern muss evtl. noch der user <code>[root]</code> aktiviert &amp; ein Passwort gesetzt werden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo passwd root <span class="o">&amp;&amp;</span> passwd -u root 
</span></span></code></pre></div><p class="pbash">Public-Key <code>~/.ssh/srv_root_nextcloud.pub</code> nach <code>nextcloud.home.arpa</code>, bzw. <code>192.168.37.11</code> kopieren.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-copy-id -i ~/.ssh/srv_root_nextcloud.pub root@192.168.37.11
</span></span></code></pre></div><p class="pbash">Konfiguration in <code>/etc/ssh/sshd_config</code> absichern.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/PasswordAuthentication yes/PasswordAuthentication no/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/UsePAM yes yes/UsePAM no/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/X11Forwarding yes/X11Forwarding no/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#AllowTcpForwarding no/AllowTcpForwarding no/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;s/#AllowAgentForwarding no/AllowAgentForwarding no/&#39;</span> /etc/ssh/sshd_config <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl restart sshd
</span></span></code></pre></div><p class="pbash">Konfiguration, überprüfen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/usr/bin/clear <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sshd -T <span class="p">|</span> grep -E <span class="s2">&#34;(addressfamily|listenaddress|maxauthtries)&#34;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sshd -T <span class="p">|</span> grep -E <span class="s2">&#34;(passwordauthentication|pubkeyauthentication|usepam|kbdinteractiveauthentication)&#34;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sshd -T <span class="p">|</span> grep -E <span class="s2">&#34;(x11forwarding|allowtcpforwarding|allowagentforwarding)&#34;</span>
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h4 id="iptables">Iptables<a href="#iptables" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Als hostbasierter Paketfilter spielt <font class='fhighlight'>Iptables</font> eine zentrale Rolle in der Absicherung von Linux Endpoints, wie Server &amp; Workstations. Ein- und Ausgehender Netzwerkverkehr wird nalysiert &amp; entsprechend vordefinierten Regeln zugelassen, geblockt oder verworfen.</p>
<p class="pbash">Installation.</p>
<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 class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt upgrade -y <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt install -y --no-install-suggests iptables-persistent
</span></span></code></pre></div><p class="pbash">Systemd-Service aktivieren &amp; starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> iptables <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl start iptables
</span></span></code></pre></div><p class="pbash">Neue Datei erstellen, im Editor öffnen, <a class="abashhint" href="http://sudoscience.dynuddns.net/posts/iptables_ipv4">Iptables-Script</a> einfügen &amp; Editor schließen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo mkdir /opt/iptables <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo touch /opt/iptables/fwv4-start.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo nano /opt/iptables/fwv4-start.sh
</span></span></code></pre></div><p class="pbashhint">Das Iptables-Script für die IPv6-Konfiguration gibt es <a class="abashhint" href="http://sudoscience.dynuddns.net/posts/iptables_ipv6">hier</a>.</p>
<p class="pbash">Iptables-Script starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo bash /opt/iptables/fwv4-start.sh
</span></span></code></pre></div><p class="pbash">Aktive Iptables-Regeln anzeigen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo iptables -v -L -n --line-numbers
</span></span></code></pre></div><p class="pbash">Blockierte Verbindungen in <code>/var/log/syslog</code> anzeigen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo tail -f /var/log/syslog <span class="p">|</span> grep <span class="s1">&#39;iptables_&#39;</span>
</span></span></code></pre></div><p class="pbash">Iptables beenden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl stop iptables
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h4 id="systemzeit">Systemzeit<a href="#systemzeit" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Eine genaue und aktuelle Systemuhrzeit ist auf Linux-Systemen absolut entscheidend, vor allem aus Sicherheitsgründen. Beispielsweise haben TLS/SSL-Zertifikate ein Gültigkeitsfenster und eine falsche Uhrzeit kann dazu führen, dass Zertifikate abgelehnt werden, was sich dann im Browser oder in Apps als nicht funktionierende HTTPS-Verbindungen äußert. Gerade im Server-Bereich kann eine falsche Systemzeit die Aussagekraft von Log-Dateien erheblich einschränken.</p>
<h5 id="chrony">Chrony<a href="#chrony" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive"><font class='fhighlight'>Chrony</font> ist ein Dienst zur Zeitsynchronisation unter Linux und  gleicht die Systemzeit kontinuierlich mit einem Zeitserver ab. <font class='fhighlight'>Chrony</font> besteht typischerweise aus dem Hintergrunddienst chronyd, der die Synchronisation übernimmt, sowie dem Kommandozeilenwerkzeug chronyc, mit dem sich die Zeitsynchronisation überprüfen lässt.</p>
<p class="pbash">Installation.</p>
<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 class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt upgrade -y <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt install -y --no-install-suggests tzdata chrony
</span></span></code></pre></div><p class="pbash">Systemd-Service aktivieren &amp; starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> chrony <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl start chrony
</span></span></code></pre></div><p class="pbash">Fritzbox als Zeitserver konfigurieren.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo sed -i <span class="s1">&#39;5i server 192.168.0.1 iburst&#39;</span> /etc/chrony/chrony.conf <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -i 6d /etc/chrony/chrony.conf <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo sed -n 5p /etc/chrony/chrony.conf <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl restart chrony
</span></span></code></pre></div><p class="pbash">Zeitsynchronisation überprüfen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo chronyc tracking
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h4 id="backupserver">Backup<a href="#backupserver" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Regelmäßige Backups sind nicht nur ein Mittel zur Datenrettung, bei Hardwaredefekten, Fehlkonfiguration oder versehentlichem Löschen, sondern auch essenzieller Teil der IT-Sicherheit. Besonders deutlich wird das am Beispiel von Ransomware, wo Daten auf  kompromittierten Systemen verschlüsselt werden. Ein aktuelles Backup ermöglicht die Wiederherstellung des betroffenen Systems, ohne den Lösegeldforderungen nachzukommen. aus einem aktuellen Backup und Lösegeldforderungen gestellt werden. gefordert wird. Als letzte Verteidigungslinie stellen regelmäßige Backups damit sicher, dass auch nach einem erfolgreichen Angriff keine irreversiblen Schäden zurückbleiben.</p>
<h5 id="restic">Restic<a href="#restic" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive"><font class='fhighlight'>Restic</font> ist ein plattformübergreifendes Open-Source-Tool mit dem sich inkrementelle &amp; deduplizierte Backups erstellen lassen. Dabei richtet sich <font class='fhighlight'>Restic</font> vor allem an fortgeschrittene Benutzer, die sich an der Kommandozeile wohlfühlen, denn eine graphische Oberfläche gibt es nicht. <font class='fhighlight'>Restic</font> benötigt keinen dedizierten Server &amp; unterstützt neben lokalem Speicher eine Reihe weiterer Backup-Ziele, wie SSH &amp; Cloud-Storage.</p>
<p class="pbash">Installation.</p>
<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 class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt upgrade -y <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt install --no-install-suggests restic
</span></span></code></pre></div><p class="pbash">Backup-Repository inititalisieren.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_PASSWORD</span><span class="o">=</span><span class="s1">&#39;password&#39;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span><span class="s1">&#39;sftp:skylake@192.168.37.13:/home/skylake/restic&#39;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">restic -r <span class="nv">$RESTIC_REPOSITORY</span> init
</span></span></code></pre></div><p class="pbash">Neue Datei erstellen, im Editor öffnen, <a class="abashhint" href="http://sudoscience.dynuddns.net/posts/restic_includes">Restic-Includes-Datei</a> einfügen, Datei anpassen, Editor schließen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir ~/restic <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">touch ~/restic/my_backup.txt <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">nano ~/restic/my_backup.txt
</span></span></code></pre></div><p class="pbash">Backup starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">restic backup --files-from ~/restic/my_backup.txt
</span></span></code></pre></div><p class="pbash">Backups anzeigen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">restic snapshots
</span></span></code></pre></div><p class="pbash">Das <a class="abashhint" href="http://sudoscience.dynuddns.net/posts/restic_script">Beispielskript</a> kann beispielsweise zur Automatisierung über einen Cronjob gesteuert werden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crontab -e
</span></span></code></pre></div><p class="pbash">Folgende Zeile anfügen, speichern &amp; beenden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">20</span> <span class="m">4</span> * * * /usr/bin/bash /home/sudoscience/restic/restic_backup.sh backup &gt;/dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span></code></pre></div><p class="pbashhint">Cronjob für automatisiertes, tägliches Backup um 4:20 Uhr.</p>
<hr class="seperatorsub"></hr>
<h4 id="sandboxingserver">Sandboxing<a href="#sandboxingserver" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Sandboxing ist eine Technik, bei der Programme in einer abgeschotteten Umgebung ausgeführt werden, sodass sie keinen direkten Zugriff auf das restliche System haben. Der Zugriff auf Dateien, Netzwerk oder Hardware des Host-Systems wird eingeschränkt oder blockiert. Damit bleiben Schäden auf die Sandbox begrenzt.</p>
<h5 id="apparmor">AppArmor<a href="#apparmor" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive"><font class='fhighlight'>AppArmor</font> ist ein Open-Source-Sandbox-Tool für Linux, was sich gut zur Absicherung von Servern eignet. Server sind in der Regel dauerhaft exponiert und müssen gezielt gegen externe Angriffe abgesichert werden. Hier ist es entscheidend, dass Prozesse dauerhaft, strikt isoliert sind, unabhängig davon, ob ein Server-Dienst läuft, oder nicht &amp; der Zugriff auf die Ressourcen des Host-Systems ausschließlich entsprechend der in <font class='fhighlight'>AppArmor</font> definierten Regeln erfolgt.</p>
<p class="pbash">Installation.</p>
<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 class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt upgrade -y <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt install -y --no-install-suggests apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra
</span></span></code></pre></div><p class="pbash">AppArmor aktivieren &amp; starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> apparmor.service <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo systemctl restart apparmor.service
</span></span></code></pre></div><p class="pbash">Aktive AppArmor-Profile anzeigen.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo aa-status
</span></span></code></pre></div><hr class="seperator"></hr>
<h3 id="endpointsecuritydesktop">Endpoint-Security (Desktop)<a href="#endpointsecuritydesktop" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Die unter <a href="#endpointsecurityserver"><font class="fanker">Endpoint-Security (Server)</font></a> genannten Maßnahmen sollten grundsätzlich auch auf Desktop-Systeme übertragen werden. Ergänzend empfiehlt sich der Einsatz eines <font class='fhighlight'>Passwortmanagers</font>, eine Härtung der <font class='fhighlight'>Firefox-Konfiguration</font> sowie die Ausführung von Desktop-Anwendungen innerhalb einer isolierten <font class='fhighlight'>Firejail-Sandbox</font>.</p>
<h4 id="backupdesktop">Backup<a href="#backupdesktop" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour"><font class='fhighlight'>Vorta</font> erweitert das mächtige Backup-Tool BorgBackup um eine graphische Benutzeroberfläche &amp; ermöglicht damit einen komfortablen Zugriff auf die wichtigsten Funktionen, ohne dass sich die Benutzer mit den komplexen Kommandozeilenbefehlen auseinandersetzen müssen. Über die benutzerfreundliche Oberfläche lassen sich die zu Sichernden Daten auswählen, automatisierte Backups einrichten &amp; verwalten. Indem es die Vorteile des leistungsstarken BorgBackup mit einer übersichtlichen Benutzeroberfläche kombiniert, eignet sich <font class='fhighlight'>Vorta</font> hervorragend für die Verwendung auf Linux-Desktops.</p>
<hr class="seperatorsub"></hr>
<h4 id="passwortmanager">Passwort-Manager<a href="#passwortmanager" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Ohne Hilfsmittel verwenden viele Nutzer identische und schwache Passwörter für mehrere Accounts. Wird der entsprechende Dienst eines Accounts, beispielsweise eines Online-Shops kompromittiert, etwa durch ein Datenleck, besteht das Risiko, dass Angreifer versuchen sich mit den geleakten Zugangsdaten bei anderen Diensten einzuloggen. Ein Passwort-Manager dagegen generiert für jeden Dienst starke, zufällige &amp; einzigartige Passwörter. Damit kann das Risiko durch Brute-Force-Attacken, Dictionary-Angriffe und Passwort-Leaks minimiert werden.</p>
<h5 id="enpass">Enpass<a href="#enpass" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive"><font class='fhighlight'>Enpass</font> ist ein kommerzieller Passwort-Manager und keine Open-Source-Software. Damit ist <font class='fhighlight'>Enpass</font> als proprietäre Sofware zwar weniger transparent, als entsprechende Open-Source-Alternativen, bietet dafür aber deutlich mehr Benutzerfreundlichkeit.</p>
<h5 id="keepassxc">KeePassXC<a href="#keepassxc" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive"><font class='fhighlight'>KeePassXC</font> ist ein kostenlos verfügbarer Open-Source-Password-Manager, der sowohl für Linux, als auch für MacOS &amp; Windows verfügbar ist. Im Gegensatz zu proprietären Lösungen ist es nicht notwendig einem einzigen Hersteller zu vertrauen, da der Quellcode öffentlich einsehbar ist. Für technikaffine Nutzer ist <font class='fhighlight'>KeePassXC</font> eine flexible &amp; robuste Lösung, die jedoch mehr auf Funktionalität als auf Komfort ausgelegt ist.</p>
<hr class="seperatorsub"></hr>
<h4 id="firefox">Firefox<a href="#firefox" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Umfangreiche Telemetrie und Tracking Funktionen sind heutzutage leider fester Bestandteil gängiger Browser, wie Chrome, Safari, Edge und <font class='fhighlight'>Firefox</font>. Der quelloffene und kostenlos verfügbare <font class='fhighlight'>Firefox</font> kann jedoch durch gezielte Anpassungen und Addons zu einem datenschutzfreundlichen Browser aufgewertet werden.</p>
<h5 id="profiles">Profile<a href="#profiles" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive">Für eine saubere Trennung von Nutzungskontexten (z. B. Arbeit, Privat, Testing) unterstützt <font class='fhighlight'>Firefox</font> mehrere Profile. Jedes Profil hat eine eigene Konfiguration, Add-ons und isolierte Datenbasis – ein wichtiger Baustein zur Minimierung der Angriffsfläche.</p>
<p class="pbash">Profilmanager starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">firefox –no-remote -P
</span></span></code></pre></div><p class="pbashhint">Der Parameter &lsquo;-no-remote&rsquo; bewirkt, dass mehrere Firefox-Profile parallel ausgeführt werden können.</p>
<hr class="seperatorsub"></hr>
<h5 id="arkenfox">Arkenfox<a href="#arkenfox" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive">Für ein gehärtetes Setup empfiehlt sich der Einsatz von <font class='fhighlight'>Arkenfox</font>. Dabei handelt es sich um eine Sammlung sicherheits- und datenschutzrelevanter Einstellungen, die systematisch Tracking, Fingerprinting und unnötige Hintergrundkommunikation reduzieren. Anpassungen können granular über Overrides vorgenommen werden, sodass ein guter Kompromiss zwischen Sicherheit und Usability möglich bleibt.</p>
<p class="pbash">Wechsel in Profilverzeichnis &amp; Download der Arkenfox-Dateien.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/.config/mozilla/firefox/geb2qc3m.Arbeit <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">wget -c https://raw.githubusercontent.com/arkenfox/user.js/refs/heads/master/user.js <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">wget -c https://raw.githubusercontent.com/arkenfox/user.js/refs/heads/master/updater.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">wget -c https://raw.githubusercontent.com/arkenfox/user.js/refs/heads/master/prefsCleaner.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">touch user-overrides.js <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span></code></pre></div><aside class="admonition danger">
    <div class="admonition-title"><span class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-triangle">
      <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>
      <line x1="12" y1="9" x2="12" y2="13"></line>
      <line x1="12" y1="17" x2="12.01" y2="17"></line>
   </svg></span><b>Vorsicht!</b></div>
    <div class="admonition-content"><p class="pmsgbox">Falls Firefox-Instanzen mit dem Profil <strong>[Arbeit]</strong> läuft, sollten diese zuerst beendet werden.</p>
</div>
</aside>
<p class="pbash">Wechsel in Profilverzeichnis &amp; Aktivieren der Arkenfox-Konfiguration.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/.config/mozilla/firefox/geb2qc3m.Arbeit <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">bash updater.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">bash prefsCleaner.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h5 id="profilemaker">Profilemaker<a href="#profilemaker" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h5>
<p class="pfive">Unterstützung beim Erstellen einer individuellen Konfigurationsdatei bietet das Tool <font class="fhighlight">Profilemaker</font>. Nachdem die gewünschten Einstellung im Wizard des Profilemakers gesetzt sind, kann die fertige Konfigurationsdatei heruntergeladen werden. Eine weitere Möglichkeit ist die Kombination mit <font class='fhighlight'>Arkenfox</font>, indem der Inhalt der Konfigurationsdatei aus dem Profilemaker in die Datei <code>user-overides.js</code> aus dem Arkenfox-Setup kopiert wird.</p>
<aside class="admonition danger">
    <div class="admonition-title"><span class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-triangle">
      <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>
      <line x1="12" y1="9" x2="12" y2="13"></line>
      <line x1="12" y1="17" x2="12.01" y2="17"></line>
   </svg></span><b>Vorsicht!</b></div>
    <div class="admonition-content"><p class="pmsgbox">Falls Firefox-Instanzen mit dem Profil <strong>[Arbeit]</strong> läuft, sollten diese zuerst beendet werden.</p>
</div>
</aside>
<p class="pbash">Wechsel in Downloadverzeichnis &amp; Inhalt der Konfigurationsdatei kopieren.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> ~/.config/mozilla/firefox/geb2qc3m.Arbeit <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">cat ~/Downloads/prefs.js &gt; user-overrides.js <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">bash updater.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">bash prefsCleaner.sh <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~
</span></span></code></pre></div><hr class="seperatorsub"></hr>
<h4 id="sandboxingdesktop">Sandboxing<a href="#sandboxingdesktop" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p class="pfour">Wie <font class="fhighlight">AppArmor</font> handelt es sich auch bei <font class="fhighlight">Firejail</font> um ein Open-Source-Sandbox-Tool für Linux. Die Isolation von Anwendungen durch <font class="fhighlight">Firejail</font> ist nicht dauerhaft, da die Sandbox erst mit dem Start einer Anwendung initialisiert wird. Dadurch eignet sich <font class="fhighlight">Firejail</font> besonders für den Einsatz auf Desktop-Systemen. Auf Desktops entstehen Risiken häufig durch das Ausführen potenziell unsicherer Inhalte wie Downloads oder Webseiten. Hier geht es weniger um eine dauerhafte &amp; komplexe Zugriffskontrolle, als um die Begrenzung des Schadens bei der Ausführung unsicherer Anwendungen &amp; Inhalten.</p>
<p class="pbash">Installation.</p>
<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 class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt upgrade -y <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt install -y --no-install-suggests firejail firejail-profiles
</span></span></code></pre></div><p class="pbash">Firejails <font class='fhighlight'>AppArmor</font>-Profil laden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo aa-enforce firejail-default
</span></span></code></pre></div><p class="pbash">Firejail starten.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo firecfg
</span></span></code></pre></div><p class="pbash">Firejail beenden.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo firecfg --clean
</span></span></code></pre></div>]]></content>
		</item>
		
		<item>
			<title>Iptables-Script IPv4</title>
			<link>https://sudoscience.de/posts/iptables_ipv4/</link>
			<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><author>Art Vanderley</author><guid>https://sudoscience.de/posts/iptables_ipv4/</guid>
			<description><![CDATA[Einfaches Stateful-Firewall-Script mit Iptables als Teil der Endpoint-Security für Linux-Server.]]></description><content type="text/html" mode="escaped"><![CDATA[<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Clear current configuration</span>
</span></span><span class="line"><span class="cl">iptables -F
</span></span><span class="line"><span class="cl">iptables -X
</span></span><span class="line"><span class="cl">iptables -Z
</span></span><span class="line"><span class="cl">iptables -Z -t nat
</span></span><span class="line"><span class="cl">iptables -t nat -F
</span></span><span class="line"><span class="cl">iptables -t nat -X
</span></span><span class="line"><span class="cl">iptables -t mangle -F
</span></span><span class="line"><span class="cl">iptables -t mangle -X
</span></span><span class="line"><span class="cl">iptables -t raw -F
</span></span><span class="line"><span class="cl">iptables -t raw -X
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Create chains.</span>
</span></span><span class="line"><span class="cl">iptables -N TCP
</span></span><span class="line"><span class="cl">iptables -N UDP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Set default policy.</span>
</span></span><span class="line"><span class="cl">iptables -P INPUT DROP
</span></span><span class="line"><span class="cl">iptables -P FORWARD DROP
</span></span><span class="line"><span class="cl">iptables -P OUTPUT ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Standard rules.</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A INPUT -i lo -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
</span></span><span class="line"><span class="cl">iptables -A INPUT -p icmp -m icmp --icmp-type <span class="m">8</span> -m conntrack --ctstate NEW -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Dispatch new connections chains.</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Allow inbound TCP traffic.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 22 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 53 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 80 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 139 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 443 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 445 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 1081 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 3128 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A TCP -p tcp --dport 8118 -j ACCEPT</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. Allow inbound UDP traffic.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A UDP_$IF1 -p udp --dport 53 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A UDP_$IF1 -p udp --dport 137 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A UDP_$IF1 -p udp --dport 138 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># iptables -A UDP_$IF1 -p udp --dport 139 -j ACCEPT</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 10. Reject/Log everything else.</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p udp -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv4_udp]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv4_tcp]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
</span></span><span class="line"><span class="cl">iptables -A INPUT -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv4]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 11. Persist rules.</span>
</span></span><span class="line"><span class="cl">mkdir -p /etc/iptables
</span></span><span class="line"><span class="cl">iptables-save &gt; /etc/iptables/rules.v4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 12. Display info in terminal.</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;[IPv4] packets will be FILTERED.&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&#34;</span>
</span></span></code></pre></div>]]></content>
		</item>
		
		<item>
			<title>Iptables-Script IPv6</title>
			<link>https://sudoscience.de/posts/iptables_ipv6/</link>
			<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Art Vanderley</author><guid>https://sudoscience.de/posts/iptables_ipv6/</guid>
			<description><![CDATA[Einfaches Stateful-Firewall-Script mit Iptables als Teil der Endpoint-Security für Linux-Server.]]></description><content type="text/html" mode="escaped"><![CDATA[<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Clear current configuration.</span>
</span></span><span class="line"><span class="cl">ip6tables -F
</span></span><span class="line"><span class="cl">ip6tables -F -t nat
</span></span><span class="line"><span class="cl">ip6tables -X
</span></span><span class="line"><span class="cl">ip6tables -Z
</span></span><span class="line"><span class="cl">ip6tables -Z -t nat
</span></span><span class="line"><span class="cl">ip6tables -t nat -F
</span></span><span class="line"><span class="cl">ip6tables -t nat -X
</span></span><span class="line"><span class="cl">ip6tables -t mangle -F
</span></span><span class="line"><span class="cl">ip6tables -t mangle -X
</span></span><span class="line"><span class="cl">ip6tables -t raw -F
</span></span><span class="line"><span class="cl">ip6tables -t raw -X
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Create chains.</span>
</span></span><span class="line"><span class="cl">ip6tables -N TCP
</span></span><span class="line"><span class="cl">ip6tables -N UDP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Set default policy.</span>
</span></span><span class="line"><span class="cl">ip6tables -P INPUT DROP
</span></span><span class="line"><span class="cl">ip6tables -P FORWARD DROP
</span></span><span class="line"><span class="cl">ip6tables -P OUTPUT ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Standard rules.</span>
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -i lo -j ACCEPT
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rules for ICMPv6 und DHCPv6.</span>
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -s fe80::/10 -p ipv6-icmp -j ACCEPT
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p udp --sport <span class="m">547</span> --dport <span class="m">546</span> -j ACCEPT
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type <span class="m">128</span> -m conntrack --ctstate NEW -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Dispatch new connections to chains.</span>
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Allow inbound TCP traffic.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 22 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 80 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 139 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 443 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 445 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 1081 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 3128 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A TCP -p tcp --dport 8118 -j ACCEPT</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 8. Allow inbound UDP traffic.</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A UDP -p udp --dport 53 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A UDP -p udp --dport 138 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A UDP -p udp --dport 138 -j ACCEPT</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ip6tables -A UDP -p udp --dport 139 -j ACCEPT</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 8. Reject/Log everything else.</span>
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p udp -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv6_udp]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p udp -j REJECT --reject-with icmp6-adm-prohibited
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p tcp -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv6_tcp]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -j LOG --log-prefix <span class="s2">&#34;[iptables_ipv6]: &#34;</span> --log-level <span class="m">7</span> --log-uid
</span></span><span class="line"><span class="cl">ip6tables -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 9. Persist rules.</span>
</span></span><span class="line"><span class="cl">mkdir -p /etc/iptables
</span></span><span class="line"><span class="cl">ip6tables-save &gt; /etc/iptables/rules.v6
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 10. Display info in terminal.</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;[IPv6] packets will be FILTERED.&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&#34;</span>
</span></span></code></pre></div>]]></content>
		</item>
		
		<item>
			<title>Restic-Includes</title>
			<link>https://sudoscience.de/posts/restic_includes/</link>
			<pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>Art Vanderley</author><guid>https://sudoscience.de/posts/restic_includes/</guid>
			<description><![CDATA[Die Dateien und Verzeichnisse, die Restic in ein Backup einbeziehen soll (&#39;Includes&#39;), werden in einer Textdatei definiert.]]></description><content type="text/html" mode="escaped"><![CDATA[<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /home/sudoscience/restic/my_backup.txt</span>
</span></span><span class="line"><span class="cl">/home/sudoscience/.config
</span></span><span class="line"><span class="cl">/home/sudoscience/.local/share
</span></span><span class="line"><span class="cl">/home/sudoscience/.mozilla
</span></span><span class="line"><span class="cl">/home/sudoscience/.thunderbird
</span></span><span class="line"><span class="cl">/home/sudoscience/configs
</span></span><span class="line"><span class="cl">/home/sudoscience/Desktop
</span></span><span class="line"><span class="cl">/home/sudoscience/Documents
</span></span><span class="line"><span class="cl">/home/sudoscience/Music
</span></span><span class="line"><span class="cl">/home/sudoscience/myvault
</span></span><span class="line"><span class="cl">/home/sudoscience/pdfs
</span></span><span class="line"><span class="cl">/home/sudoscience/PhpstormProjects
</span></span><span class="line"><span class="cl">/home/sudoscience/Pictures
</span></span><span class="line"><span class="cl">/home/sudoscience/PycharmProjects
</span></span><span class="line"><span class="cl">/home/sudoscience/scripts
</span></span><span class="line"><span class="cl">/home/sudoscience/Videos
</span></span></code></pre></div>]]></content>
		</item>
		
		<item>
			<title>Restic-Script</title>
			<link>https://sudoscience.de/posts/restic_script/</link>
			<pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><author>Art Vanderley</author><guid>https://sudoscience.de/posts/restic_script/</guid>
			<description><![CDATA[Beispiel-Script zur Verwaltung von Backups mit Restic.]]></description><content type="text/html" mode="escaped"><![CDATA[<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## [RESTIC] BACKUP ##</span>
</span></span><span class="line"><span class="cl">skylake<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">	<span class="nb">export</span> <span class="nv">RESTIC_PASSWORD</span><span class="o">=</span><span class="s1">&#39;password&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span><span class="s1">&#39;sftp:skylake@192.168.37.13:/home/restic&#39;</span>
</span></span><span class="line"><span class="cl">	<span class="nv">INCEXC</span><span class="o">=</span><span class="s1">&#39;/home/sudoscience/restic/&#39;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;backup&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    /usr/bin/restic backup --files-from <span class="nv">$INCEXC</span>/my_backup.txt
</span></span><span class="line"><span class="cl">  <span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;snapshots&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  	/usr/bin/restic snapshots
</span></span><span class="line"><span class="cl">  <span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;stats&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    /usr/bin/restic stats --mode raw-data
</span></span><span class="line"><span class="cl">  <span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;init&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  	/usr/bin/restic -r <span class="nv">$RESTIC_REPOSITORY</span> init
</span></span><span class="line"><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;[ERROR] Please specify task [init, stats, backup, snapshots].&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">skylake <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span></code></pre></div>]]></content>
		</item>
		
	</channel>
</rss>
