<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tim Schumacher</title>
    <link>https://tim.schumacher.im/</link>
    <description>Recent content on Tim Schumacher</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sun, 18 Feb 2024 00:00:00 +0000</lastBuildDate>
    
        <atom:link href="https://tim.schumacher.im/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Sauerteigbrot</title>
      <link>https://tim.schumacher.im/blog/brot-1/</link>
      <pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/brot-1/</guid>
      <description>&lt;p&gt;Hier ein Bild von meinem Sauerteigbrot:&lt;/p&gt;


&lt;img  src=&#34;https://tim.schumacher.im/media/blog/brot-1/sauerteigbrot.jpg&#34; alt=&#34;Bild eines Brotes mit unscharfen Hintergrund&#34; class=&#34;ui fluid image&#34;&gt;
.

&lt;p&gt;Inhalte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Roggensauerteig&lt;/li&gt;
&lt;li&gt;300g Emmervollkornmehl&lt;/li&gt;
&lt;li&gt;400g Weizenmehl 550&lt;/li&gt;
&lt;li&gt;20g Salz&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Nachtrag zum FrOSCon Vortrag „Matrix Server Setup“</title>
      <link>https://tim.schumacher.im/blog/nachtrag-froscon-matrix-server-setup/</link>
      <pubDate>Sat, 21 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/nachtrag-froscon-matrix-server-setup/</guid>
      <description>&lt;p&gt;Ich habe heute auf der &lt;a href=&#34;https://www.froscon.de/&#34;&gt;FrOSCon&lt;/a&gt; einen Vortrag wie man mittels &lt;a href=&#34;https://github.com/spantaleev/matrix-docker-ansible-deploy&#34;&gt;matrix-docker-ansible-deploy&lt;/a&gt; einen Matrix-Server aufsetzt.&lt;/p&gt;

&lt;p&gt;Das Video werde ich hier auch mal noch verlinken, wenn es denn da ist.&lt;/p&gt;

&lt;p&gt;Der Server unter froscon.datenknoten.me war innerhalb von 30 Minuten schnell aufgesetzt. Aber an der Föderation hat es dann gehapert. Das Problem war, das Matrix zur Förderation eine spezielle Datei &lt;code&gt;/.well-known/matrix/server&lt;/code&gt; abfragt, aber unter der Domain nichts ausgeliefert wurde. Schlimmer noch, es wurde ein Zertifikat für &lt;code&gt;matrix.froscon.datenknoten.me&lt;/code&gt; präsentiert, das dann zu Zertifikatsfehlern geführt hat. Des Rätsels Lösung war dann, das man dem Playbook sagen muss das es auch die Wurzeldomain &lt;code&gt;froscon.datenknoten.me&lt;/code&gt; bespielen soll. Das kann man über die Variable &lt;code&gt;matrix_nginx_proxy_base_domain_serving_enabled&lt;/code&gt; steuern. Wenn man diese auf &lt;code&gt;true&lt;/code&gt; setzt, funktioniert die Föderation. Blöd nur das die ganzen anderen Server relativ stark cachen und das Problem dann noch einige Stunden weiter besteht.&lt;/p&gt;

&lt;p&gt;So in der Retrospektive wäre es sinniger gewesen, den Vorgang von Anfang bis Ende im vorhinein mal durchzuspielen. Ich hätte aber auch die Dokumentation ordentlicher lesen könen, das hätte mich auch davor gerettet. Auf der Dokumentations-Seite zur &lt;a href=&#34;https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/installing.md#starting-the-services&#34;&gt;Installation&lt;/a&gt; steht ja explizit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now that services are running, you need to finalize the installation process (&lt;strong&gt;required for federation to work!&lt;/strong&gt;) by Configuring Service Discovery via .well-known (&lt;em&gt;Hervorhebung von mir&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>.zshrc config</title>
      <link>https://tim.schumacher.im/blog/zshrc/</link>
      <pubDate>Thu, 29 Apr 2021 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/zshrc/</guid>
      <description>&lt;p&gt;Hier ein paar nette Sachen aus meiner &lt;code&gt;.zshrc&lt;/code&gt; mit Kommentaren.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bindkey &amp;quot;^P&amp;quot; history-beginning-search-backward-end
bindkey &amp;quot;^N&amp;quot; history-beginning-search-forward-end
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das erlaubt mir meine Shell-Historie relativ einfach zu durchsuchen. Ich weis z.B. das ich irgendwas mit &lt;code&gt;ip addr&lt;/code&gt; machen will und das es ein Befehl ist, den ich in der Vergangenheit schonmal ausgeführt hab. Dann tippe ich &lt;code&gt;ip ad&lt;/code&gt; und drücke dann &lt;kbd&gt;C-p&lt;/kbd&gt; und es kommt bei der Verfollständigung &lt;code&gt;ip addr show dev eth0 | grep &#39;inet &#39;&lt;/code&gt; raus.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;alias -g G=&#39; | grep&#39;
alias -g L=&#39; | bat&#39;
alias -g H=&#39; | head&#39;
alias -g T=&#39; | tail&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Diese Aliase erlauben mir die gängigen Pipe-Befehle vereinfacht zu schreiben. So wird aus &lt;code&gt;ip addr show dev eth0 | grep &#39;inet &#39;&lt;/code&gt; dann &lt;code&gt;ip addr show dev eth0 G &#39;inet &#39;&lt;/code&gt; was ein erhöhter Schreibkomfort ist. &lt;a href=&#34;https://github.com/sharkdp/bat&#34;&gt;bat&lt;/a&gt; ist übrigens ein ganz netter Ersatz für less.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Eine Einführung in Scuttlebutt</title>
      <link>https://tim.schumacher.im/blog/scuttlebutt/</link>
      <pubDate>Sun, 08 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/scuttlebutt/</guid>
      <description>

&lt;p&gt;„&lt;a href=&#34;https://www.scuttlebutt.nz/&#34;&gt;Scuttlebutt&lt;/a&gt;“ ist ein dezentrales und
autonomes soziales Netzwerk. Dieses möchte ich hier vorstellen. Dafür werde ich zuerst ein paar Begriffe
erklären, darauffolgend das Protokoll vorstellen und zum Schluss einige
Anwendungen zeigen, die es gibt.&lt;/p&gt;

&lt;h2 id=&#34;begriffe&#34;&gt;Begriffe&lt;/h2&gt;

&lt;p&gt;„soziales Netzwerk“ — „dezentral“ — „autonom“ — „Scuttlebut“&lt;/p&gt;

&lt;p&gt;Ein soziales Netzwerk kann als eine Assoziation von Menschen verstanden werden,
die auf verschiedene Arten miteinander kommunizieren. Es ist wichtig
anzumerken, dass in einem sozialen Netzwerk die Menschen im Fokus stehen und
weniger die Kommunikationsweise selbst.&lt;/p&gt;

&lt;p&gt;Dezentral heißt hier, dass es keine zentrale Autorität gibt, die bestimmt,
welche Inhalte für das Netzwerk relevant sind.&lt;/p&gt;

&lt;p&gt;Autonom bedeutet, dass die Software auch ohne Internet funktioniert, da
die Benutzer direkt miteinander kommunizieren können, zum Beispiel
über &lt;a href=&#34;https://www.freifunk.net&#34;&gt;Freifunk&lt;/a&gt;,
&lt;a href=&#34;https://de.wikipedia.org/wiki/Bluetooth&#34;&gt;Bluetooth&lt;/a&gt; oder ein &lt;a href=&#34;https://de.wikipedia.org/wiki/Local_Area_Network&#34;&gt;lokales
Netzwerk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Der Begriff „Scuttlebutt“ kommt aus der englischen Seemannssprache.
Ein „Scuttlebutt“ ist eine Tonne mit Trinkwasser, an der sich Seeleute
bedient haben. Da diese Tonne ein Treffpunkt für die Seeleute war,
wurden dort auch Informationen ausgetauscht. Das soziale Netzwerk
„Scuttlebutt“ ist im übertragenen Sinn die Wassertonne, an welcher sich die
Menschen treffen und ihre Neuigkeiten austauschen.&lt;/p&gt;

&lt;h2 id=&#34;protokoll&#34;&gt;Protokoll&lt;/h2&gt;

&lt;p&gt;In erster Linie ist „Scuttlebutt“ ein Protokoll. Ein Protokoll ist
ein definierter Satz von Regeln, die die Kommunikation zwischen zwei
Maschinen festlegt.&lt;/p&gt;

&lt;p&gt;Dieses basiert auf dem „&lt;a href=&#34;https://en.wikipedia.org/wiki/Gossip_protocol&#34;&gt;Gossip
Protocol&lt;/a&gt;“. Eine
vereinfachte Erläuterung geht so: In einem fiktiven Büro trifft Anja einen ihrer Freunde Felix in der Küche und tratscht darüber, dass Tim sehr verwildert aussieht,
weil er seit Tagen seinen Bart nicht gepflegt hat. Etwas später trifft
Felix seine Freundinnen Wilma und Isa in der Küche und tratscht weiter, dass Tim seinen
Bart nicht pflegt. So haben Wilma und Isa die Information erhalten,
obwohl sie nicht direkt mit Anja geredet haben. Bei „Scuttlebutt“
läuft das ähnlich, nur wird mit
„&lt;a href=&#34;https://de.wikipedia.org/wiki/Kryptographie&#34;&gt;Kryptographie&lt;/a&gt;“
sichergestellt, dass die Informationen von Anja auch wirklich von ihr
stammen und vollständig sind. Da die Rechner der meisten Personen im Internet nicht von
anderen Rechnern erreichbar sind, können die Rechner nicht direkt
miteinander kommunizieren, sondern brauchen einen Mittelsmann. Im
„Scuttlebutt“-Universum nennt man diesen gemeinsamen Treffpunkt den
„Pub“, englisch für Kneipe. Die Kneipen werden von Individuen
getragen, so betreibe ich auch eine Kneipe unter
&lt;a href=&#34;https://pub.datenknoten&#34;&gt;pub.datenknoten&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Meistens werden Protokolle in Bibliotheken programmiert, damit
Anwendungen diese Bibliotheken benutzen können und jedes Programm das
komplette Protokoll implementieren muss. Implementierungen des
Protokolls sind die Bibliotheken
&lt;a href=&#34;https://github.com/ssbc/scuttlebot&#34;&gt;scuttlebot&lt;/a&gt; für JavaScript-Projekte oder auch
&lt;a href=&#34;https://github.com/ssbc/ssb-client-rs&#34;&gt;ssb-client-rs&lt;/a&gt; für Rust.&lt;/p&gt;

&lt;h2 id=&#34;soziales-netzwerk&#34;&gt;Soziales Netzwerk&lt;/h2&gt;

&lt;p&gt;Ich habe bisher ja eher den technischen Bereich beschrieben, wieso
soll das ganze jetzt ein soziales Netzwerk sein? Im Kern von
Scuttlebutt kann man Nachrichten und Dateien austauschen. Es gibt
jetzt Programme wie &lt;a href=&#34;https://github.com/ssbc/patchwork&#34;&gt;Patchwork&lt;/a&gt;
oder auch &lt;a href=&#34;https://github.com/ssbc/patchbay&#34;&gt;Patchbay&lt;/a&gt; die bestimmte
Nachrichten-Typen verarbeiten. Der aktuelle Konsens sind folgende
Typen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;about&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;contact&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vote&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;post&lt;/code&gt; ist ein Artikel, der aus Markdown besteht und in dem man auch andere
Nachrichten oder Dateien verlinken kann. Eine &lt;code&gt;post&lt;/code&gt;-Nachricht kann
auch ein Kommentar auf einen anderen Artikel sein.&lt;/p&gt;

&lt;p&gt;Der &lt;code&gt;about&lt;/code&gt; Nachrichten-Typ erlaubt es hier, sich selbst zu
beschreiben. Man kann hier einen Namen, ein Bild oder einen
Beschreibungstext hinterlegen.&lt;/p&gt;

&lt;p&gt;Mit &lt;code&gt;contact&lt;/code&gt; deutet ein Mensch an, ob er einem anderen Konto folgt
oder blockiert.&lt;/p&gt;

&lt;p&gt;Zum Schluss gibt es noch &lt;code&gt;vote&lt;/code&gt;. Mit diesem Nachrichten-Typ kann man
andere Nachrichten beurteilen. Der Wert +1 ist um Zustimmung zu einem
zu bekunden. Mit dem Wert 0 kann man ein vorher gemachte +1 Abstimmung
rückgängig machen. Der Wert -1 wird momentan nicht genutzt, es ist
geplant damit Nachrichten zu markieren, z.B. das es sich um Spam oder
unsachgemäße Kommunikation handelt.&lt;/p&gt;

&lt;p&gt;Ein Programm kann seinen eigenen Nachrichten-Typ implementieren,
dieser wird auch durch das Protokoll an andere Benutzer
weitergereicht. Wenn das Programm des Benutzers damit nichts anfangen
kann, dann wird die Nachricht nicht angezeigt.&lt;/p&gt;

&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Insgesamt finde ich &amp;ldquo;Scuttlebutt&amp;rdquo; als Medium zur medialen Vernetzung
sehr interessant, weil die Grundidee dem realweltlichen
Sozialverhalten anlehnt. Auch auf der technischen Entwicklungsebene
beobachte ich Veränderungen und bin sehr gespannt, was die nächste
Zeit so bringen wird.&lt;/p&gt;

&lt;p&gt;Viel Spaß mit „Scuttlebut“!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>TypeScript 2.8 RC</title>
      <link>https://tim.schumacher.im/blog/typescript-28-rc/</link>
      <pubDate>Sun, 25 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/typescript-28-rc/</guid>
      <description>

&lt;p&gt;Am 2018-03-15 wurde der erste „&lt;a href=&#34;https://de.wikipedia.org/wiki/Entwicklungsstadium_(Software)#Release_Candidate/Prerelease&#34;&gt;release candidate&lt;/a&gt;“ von &lt;a href=&#34;https://blogs.msdn.microsoft.com/typescript/2018/03/15/announcing-typescript-2-8-rc/&#34;&gt;TypeScript 2.8&lt;/a&gt; veröffentlicht.&lt;/p&gt;

&lt;p&gt;Für mich sind folgende Features relevant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conditional Types&lt;/li&gt;
&lt;li&gt;Granular Control on Mapped Type Modifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;conditional-types&#34;&gt;Conditional Types&lt;/h2&gt;

&lt;p&gt;Hiermit kann ich den Typen eines Ausdrucks zur Compile-Zeit dynamisch bestimmen. Benutzt werden dazu &lt;a href=&#34;https://de.wikipedia.org/wiki/Bedingte_Anweisung_und_Verzweigung#Auswahloperator&#34;&gt;der ternären Auswahloperator &lt;code&gt;?:&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hier ein Beispiel aus dem oben erwähnten Artikel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IdOrName&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
    &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Id&lt;/span&gt; : &lt;span style=&#34;color:#66d9ef&#34;&gt;Name&lt;/span&gt;;

&lt;span style=&#34;color:#66d9ef&#34;&gt;declare&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createLabel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;idOrName&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;T&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IdOrName&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;;

&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createLabel&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tim&amp;#34;&lt;/span&gt;);         &lt;span style=&#34;color:#75715e&#34;&gt;// Name
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createLabel&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;42&lt;/span&gt;);            &lt;span style=&#34;color:#75715e&#34;&gt;// Id
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createLabel&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;any&lt;/span&gt;);     &lt;span style=&#34;color:#75715e&#34;&gt;// Id | Name
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createLabel&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;never&lt;/span&gt;);   &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;// never&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Zuerst wird der Typ &lt;code&gt;IdOrName&lt;/code&gt; definiert, der einen Typparameter &lt;code&gt;T extends number | string&lt;/code&gt; hat. Dieser besagt, dass T entweder ein String oder eine Zahl sein kann und definiert sich dann über den „Conditional Type“. Wenn &lt;code&gt;T&lt;/code&gt; vom Typen &lt;code&gt;number&lt;/code&gt; ist, dann ist der Typ &lt;code&gt;IdOrName&amp;lt;T&amp;gt;&lt;/code&gt; vom Typen &lt;code&gt;Id&lt;/code&gt; in fast allen anderen Fällen vom Typen &lt;code&gt;Name&lt;/code&gt;. Als nächstes wird die Funktion &lt;code&gt;createLabel&lt;/code&gt; erzeugt, um ein paar Beispiele zu zeigen. Die Funktion hat einen Typparameter &lt;code&gt;T&lt;/code&gt;, der nur &lt;code&gt;number&lt;/code&gt; oder &lt;code&gt;string&lt;/code&gt; sein kann und benutzt diesen im Parameter &lt;code&gt;idOrName&lt;/code&gt; über den sich dann auch der Rückgabetyp &lt;code&gt;IdOrName&amp;lt;T&amp;gt;&lt;/code&gt; ergibt. Gibt man den Wert &lt;code&gt;42&lt;/code&gt; für den Parameter &lt;code&gt;idOrName&lt;/code&gt; ein, !!! so ist der Rückgabetyp den effektiven Typen &lt;code&gt;Id&lt;/code&gt;. Für die Werte &lt;code&gt;&amp;quot;tim&amp;quot;&lt;/code&gt;, &lt;code&gt;[]&lt;/code&gt; oder auch &lt;code&gt;{}&lt;/code&gt; würde der effektive Typ &lt;code&gt;Name&lt;/code&gt; zurückgegeben werden. Es gibt 2 Sonderfälle, zum einen der Typ &lt;code&gt;any&lt;/code&gt;, der alle Werte annehmen kann, entsprechend ist hier der effektive Typ auch &lt;code&gt;Id | Name&lt;/code&gt;, das heist es ist der Typ &lt;code&gt;Id&lt;/code&gt; oder &lt;code&gt;Name&lt;/code&gt;. Zum anderen gibt es noch den Typen &lt;code&gt;never&lt;/code&gt;. Dort wird der effektive Typ von &lt;code&gt;IdOrName&amp;lt;T&amp;gt;&lt;/code&gt; zu &lt;code&gt;never&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&#34;granular-control-on-mapped-type-modifiers&#34;&gt;Granular Control on Mapped Type Modifiers&lt;/h2&gt;

&lt;p&gt;Als zweites neues Feature gibt es „Granular Control on Mapped Type Modifiers“. Damit kann man die &lt;code&gt;readonly&lt;/code&gt; Eigenschaft und die &lt;code&gt;undefined&lt;/code&gt;-Spezifität in Typen ändern, die einen Index-Accessor für das Objekt bereitstellen. Hier das Beispiel aus dem original Blog-Artikel:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Foo&lt;/span&gt; {
    &lt;span style=&#34;color:#a6e22e&#34;&gt;readonly&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;abc&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt;;
    &lt;span style=&#34;color:#a6e22e&#34;&gt;def?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
}

&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Props&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
    [&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;keyof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt;]
}

&lt;span style=&#34;color:#75715e&#34;&gt;// All modifiers are copied over.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;abc&amp;#39; is read-only, and &amp;#39;def&amp;#39; is optional.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IdenticalFoo&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Props&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wir haben hier das Interface &lt;code&gt;Foo&lt;/code&gt;, das die &lt;code&gt;readonly&lt;/code&gt;-Eigenschaft &lt;code&gt;abc&lt;/code&gt; und die optionale Eigenschaft &lt;code&gt;def&lt;/code&gt; besitzt. Jetzt definieren wir den Typen &lt;code&gt;Props&lt;/code&gt; mit den generischen Parameter &lt;code&gt;T&lt;/code&gt;, der einen Index-Access bereitstellt. Als Index sind nur Attribute des Typen &lt;code&gt;T&lt;/code&gt; erlaubt und der Accessor gibt auch die Werte einfach so zurück. Aus diesem Grund verhält sich der Typ &lt;code&gt;IdenticalFoo&lt;/code&gt; genau so wie das Interface &lt;code&gt;Foo&lt;/code&gt;. Soweit so gut, jetzt die Neuerung:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Mutable&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
    &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;readonly&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;keyof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt;]
}

&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Foo&lt;/span&gt; {
    &lt;span style=&#34;color:#a6e22e&#34;&gt;readonly&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;abc&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;number&lt;/span&gt;;
    &lt;span style=&#34;color:#a6e22e&#34;&gt;def?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
}

&lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;abc&amp;#39; is no longer read-only, but &amp;#39;def&amp;#39; is still optional.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TotallyMutableFoo&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Mutable&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Durch die Angabe von &lt;code&gt;-readonly&lt;/code&gt; beim Typen &lt;code&gt;Mutable&lt;/code&gt; wird nun die Eigenschaft &lt;code&gt;readonly&lt;/code&gt; des Interfaces ignoriert. Auch hinzugekommen ist, dass man optionale Felder zu erforderlichen Feldern machen kann:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * Make all properties in T required
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Required&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
    [&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;keyof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-?:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt;];
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Neben dem Entfernen der Eigenschaften von Attributen, kann man sie auch wieder hinzufügen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * Make all properties in T optional
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;OptionalReadonly&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
    &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;readonly&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;keyof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;+?:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;P&lt;/span&gt;];
}&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Es gibt noch ein paar mehr Änderungen im Bereich &lt;a href=&#34;https://reactjs.org/docs/introducing-jsx.html&#34;&gt;JSX&lt;/a&gt;. Da ich diese aktuell nicht anwende, hat das für mich derzeit keine Relevanz. Das könnte sich mit &lt;a href=&#34;https://stenciljs.com/&#34;&gt;Stencil&lt;/a&gt; allerdings ändern.&lt;/p&gt;

&lt;p&gt;Insgesamt bin ich mit der Entwicklung von TypeScript weiterhin sehr zufrieden.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gajim 1.0</title>
      <link>https://tim.schumacher.im/blog/gajim-10/</link>
      <pubDate>Sun, 18 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/gajim-10/</guid>
      <description>&lt;p&gt;Gestern, der 2018-03-17, wurde &lt;a href=&#34;https://blog.lagaule.org/?p=86&#34;&gt;Gajim 1.0 veröffentlicht&lt;/a&gt;. Diese Version befand sich 5 Jahre in der Entwicklung und das Hauptaugenmerk war der Wechsel von &lt;a href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt; 2 auf 3 und &lt;a href=&#34;https://www.gtk.org/&#34;&gt;GTK&lt;/a&gt; 2 auf 3. Vom Äußerlichen hat sich nicht sooo viel geändert, aber ich hoffe mal das hier als nächstes die Hand angelegt wird, denn schön ist Gajim immer noch nicht so richtig. Aber es ist der beste und wichtigeste &lt;a href=&#34;https://de.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol&#34;&gt;XMPP&lt;/a&gt;-Client, den es zur Zeit auf dem Desktop-Markt gibt. Eine Entscheidung, die ich als wichtig und gut empfinde, ist, dass das &lt;a href=&#34;https://de.wikipedia.org/wiki/Off-the-Record_Messaging&#34;&gt;OTR&lt;/a&gt;-Plugin nicht portiert wurde und stattdessen der Fokus auf &lt;a href=&#34;https://de.wikipedia.org/wiki/OMEMO&#34;&gt;OMEMO&lt;/a&gt; gelegt wurde.&lt;/p&gt;

&lt;p&gt;Ich wünsche dem &lt;a href=&#34;https://www.gajim.org&#34;&gt;Gajim-Projekt&lt;/a&gt; viel Erfolg auf ihrem Weg zu einem der besten XMPP-Clients, die es da draußen gibt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Was zum Docker</title>
      <link>https://tim.schumacher.im/blog/was-zum-docker/</link>
      <pubDate>Fri, 23 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/was-zum-docker/</guid>
      <description>

&lt;p&gt;Ein guter Freund von mir berichtete, dass er seit einem Docker-Update einen PostgreSQL-Container nicht mehr starten konnte, ihn deshalb löschen musste und dann seine Daten verloren gingen. Datenverlust ist nie lustig und aus diesem Grund will ich dem geneigten Leser einige Erfahrungen mit auf den Weg geben, die ich in den letzten anderthalb Jahren bei &lt;a href=&#34;http://www.flyacts.com&#34;&gt;meinem Arbeitgeber&lt;/a&gt; sammeln konnte.&lt;/p&gt;

&lt;h2 id=&#34;container-sind-zustandslos-und-unveränderbar&#34;&gt;Container sind zustandslos und unveränderbar&lt;/h2&gt;

&lt;h3 id=&#34;was-heißt-zustandslos&#34;&gt;Was heißt „zustandslos“?&lt;/h3&gt;

&lt;p&gt;Zwar verhält es sich nicht immer so, dass Container zustandslos und unveränderbar sind, aber man sollte sie dennoch so betrachten. Damit wird dann die Frage aufgeworfen, wenn der Zustand der Anwendung nicht im Container gespeichert wird, wo wird er dann gespeichert? &lt;a href=&#34;https://docs.docker.com/storage/&#34;&gt;Das Handbuch&lt;/a&gt; gibt hier zwei Möglichkeiten vor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Volumes&lt;/li&gt;
&lt;li&gt;Bind-mount&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&#34;docker-volumes&#34;&gt;docker volumes&lt;/h4&gt;

&lt;p&gt;Volumes sind &lt;a href=&#34;https://docs.docker.com/storage/volumes/&#34;&gt;laut Dokumentation&lt;/a&gt; der präferierte Weg den Zustand eines Containers zu persistieren. Meine persönliche Erfahrung ist eine andere. Ich benutze lieber bind mounts, da hier keine Verwaltung von nöten ist. Volumes kann ich auch wesentlich einfacher aus Versehen löschen, ein Ordner im Dateisystem erfordert mehr Aufwand.&lt;/p&gt;

&lt;h4 id=&#34;bind-mounts&#34;&gt;bind mounts&lt;/h4&gt;

&lt;p&gt;Mittels eines „&lt;a href=&#34;https://unix.stackexchange.com/questions/198590/what-is-a-bind-mount/198591#198591&#34;&gt;bind mounts&lt;/a&gt;“ kann ich auf einem Linux-System einen Ordner auf einen anderen Ordner zeigen lassen, so dass beide über den selben Inhalt verfügen. So kann ein Ordner auf dem Hostsystem und in dem Docker-Container den selben Inhalt besitzen. Dadurch wird der Zustand des Containers außerhalb des Containers gespeichert und man kann ihn mit seinen regulären Werkzeugen sichern und beobachten.&lt;/p&gt;

&lt;h3 id=&#34;was-heißt-unveränderbar&#34;&gt;Was heißt „unveränderbar“?&lt;/h3&gt;

&lt;p&gt;Nachdem ich nun den Zustand der Datenbank außerhalb des Containers speichere, gilt es die zweite Eigenschaft „unveränderbar“ (engl immuteable) zu betrachten. Es ist zwar möglich einen Container zu bearbeiten, aber spätestens wenn man diesen Container löscht oder einen zweiten anlegt, wird sich das rächen, da die Änderung weg ist. Willst du wirklich eine Änderung an einem Container vornehmen, empfiehlt es sich, das dem Container zugrunde liegende Abbild zu modifizieren und in ein eigenes abzuspeichern.&lt;/p&gt;

&lt;h2 id=&#34;aber-ich-kann-doch-nicht-den-container-löschen&#34;&gt;Aber ich kann doch nicht den Container löschen&lt;/h2&gt;

&lt;p&gt;Was mich am meisten verdutzt an der Aussage des Freundes war, dass das Löschen eines Containers so ein großer Akt ist. Auf Arbeit mache ich das ständig. Das liegt primär daran, dass wir mit &lt;a href=&#34;https://docs.docker.com/compose/&#34;&gt;docker-compose&lt;/a&gt; arbeiten und dies selbst für jeden kleinsten Dienst. Das Arbeiten mit compose hat den großen Vorteil, dass die Konfiguration der Docker Container in einer &lt;a href=&#34;https://de.wikipedia.org/wiki/YAML&#34;&gt;YAML-Konfigurationsdatei&lt;/a&gt; gespeichert ist und diese Datei über GIT versioniert ist.&lt;/p&gt;

&lt;h2 id=&#34;einen-dienst-mit-docker-compose-einrichten&#34;&gt;Einen Dienst mit &lt;code&gt;docker-compose&lt;/code&gt; einrichten&lt;/h2&gt;

&lt;p&gt;Privat benutze ich für ein Projekt &lt;a href=&#34;https://www.odoo.com/&#34;&gt;odoo&lt;/a&gt; und verwende &lt;code&gt;docker-compose&lt;/code&gt; für die Konfiguration der Anwendung. Hier meine komplette &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;version: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;
services:
  web:
    image: odoo:&lt;span style=&#34;color:#ae81ff&#34;&gt;10.0&lt;/span&gt;
    depends_on:
      - db
    volumes:
      - ./data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    ports:
      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;127.0.0.1:18069:8069&amp;#34;&lt;/span&gt;
    environment:
      - HOST=db
      - USER=odoo
      - PASSWORD=somethingrandom
  db:
    image: postgres:&lt;span style=&#34;color:#ae81ff&#34;&gt;9.6&lt;/span&gt;
    volumes:
        - ./postgres:/usr/local/var/lib/postgresql
    environment:
        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PGDATA=/usr/local/var/lib/postgresql&amp;#34;&lt;/span&gt;
        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POSTGRES_PASSWORD=somethingrandom&amp;#34;&lt;/span&gt;
        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;POSTGRES_USER=odoo&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ich habe hier 2 Container definiert. Einmal den Container &lt;code&gt;web&lt;/code&gt; für die Anwendung an sich, in diesem Fall habe ich mit &lt;code&gt;image: odoo:10.0&lt;/code&gt; ein Image &lt;a href=&#34;https://hub.docker.com&#34;&gt;aus dem Hub&lt;/a&gt; angegeben. Man könnte aber auch ein Dockerfile angeben, dann würde &lt;code&gt;docker-compose&lt;/code&gt; zuerst das image bauen. Als nächstes habe ich mit &lt;code&gt;depends_on&lt;/code&gt; definiert, dass der Container &lt;code&gt;web&lt;/code&gt; von dem Container &lt;code&gt;db&lt;/code&gt; abhängig ist. Das bedeuted auch, dass zuerst &lt;code&gt;db&lt;/code&gt; gestartet wird und dann &lt;code&gt;web&lt;/code&gt;. Ob die PostgreSQL-Datenbank so schnell hoch fährt, dass sie bereit ist, wenn die Anwendung sie benötigt ist unter Umständen nicht gegeben, kann also je nach Anwendungen zu Problemen führen und sollte im im Hinterkopf behalten werden. Im Fall von Odoo ist das allerdings kein Problem. Die Abhängigkeit bietet auch den Vorteil das compose einen Eintrag in der Datei &lt;code&gt;/etc/hosts&lt;/code&gt; vornimmt, so dass man den Datenbank-Container mit seinem Namen referenzieren kann. Mit dem Eintrag &lt;code&gt;volumes&lt;/code&gt; spezifiziere ich 3 bind mounts, die von dem lokalen Dateisystem in das Container Dateisystem zeigen. Über das Schlüsselwort &lt;code&gt;ports&lt;/code&gt; kann ich Port-Weiterleitungen von dem Host-System in dem Container erstellen. Dabei sollte man beachten, dass man Ports immer lokal bindet und nicht auf allen Geräten zur Verfügung stellt. Über &lt;code&gt;environment&lt;/code&gt; kann man zusätzliche Umgebungsvariablen in den Container reinreichen. Bei dem PostgreSQL-Image gibt es z.B. einige Variablen, mit denen man das Image konfigurieren kann.&lt;/p&gt;

&lt;p&gt;Man startet die Komposition mit dem Befehl up:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;$ docker-compose up&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Wenn das System ordentlich hochfährt, kann man es mit STRG+C beenden und dann mit dem parameter &lt;code&gt;-d&lt;/code&gt; starten, damit es im Hintergrund verschwindet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;$ docker-compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Will man die Dienste runterfahren, gibt es den Befehl &lt;code&gt;down&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;$ docker-compose down&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dabei werden sogar etwaige Container schon gelöscht. Aber da der komplette Zustand der beiden Container außerhalb im aktuellen Verzeichnis des Host-Systems gespeichert wird, ist das alles kein Problem.&lt;/p&gt;

&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;

&lt;p&gt;Alles in allem hoffe ich, dass ich darlegen konnte, wieso Container zustandslos (stateless) und unveränderbar (immuteable) sein sollen. Zusätzlich sollte man sich immer bei Docker überlegen, wo sich die Daten befinden. Es ist nämlich schnell und sehr leicht passiert, dass die Daten im Container sind, weil man sich das Image nicht genau angesehen hat oder sich auch einfach nicht überlegt hat, wo die Daten sein könnten.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Home 2001 - Hold</title>
      <link>https://tim.schumacher.im/blog/home-2001-hold/</link>
      <pubDate>Sun, 18 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/home-2001-hold/</guid>
      <description>&lt;p&gt;In der letzten 2 Wochen gefühlt &lt;strong&gt;konstant&lt;/strong&gt; in Dauerschleife.&lt;/p&gt;

&lt;iframe
    width=&#34;100%&#34;
    height=&#34;166&#34;
    scrolling=&#34;no&#34;
    frameborder=&#34;no&#34;
    allow=&#34;autoplay&#34;
    src=&#34;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/217579562&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=true&amp;amp;show_comments=false&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=false&#34;&gt;
&lt;/iframe&gt;

</description>
    </item>
    
    <item>
      <title>Ghost in the Shell Live Action Review</title>
      <link>https://tim.schumacher.im/blog/ghost-in-the-shell-live-action/</link>
      <pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/ghost-in-the-shell-live-action/</guid>
      <description>&lt;p&gt;Heute habe ich mir die Live Action Fassung von &lt;a href=&#34;https://de.wikipedia.org/wiki/Ghost_in_the_Shell&#34;&gt;„Ghost in the
Shell“&lt;/a&gt;
angesehen. Die Kurzzusammenfassung: Nettes Popcorn-Kino, aber bleibt
&lt;em&gt;weit&lt;/em&gt; hinter den Erwartungen zurück.&lt;/p&gt;

&lt;p&gt;Die Handlung des Films ist generisches Science Fiction und bietet
nicht die Tiefe, die ich von einem GITS-Franchise-Produkt gewohnt
bin. Gerade die animierten Filme und Serien aus Japan bieten
&lt;em&gt;wesentlich&lt;/em&gt; mehr Tiefgang und sprechen auch die wichtigen Cyberpunk-Fragen an, I&amp;rsquo;m looking at you Solid Sate Society.&lt;/p&gt;

&lt;p&gt;Die Charakter des Films sind nur ein Abklatsch dessen, was sie in dem
Animé-Universum darstellen. Dazu muss ich allerdings etwas ausholen:
„Public Security Section 9“ ist eine geheime Abteilung aus
Spezialisten, die sich um die Abwehr von Gefahren aus dem „Cyberspace“
kümmert. Mein Punkt ist, dass alle Charaktere sehr viel Erfahrung
haben mit dem was sie tun und das kommt im Animé auch so rüber. Im
Film hingegen wissen die Charaktere zwar wie man mit Waffen umgeht,
aber es wird nicht der Eindruck erweckt, dass es sich um gestandene
Kriegs-Veteranen handelt. Den größten Beef habe ich mit dem Major, der
nur eine leere Hülle seiner selbst ist. Im Quellmaterial ist der Major
ein &lt;a href=&#34;http://tvtropes.org/pmwiki/pmwiki.php/Main/ColonelBadass&#34;&gt;„Major
Badass“&lt;/a&gt;,
im Film hingegen wirkt sie eher schwach und verletzlich.&lt;/p&gt;

&lt;p&gt;Auch wenn die Bilder sehr in das Universum passen, so wurden die
besten Bilder aus dem Animé hier wiederverwendet in die Bildsprache
des Films umgewandelt, was nicht sonderlich kreativ ist.&lt;/p&gt;

&lt;p&gt;Mein Fazit: Mehr Sektion 9, weniger persönliche Geschichte, denn die
ist im Quellmaterial auch nicht die größte Stärke. Auch wäre mehr Mut
zur Kreativität besser gewesen, anstatt alle guten Szenen aus dem
Animé einfach zu kopieren, das Franchise hätte das geboten. Ich kann
nur Empfehlen, sich den &lt;a href=&#34;http://amzn.to/2o8dSLF&#34;&gt;ersten Film
anzusehen&lt;/a&gt;, auch wenn die Veröffentlichung
inzwischen 23 Jahre her ist, ist er keinen deut alt geworden. Das
Thema ist immer noch hoch aktuell und zeigt wie visionär er gewesen
ist.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Über mich</title>
      <link>https://tim.schumacher.im/ueber-mich/</link>
      <pubDate>Sun, 24 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/ueber-mich/</guid>
      <description>

&lt;p&gt;Ich bin ein ornitologisch begeisterter Softwarewentickler und Systemarchitekt aus dem Rheinland, den es für das Studium nach &lt;a href=&#34;http://www.openstreetmap.org/node/240090160&#34;&gt;Jena (Thüringen)&lt;/a&gt; verschlagen hat und gemeinsam mit der großen Liebe wieder in die Heimat zurückgegkehrt ist. Ich gehe gerne wandern, &lt;a href=&#34;https://github.com/enko&#34;&gt;programmiere&lt;/a&gt; viel in meiner Freizeit, unterstütze Freunde und meine Netzwerpartner bei interessanten Projekten, höre &lt;a href=&#34;https://www.youtube.com/user/0xAFFE/videos?shelf_id=0&amp;amp;sort=dd&amp;amp;view=15&#34;&gt;abstruse Musik&lt;/a&gt; und auch sonst habe ich viel Spaß am Leben :)&lt;/p&gt;

&lt;p&gt;Wenn du in meinem Blog einen Rechtschreibfehler findest, kannst du gerne einen &lt;a href=&#34;https://github.com/enko/tim.schumacher.im&#34;&gt;Pull-Request&lt;/a&gt; stellen.&lt;/p&gt;

&lt;h2 id=&#34;kontakt&#34;&gt;Kontakt&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Matrx&lt;/strong&gt;: &lt;a href=&#34;https://matrix.to/#/@tim:schumacher.im&#34;&gt;@tim:schumacher.im&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E-Mail&lt;/strong&gt;: &lt;a href=&#34;mailto:tim@datenknoten.me&#34;&gt;tim@datenknoten.me&lt;/a&gt; (&lt;a href=&#34;https://encrypt.to/0x59AEBF8884CA25D9&#34;&gt;Verschlüsselt&lt;/a&gt;)&lt;/p&gt;

&lt;h2 id=&#34;social-media&#34;&gt;Social Media&lt;/h2&gt;

&lt;p&gt;Im Cyberspace bin ich hier:&lt;/p&gt;

&lt;div class=&#34;ui relaxed divided list&#34;&gt;
  &lt;div class=&#34;item&#34;&gt;
    &lt;i class=&#34;large twitter middle aligned icon&#34;&gt;&lt;/i&gt;
    &lt;div class=&#34;content&#34;&gt;
      &lt;div class=&#34;header&#34;&gt;Twitter&lt;/div&gt;
      &lt;div class=&#34;description&#34;&gt;
        &lt;a href=&#34;https://twitter.com/0xAFFE&#34;&gt;@0xAFFE&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;item&#34;&gt;
    &lt;i class=&#34;large github middle aligned icon&#34;&gt;&lt;/i&gt;
    &lt;div class=&#34;content&#34;&gt;
      &lt;div class=&#34;header&#34;&gt;Github&lt;/div&gt;
      &lt;div class=&#34;description&#34;&gt;
        &lt;a href=&#34;https://github.com/enko&#34;&gt;@enko&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;item&#34;&gt;
    &lt;i class=&#34;large amazon middle aligned icon&#34;&gt;&lt;/i&gt;
    &lt;div class=&#34;content&#34;&gt;
      &lt;div class=&#34;header&#34;&gt;Amazon&lt;/div&gt;
      &lt;div class=&#34;description&#34;&gt;
        &lt;a href=&#34;http://www.amazon.de/registry/wishlist/2ODWLR7VW50OJ&#34;&gt;Amazon&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Mamorkuchen</title>
      <link>https://tim.schumacher.im/blog/marmorkuchen/</link>
      <pubDate>Sun, 15 May 2016 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/marmorkuchen/</guid>
      <description>&lt;p&gt;Mein Rezept für einen kleinen, aber feinen Mamorkuchen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;280g Mehl (Eigentlich Weizenmehl, aber Dinkel geht auch gut und ist meine Wahl)&lt;/li&gt;
&lt;li&gt;1 Päckchen Backpulver&lt;/li&gt;
&lt;li&gt;2 Eier&lt;/li&gt;
&lt;li&gt;260g Milch&lt;/li&gt;
&lt;li&gt;80g Butter&lt;/li&gt;
&lt;li&gt;140g Zucker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die Zubereitung dann so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Die Butter in einem kleinen Topf bei niedrigster Stufe zerlaufen lassen.&lt;/li&gt;
&lt;li&gt;Während die Butter zerläuft, kann man Mehl und Backpuler mit einem &lt;a href=&#34;http://www.amazon.de/gp/product/B000X2ZROE/ref=as_li_tl?ie=UTF8&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=B000X2ZROE&amp;amp;linkCode=as2&amp;amp;tag=httpsdatenknm-21&#34;&gt;Zerstäuber&lt;/a&gt; zerstäuben.&lt;/li&gt;
&lt;li&gt;Dann den Zucker noch unter das Mehl heben.&lt;/li&gt;
&lt;li&gt;Die flüssige Butter in ein anderes Behältniss tun und Milch und Eier dazugeben.&lt;/li&gt;
&lt;li&gt;Dann mit einem Handmixer das Milch-Eier-Butter-Gemisch in die andere Schüssel einarbeiten.&lt;/li&gt;
&lt;li&gt;Wenn der Teig ordentlich durchgerührt ist, zwackt man etwas von dem Teig ab und rührt Kakao unter bis der Teig die gewünschte Farbe hat. Wenn der Teig in dem Prozess zu fest wird, kann man noch etwas Milch nachgießen.&lt;/li&gt;
&lt;li&gt;Dann den Ofen auf 180°C vorwärmen.&lt;/li&gt;
&lt;li&gt;Jetzt eine Kastenform nehmen, mit Butter einreiben und dann noch Mehl in die Form geben, so dass das Mehl an der Butter kleben bleibt.&lt;/li&gt;
&lt;li&gt;Zuerst gibt man den hellen Teig in die Form und danach verteilt man den dunklen Teig in der Mitte längst des hellen Teigs.&lt;/li&gt;
&lt;li&gt;Zum Schluss kann man mit einem Löffel den hellen und dunklen Teig verwirbeln, je nachdem wie es gewünscht ist.&lt;/li&gt;
&lt;li&gt;Der Kuchen braucht etwa 45 Minuten zum Backen.&lt;/li&gt;
&lt;li&gt;Nach 10 Minuten kann man den Kuchen nochmal rausholen, um in der Mitte nochmal aufzuschneiden, damit er die bekannte Form bekommt.&lt;/li&gt;
&lt;li&gt;Ich empfehle nach 30 Minuten alle fünf Minuten nach dem Kuchen zu sehen und wenn er einen guten Eindruck macht, mit einem langen Zahnstocher in den Kuchen reinzustechen. Eenn an dem Holzwerkzeug kein Teig mehr kleben bleibt, ist der Kuchen fertig.&lt;/li&gt;
&lt;li&gt;Wenn der Kuchen fertig ist, lässt man ihn für 10 Minuten abkühlen.&lt;/li&gt;
&lt;li&gt;Dann schneidet man am besten mit einem Messer den Kuchen vom Rand der Form ab, kippt die Form und lässt den Kuchen auf einen Backofenrost fallen. Das sorgt dafür, dass der Kuchen beim Abkühlen gut austrocknen kann und nicht so matschig ist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der fertige Mamorkuchen sieht dann so aus:&lt;/p&gt;


&lt;img  src=&#34;https://tim.schumacher.im/media/blog/mamorkuchen/mamorkuchen.jpg&#34; alt=&#34;Gebackener Marmorkuchen&#34; class=&#34;ui fluid image&#34;&gt;
.
</description>
    </item>
    
    <item>
      <title>Archivist (s/t)</title>
      <link>https://tim.schumacher.im/blog/archivist_st/</link>
      <pubDate>Mon, 16 Nov 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/archivist_st/</guid>
      <description>&lt;div style=&#34;position: relative; overflow: hidden; text-align: center&#34;&gt;
&lt;iframe style=&#34;border: 0; max-width: 700px; width: 100%; height: 900px; margin: 0 auto;&#34; src=&#34;https://bandcamp.com/EmbeddedPlayer/album=3665187972/size=large/bgcol=333333/linkcol=e32c14/transparent=true/&#34; seamless&gt;&lt;a href=&#34;http://archivistmusic.bandcamp.com/album/archivist&#34;&gt;ARCHIVIST by Archivist&lt;/a&gt;&lt;/iframe&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Main Concept - Wir Leben´s Lieber (feat. Boshi San)</title>
      <link>https://tim.schumacher.im/blog/wir-liebens-lieber/</link>
      <pubDate>Sat, 14 Nov 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/wir-liebens-lieber/</guid>
      <description>
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;//www.youtube.com/embed/e-HspRmJ6dQ&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Netzwerksetup über IPv6 Link Local und ansible</title>
      <link>https://tim.schumacher.im/blog/netzwerksetup-ueber-ipv6-link-local-und-ansible/</link>
      <pubDate>Tue, 10 Nov 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/netzwerksetup-ueber-ipv6-link-local-und-ansible/</guid>
      <description>&lt;p&gt;Folgende Problemstellung sei gegeben:&lt;/p&gt;

&lt;p&gt;Man hat ein Image für eine Debian-Instalation, das man auf einem Rechner (Dabei ist es egal, ob echt oder virtuell) aufgespielt hat, kein Netzwerk definiert, man kennt aber die &lt;a href=&#34;https://de.wikipedia.org/wiki/MAC-Adresse&#34;&gt;MAC-Adresse&lt;/a&gt; des Netzwerk-Interfaces und will jetzt das Netzwerk konfigurieren.&lt;/p&gt;

&lt;p&gt;Die Lösung ist relativ einfach, da man über die MAC-Adresse die &lt;a href=&#34;https://de.wikipedia.org/wiki/IPv6#Link-Local-Adressen&#34;&gt;IPv6-Link-Local-Adresse&lt;/a&gt; berechnen kann, mit der man sich dann zum sshd des Rechners verbinden kann.&lt;/p&gt;

&lt;p&gt;Ich zeige nun wie ich das Ganze über &lt;a href=&#34;http://www.ansible.com/&#34;&gt;Ansible&lt;/a&gt; gelöst habe.&lt;/p&gt;

&lt;p&gt;Meine Ordnerstruktur für mein Ansible-Setup sieht so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;. ansible.cfg
. hosts
/ host_vars
|--&amp;gt; . xmpp.int.datenknoten.me
/ playbooks
|--&amp;gt; . network.yml
|--&amp;gt; / filter_plugins
|----&amp;gt; . conv_mac2ll.py
/ templates
|--&amp;gt; network
|----&amp;gt; . interfaces
|----&amp;gt; . resolv.conf
|----&amp;gt; . sysctl.conf&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nun werde ich erklären, was die einzelnen Dateien tun.&lt;/p&gt;

&lt;p&gt;Die Datei &lt;code&gt;hosts&lt;/code&gt; sieht für dieses Beispiel so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[linux_guests]&lt;/span&gt;
&lt;span style=&#34;color:#a6e22e&#34;&gt;xmpp.int.datenknoten.me&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In dem Ordner &lt;code&gt;host_vars&lt;/code&gt; gibt es für jeden Host eine Datei. Für den Rechner xmpp.int.datenknoten.me sieht die Datei so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;---
id: &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
mac: &lt;span style=&#34;color:#ae81ff&#34;&gt;52&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;54&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;:b8:e9:a1&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Das Feld &lt;code&gt;id&lt;/code&gt; enthält eine Zahl, die für die Berechnung der IPv4 NAT Adresse und der globalen IPv6 Adresse benutzt wird. Das Feld &lt;code&gt;mac&lt;/code&gt; ist die MAC-Adresse des Rechners. Diese Adresse wird für die Berechnung der IPv6-Link-Local-Adresse benötigt.&lt;/p&gt;

&lt;p&gt;Die Datei &lt;code&gt;conv_mac2ll.py&lt;/code&gt; enthält ein Python-Skript, welches die eigentliche Berechnung vornimmt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/local/bin/python&lt;/span&gt;

&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;mac2ll&lt;/span&gt;(mac):
    mac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mac&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;)
    mac&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fe&amp;#39;&lt;/span&gt;)
    mac&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ff&amp;#39;&lt;/span&gt;)
    mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; str(int(mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)
    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fe80::&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;]),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(mac[&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;]))


&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FilterModule&lt;/span&gt;(object):
    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&amp;#39; Ansible network jinja2 filters &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filters&lt;/span&gt;(self):
        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mac2ll&amp;#39;&lt;/span&gt;: mac2ll
            }&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Mein eigentliches Playbook für den Netzwerkkram ist dadurch sehr übersichtlich:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;---
- hosts: linux_guests
  vars:
    ansible_ssh_host: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ mac|mac2ll }}%vtnet0&amp;#34;&lt;/span&gt;
  tasks:
    - name: write sysctl.conf to the disk
      copy: src=../templates/network/sysctl.conf dest=/etc/sysctl.conf
    - name: write resolv.conf to the disk
      copy: src=../templates/network/resolv.conf dest=/etc/resolv.conf
    - name: write /etc/network/interfaces
      template: src=../templates/network/interfaces dest=/etc/network/interfaces
    - name: restart networking
      shell: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/sbin/ifdown eth0; /sbin/ifup eth0&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Da ich die Playbooks auf einer FreeBSD Kiste ausführe, heißt das Netzwerk-Interface hier &lt;code&gt;vtnet0&lt;/code&gt;. Unter Linux heißt dieses aller Wahrscheinlichkeit nach &lt;code&gt;eth0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In der &lt;code&gt;sysctl.conf&lt;/code&gt; deaktiviere ich das Router Advertisement Protocol, da ich alles hart verdrahte:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;net.ipv6.conf.all.accept_ra&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
net.ipv6.conf.all.autoconf&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die Namensserver-Konfiguration ist jetzt auch nicht weltbewegend:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;nameserver &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.9
search int.datenknoten.me&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Und zum Schluss das Wichtigste, die Netzwerkkonfiguration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;auto lo
iface lo inet loopback

&lt;span style=&#34;color:#75715e&#34;&gt;# The primary network interface&lt;/span&gt;
auto  eth0
iface eth0 inet static
  address   &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.&lt;span style=&#34;color:#f92672&#34;&gt;{{&lt;/span&gt; id &lt;span style=&#34;color:#f92672&#34;&gt;}}&lt;/span&gt;
  broadcast &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.255
  netmask   &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;.255.255.0
  gateway   &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.1

iface eth0 inet6 static
  address 2a01:4f8:200:2265:3:100::&lt;span style=&#34;color:#f92672&#34;&gt;{{&lt;/span&gt; id &lt;span style=&#34;color:#f92672&#34;&gt;}}&lt;/span&gt;
  netmask &lt;span style=&#34;color:#ae81ff&#34;&gt;112&lt;/span&gt;
  gateway fe80::5054:ff:fe9f:c3e4&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Quarkbrötchen</title>
      <link>https://tim.schumacher.im/blog/quarkbroetchen/</link>
      <pubDate>Tue, 10 Nov 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/quarkbroetchen/</guid>
      <description>&lt;p&gt;Wer auf die Schnelle ein paar Brötchen backen will, dem kann ich folgendes Rezept empfehlen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;250g Quark&lt;/li&gt;
&lt;li&gt;270g Mehl (Ich nehme meistens Dinkel, aber Roggenmehl geht auch gut. Hier kann man gut und gerne experimentieren.)&lt;/li&gt;
&lt;li&gt;1 Päckchen Backpulver&lt;/li&gt;
&lt;li&gt;2 Eier&lt;/li&gt;
&lt;li&gt;1 Prise Salz&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die Zubereitung dann so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alle Zutaten in eine Schüssel geben. Mehl und Backpulver am besten mit einem &lt;a href=&#34;http://www.amazon.de/gp/product/B000X2ZROE/ref=as_li_tl?ie=UTF8&amp;amp;camp=1638&amp;amp;creative=6742&amp;amp;creativeASIN=B000X2ZROE&amp;amp;linkCode=as2&amp;amp;tag=httpsdatenknm-21&#34;&gt;Zerstäuber&lt;/a&gt; zerstäuben, damits nicht klumpt.&lt;/li&gt;
&lt;li&gt;Mittels Handmixer mit Knethaken alles vermengen.&lt;/li&gt;
&lt;li&gt;Eine seperate Schüssel mit Mehl bereitstellen.&lt;/li&gt;
&lt;li&gt;Backblech mit Backpapier bereitstellen.&lt;/li&gt;
&lt;li&gt;Den Backofen auf 180°C vorwärmen.&lt;/li&gt;
&lt;li&gt;Die Hände leicht anfeuchten.&lt;/li&gt;
&lt;li&gt;Ein Stück Teig herrausnehmen und zu einer Kugel formen.&lt;/li&gt;
&lt;li&gt;Kugel im Mehl rollen und aufs Backblech legen.&lt;/li&gt;
&lt;li&gt;Die letzten 3 Schritte so oft wiederholen, bis der Teig komplett verarbeitet wurde.&lt;/li&gt;
&lt;li&gt;Das Blech in den Ofen schieben.&lt;/li&gt;
&lt;li&gt;Die Brötchen brauchen etwa 30 Minuten bis sie fertig sind. Am besten alle 10 Minuten nachsehen, wie weit sie gediehen sind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die fertigen Brötchen sehen bei mir dann so aus:&lt;/p&gt;


&lt;img  src=&#34;https://tim.schumacher.im/media/blog/quarkbroetchen/broetchen.jpg&#34; alt=&#34;&#34; class=&#34;ui fluid image&#34;&gt;
.
</description>
    </item>
    
    <item>
      <title>Überprüfung des Ablaufdatums von DNSSEC gesicherten Zonen in Zabbix</title>
      <link>https://tim.schumacher.im/blog/dnssec-signatur-laufzeitpruefung-mit-zabbix/</link>
      <pubDate>Wed, 09 Sep 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/dnssec-signatur-laufzeitpruefung-mit-zabbix/</guid>
      <description>&lt;p&gt;Wenn man eine über
&lt;a href=&#34;https://de.wikipedia.org/wiki/Domain_Name_System_Security_Extensions&#34;&gt;DNSSEC&lt;/a&gt;
gesicherte Zone betreibt, kennt man das Problem vielleicht: Man hat die
Zone signiert, aber man vergisst nach den 30 Tagen eine neue Signatur
zu erzeugen.&lt;/p&gt;

&lt;p&gt;Ich habe mir dafür inzwischen einen Cronjob angelegt, der in regelmäßigen
Abständen die Zone neu generiert. Aber es ist doch sinnvoll über
Zabbix die Zonen zu überwachen, damit keine Domäne aus dem Raster fällt.&lt;/p&gt;

&lt;p&gt;Ich habe dazu
&lt;a href=&#34;https://github.com/datenknoten/check-rrsig&#34;&gt;check-rrsig&lt;/a&gt; geschrieben,
welches das Ablaufdatum der Signatur überprüft. Das Skript verlangt
als Parameter einen Hostnamen, optional kann man noch einen anderen
Resolver als der aus &lt;code&gt;/etc/resolv.conf&lt;/code&gt; angeben und Debugmeldungen
einschalten. Als erster Schritt wird zuerst der Hostname validiert,
dazu verwende ich die Bibliothek
&lt;a href=&#34;https://github.com/Respect/Validation&#34;&gt;Respect\Validation&lt;/a&gt;. Danach
finde ich den Namensserver heraus, der den Hostnamen zu Verfügung
stellt und frage diesen, über die Bibliothek
&lt;a href=&#34;https://netdns2.com/&#34;&gt;net_dns2&lt;/a&gt; direkt ab, da ich etwaige Caches
umgehe, weil ich ja einen möglichst realistischen Wert haben will. Dann
frage ich von dem Original den ersten &lt;code&gt;RRSIG&lt;/code&gt;-Record ab und extrahiere
bei diesem den Ablaufzeitpunkt. Dann bilde ich noch den Unterschied
zwischen dem aktuellen Datum und dem Ablaufdatum, gebe es zurück und
bin fertig.&lt;/p&gt;

&lt;p&gt;Die Integration in Zabbix ist damit relativ einfach. Man schafft die
phar-Datei auf dem Zabbix-Server nach &lt;code&gt;/etc/zabbix/externalscripts&lt;/code&gt;. Nun
kann mann ein Item entweder in einem Host oder in einem Template erstellen und das Skript
über einen &lt;a href=&#34;https://www.zabbix.com/documentation/2.4/manual/config/items/itemtypes/external&#34;&gt;External
Check&lt;/a&gt;
abrufen und Werte erfassen lassen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mein VPN-Setup</title>
      <link>https://tim.schumacher.im/blog/mein-vpn-setup/</link>
      <pubDate>Sun, 30 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/mein-vpn-setup/</guid>
      <description>

&lt;p&gt;Ziel dieses Artikel ist es, zu zeigen wie mein &lt;a href=&#34;https://openvpn.net/&#34;&gt;OpenVPN&lt;/a&gt;-Setup
funktioniert, wie ich meine Clients konfiguriere und was das für
Vorteile bringt.&lt;/p&gt;

&lt;p&gt;Fangen wir mal mit dem &amp;lsquo;Warum&amp;rsquo; an. Mein initiales Anliegen war in das
virtuelle Netzwerk meines &lt;a href=&#34;https://libvirt.org/&#34;&gt;libvirt&lt;/a&gt;/&lt;a href=&#34;http://www.linux-kvm.org/page/Main_Page&#34;&gt;KVM&lt;/a&gt;-Hostes einzusteigen,
damit ich die virtuellen Maschinen besser verwalten kann. Ich habe
zuerst an &lt;a href=&#34;https://de.wikipedia.org/wiki/IPsec&#34;&gt;IPSec&lt;/a&gt; versucht, bin da aber an der harschen
Internet-Realität gescheitert. So hat mein Internet-Anbieter Kabel
Deutschland fragmentierte UDP-Pakete klammheimlich verworfen. Hat mit
mich einige Zeit gekostet, das rauszufinden. Aber dank
&lt;a href=&#34;http://netalyzr.icsi.berkeley.edu/&#34;&gt;Netalyzr&lt;/a&gt; findet man solche
Sachen dann doch relativ schnell. An dieser Stelle muss ich mal eine
Lanze für Netalyzr brechen. Wenn ihr in ein neues Netz kommt, führt
den Test einmal aus, um euch der Limitationen des Netzes bewusst zu
werden. Dann habe ich mich an OpenVPN versucht und alles funktionierte
ohne mit der Wimper zu zucken.&lt;/p&gt;

&lt;p&gt;Bevor ich jetzt zu der Konfiguration komme, noch ein paar Takte zu
meiner Infrastruktur.&lt;/p&gt;

&lt;h3 id=&#34;infrastruktur&#34;&gt;Infrastruktur&lt;/h3&gt;

&lt;p&gt;Ich habe einen
&lt;a href=&#34;https://www.hetzner.de/hosting/produkte_rootserver/ex40&#34;&gt;Server&lt;/a&gt; bei
Hetzner gemietet, auf dem ich mehrere virtuelle Maschinen mit
unterschiedichen &lt;a href=&#34;https://tim.schumacher.im/dienste&#34;&gt;Diensten&lt;/a&gt; betreibr. Da ich nur eine IPv4-Addresse
habe und aus Kostengründen nichts ändern will, habe ich ein privates
LAN mit NAT für die ganzen virtuellen Rechner eingerichtet. Das
IPv4-Lan hat den Prefix &lt;code&gt;192.168.122.0/24&lt;/code&gt;, dieser Prefix sollte
natürlich auch über das VPN erreichbar sein. Daneben habe ich von
Hetzner einen nativen IPv6 Zugang erhalten und habe den Prefix
&lt;code&gt;2a01:4f8:200:2265::/64&lt;/code&gt;. Was ich im Verlauf des Einrichtens gelernt habe
ist: Wenn man verschiedene Unterinfrastrukturen hat, sollte man diese auch
mit eigenen Prefixen beglücken. So habe ich den /64 in mehrere
/112-Netze aufgeteilt. Die virtuellen Server haben den Prefix
&lt;code&gt;2a01:4f8:200:2265:3::/112&lt;/code&gt; und das VPN-Netz hat
&lt;code&gt;2a01:4f8:200:2265:4::/112&lt;/code&gt;. Was ich in diesem Kontext auch gelernt
habe, das &lt;code&gt;2000::/3&lt;/code&gt; der komplette öffentlich routbare Teil von IPv6
ist. Zum Schluss sei noch gesagt, dass ich einen
&lt;a href=&#34;https://de.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol&#34;&gt;LDAP&lt;/a&gt;-Verzeichnis
betreibe, in welchem ich Benutzer verwalte. Das sollte auch an das OpenVPN
angebunden werden. Soviel zur Infrastruktur, jetzt zur Konfiguration:&lt;/p&gt;

&lt;h3 id=&#34;server-konfiguration&#34;&gt;Server Konfiguration&lt;/h3&gt;

&lt;p&gt;Meine Server Konfiguration sieht so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;# Crypto konfigurieren
ca /etc/ipsec.d/cacerts/cacert.pem
cert /etc/ipsec.d/certs/node2.datenknoten.me.pem
key /etc/ipsec.d/private/node2.datenknoten.me.pem
dh /etc/ipsec.d/dh4096.pem

# Netzwerk aufsetzen
server 10.8.0.0 255.255.255.0
server-ipv6 2a01:4f8:200:2265:4::1/112
push &amp;#34;route 192.168.122.0 255.255.255.0&amp;#34;
push &amp;#34;redirect-gateway def1 bypass-dhcp&amp;#34;
push &amp;#34;route-ipv6 2000::/3&amp;#34;
push &amp;#34;dhcp-option DNS 192.168.122.9&amp;#34;

# Einstellungen
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
cipher AES-256-CBC
port 1194
proto tcp
dev tun

# LDAP aktivieren
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Die LDAP-Konfiguration sieht so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;LDAP&amp;gt;&lt;/span&gt;
        URL             ldaps://ldap.datenknoten.me
        BindDN          cn=systemuser,ou=users,dc=datenknoten,dc=me
        Password        tolles passwort
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/LDAP&amp;gt;&lt;/span&gt;

&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Authorization&amp;gt;&lt;/span&gt;
        BaseDN          &amp;#34;ou=users,dc=datenknoten,dc=me&amp;#34;
        SearchFilter    &amp;#34;(uid=%u)&amp;#34;
        RequireGroup    false
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Group&amp;gt;&lt;/span&gt;
                BaseDN          &amp;#34;ou=groups,dc=datenknoten,dc=me&amp;#34;
                SearchFilter    &amp;#34;cn=vpnusers&amp;#34;
                MemberAttribute memberUid
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/Group&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/Authorization&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hier ist anzufügen, dass die Limitierung auf die Gruppe &lt;code&gt;vpnusers&lt;/code&gt;
irgendwie nie geklappt hat. Für sachdienliche Hinweise wäre ich sehr
dankbar.&lt;/p&gt;

&lt;p&gt;Als nächstes muss auf dem Server noch die Firewall eingerichtet
werden. Ich benutze das Programm
„&lt;a href=&#34;http://ferm.foo-projects.org/&#34;&gt;Ferm&lt;/a&gt;”, um meine &lt;a href=&#34;http://www.netfilter.org/projects/iptables/&#34;&gt;IPTables&lt;/a&gt;-Regeln zu
verwalten. Entsprechend sieht mein Script so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;75
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -*- shell-script -*-&lt;/span&gt;
#
&lt;span style=&#34;color:#75715e&#34;&gt;#  Configuration file for ferm(1).&lt;/span&gt;
#

@def $DEV_WORLD &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; eth0;
@def $DEV_DMZ &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; virbr1;

@def $HOST_STATIC &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;144&lt;/span&gt;.76.154.114;


@def $DEV_PRIVATE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; virbr1;
@def $NET_PRIVATE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.0/24;

@def $DEV_VPN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; tun0;
@def $NET_VPN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;.8.0.0/24;

&lt;span style=&#34;color:#75715e&#34;&gt;# convenience function which creates both the nat/DNAT and the filter/FORWARD&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# rule&lt;/span&gt;
@def &amp;amp;FORWARD_TCP&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$proto, $port, $dest&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color:#75715e&#34;&gt;# interface (lo $DEV_WORLD $DEV_VPN $DEV_PRIVATE)&lt;/span&gt;
    table filter chain FORWARD outerface $DEV_DMZ daddr $dest proto $proto dport $port ACCEPT;
    table nat chain PREROUTING daddr $HOST_STATIC proto $proto dport $port DNAT to $dest;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

table filter &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
    chain INPUT &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
        policy ACCEPT;

        mod state state INVALID DROP;
        mod state state &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;ESTABLISHED RELATED&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ACCEPT;

        interface $DEV_DMZ proto &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;tcp udp&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; dport &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;53&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;67&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ACCEPT;
    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
    chain OUTPUT &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
        policy ACCEPT;
    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
    chain FORWARD &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
        policy ACCEPT;
        mod state state INVALID DROP;
        mod state state &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;ESTABLISHED RELATED&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ACCEPT;
        interface $DEV_PRIVATE ACCEPT;
        interface $DEV_VPN mod conntrack ctstate NEW ACCEPT;
        mod conntrack ctstate &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;ESTABLISHED RELATED&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ACCEPT;
    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

table nat &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
    chain POSTROUTING &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
        &lt;span style=&#34;color:#75715e&#34;&gt;# masquerade private IP addresses&lt;/span&gt;
        saddr &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$NET_PRIVATE $NET_VPN&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; outerface $DEV_WORLD MASQUERADE;
    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

domain ip6 &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
    table filter &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
        chain INPUT &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
            policy ACCEPT;
        &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
        chain OUTPUT &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
            policy ACCEPT;
        &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
        chain FORWARD &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
            policy ACCEPT;
            interface &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$DEV_WORLD $DEV_VPN&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; outerface $DEV_DMZ daddr 2a01:4f8:200:2265::/64 ACCEPT;
            outerface &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$DEV_WORLD $DEV_VPN&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; interface $DEV_DMZ saddr 2a01:4f8:200:2265::/64 ACCEPT;
            interface $DEV_DMZ outerface $DEV_DMZ ACCEPT;
            interface &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$DEV_WORLD $DEV_VPN&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; outerface $DEV_DMZ REJECT reject-with icmp6-port-unreachable;
            outerface &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;$DEV_WORLD $DEV_VPN&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; interface $DEV_DMZ REJECT reject-with icmp6-port-unreachable;

        &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

&amp;amp;FORWARD_TCP&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;tcp, &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;443&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;192&lt;/span&gt;.168.122.2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Es empfiehlt sich natürlich, sich etwas mit der Materie auseinanderzusetzen, damit man versteht, was ich hier schreibe. Vieles, was in diesen Konfigurations-Dateien steht, hat sich über die Jahre so entwickelt.&lt;/p&gt;

&lt;h3 id=&#34;client-konfiguration-linux&#34;&gt;Client Konfiguration (Linux)&lt;/h3&gt;

&lt;p&gt;Unter Linux ist bis auf einen Punkt eigentlich alles sehr entspannt. Das Problem ist, dass der DNS-Server, den ich bereitstelle, nicht übernommen wird. Dafür gibt es eine Lösung und jetzt erstmal die Config:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;client
dev tun
proto tcp
remote &lt;span style=&#34;color:#ae81ff&#34;&gt;144&lt;/span&gt;.76.154.114
resolv-retry infinite
nobind
persist-key
persist-tun
ca dk-ca.crt
cert manjaro.crt
key manjaro.key
verb &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
cipher AES-256-CBC
auth SHA1
reneg-sec &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
route-delay &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
comp-lzo no
auth-user-pass
script-security &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
up /home/hana/openvpn/datenknoten/update-dns
down /home/hana/openvpn/datenknoten/update-dns&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2 Anmerkungen: Zum einen sei hier der Eintrag &lt;code&gt;auth-user-pass&lt;/code&gt;
hervorzuheben, der den Client auffordert sich Zugangsdaten vom
Benutzer zu erfragen. Zum anderen die letzten 3 Zeilen. Diese sorgen
nämlich mittels einem kleinen Skript, welches
&lt;a href=&#34;http://roy.marples.name/projects/openresolv/index&#34;&gt;openresolv&lt;/a&gt;
aufruft, dafür, dass die mitgelieferten DNS-Server in die Datei &lt;code&gt;/etc/resolv.conf&lt;/code&gt;
eingetragen werden. Hier das Skript:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;61
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;#
&lt;span style=&#34;color:#75715e&#34;&gt;# Parses DHCP options from openvpn to update resolv.conf&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# To use set as &amp;#39;up&amp;#39; and &amp;#39;down&amp;#39; script in your openvpn *.conf:&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# up /etc/openvpn/update-resolv-conf&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# down /etc/openvpn/update-resolv-conf&lt;/span&gt;
#
&lt;span style=&#34;color:#75715e&#34;&gt;# Used snippets of resolvconf script by Thomas Hood &amp;lt;jdthood@yahoo.co.uk&amp;gt;&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# and Chris Hanson&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# 07/2013 colin@daedrum.net Fixed intet name&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# 05/2006 chlauber@bnc.ch&lt;/span&gt;
#
&lt;span style=&#34;color:#75715e&#34;&gt;# Example envs set from openvpn:&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# foreign_option_1=&amp;#39;dhcp-option DNS 193.43.27.132&amp;#39;&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# foreign_option_2=&amp;#39;dhcp-option DNS 193.43.27.133&amp;#39;&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# foreign_option_3=&amp;#39;dhcp-option DOMAIN be.bnc.ch&amp;#39;&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# foreign_option_4=&amp;#39;dhcp-option DOMAIN-SEARCH bnc.local&amp;#39;&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;## You might need to set the path manually here, i.e.&lt;/span&gt;
RESOLVCONF&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/sbin/resolvconf

&lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; $script_type in

up&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; optionname in &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;!foreign_option_*&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
    option&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;!optionname&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
    echo $option
    part1&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$option&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | cut -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -f &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$part1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dhcp-option&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
      part2&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$option&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | cut -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -f &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
      part3&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$option&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | cut -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -f &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$part2&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DNS&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
        IF_DNS_NAMESERVERS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$IF_DNS_NAMESERVERS&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;$part3&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$part2&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DOMAIN&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$part2&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DOMAIN-SEARCH&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
        IF_DNS_SEARCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$IF_DNS_SEARCH&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;$part3&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
  R&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$IF_DNS_SEARCH&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    R&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;search &amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; DS in $IF_DNS_SEARCH ; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
      R&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;R&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;$DS&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
  R&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;R&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;

  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; NS in $IF_DNS_NAMESERVERS ; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
    R&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;R&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;nameserver &lt;/span&gt;$NS&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
  &lt;span style=&#34;color:#75715e&#34;&gt;#echo -n &amp;#34;$R&amp;#34; | $RESOLVCONF -p -a &amp;#34;${dev}&amp;#34;&lt;/span&gt;
  echo -n &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$R&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; | $RESOLVCONF -a &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;dev&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.inet&amp;#34;&lt;/span&gt;
  ;;
down&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  $RESOLVCONF -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;dev&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.inet&amp;#34;&lt;/span&gt;
  ;;
&lt;span style=&#34;color:#66d9ef&#34;&gt;esac&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;client-konfiguration-android&#34;&gt;Client Konfiguration (Android)&lt;/h3&gt;

&lt;p&gt;Unter Android benutze ich &lt;a href=&#34;http://ics-openvpn.blinkt.de/&#34;&gt;OpenVPN for
android&lt;/a&gt;, welches es auch im &lt;a href=&#34;https://f-droid.org/repository/browse/?fdfilter=openvpn&amp;amp;fdid=de.blinkt.openvpn&#34;&gt;F-Droid
Store&lt;/a&gt;
gibt.&lt;/p&gt;

&lt;p&gt;Das Einrichten ist einfach und es gibt nichts zu beachten. Als ich das
VPN eingerichtet habe, habe ich einen Bug in dem von mir benutzen
XMPP-Client &lt;a href=&#34;http://conversations.im/&#34;&gt;Conversations&lt;/a&gt; gefunden, weil
dieser, bzw. die darunterliegende DNS-Bibliothek die DNS-Server nicht
richtig bestimmen
&lt;a href=&#34;https://github.com/rtreffer/minidns/issues/12&#34;&gt;konnte&lt;/a&gt; (Ist
inzwischen behoben).&lt;/p&gt;

&lt;h3 id=&#34;fazit&#34;&gt;Fazit&lt;/h3&gt;

&lt;p&gt;Insgesamt bin ich mit dem Setup sehr zufrieden, vorallem weil es
kaputte Netze brauchbar macht, da ich durch das VPN ein zensurfreies
Netz, IPv6, einen DNSSEC fähigen Resolver bekomme. Bei Fragen könnt
ihr mich entweder per &lt;a href=&#34;mailto:tim@datenknoten.me&#34;&gt;E-Mail&lt;/a&gt;, im
&lt;a href=&#34;https://www.krautspace.de/chat2/&#34;&gt;Chat&lt;/a&gt; des
&lt;a href=&#34;https://www.krautspace.de/&#34;&gt;Krautspaces&lt;/a&gt; kontaktieren oder
hinterlasst einen Kommentar am Ende.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Postfix mit Zabbix überwachen</title>
      <link>https://tim.schumacher.im/blog/postfix-zabbix-ueberwachen/</link>
      <pubDate>Tue, 11 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/postfix-zabbix-ueberwachen/</guid>
      <description>

&lt;p&gt;Hinweis: Dies ist eine Übersetzung ins Deutsche von &lt;a href=&#34;http://lifeisabug.com/postfix-statistical-graphs-zabbix-using-passive-checks/&#34;&gt;Zabbix: Postfix statistical graphs using passive checks&lt;/a&gt;. Zusätzlich habe ich das Zabbix-Template und das Skript hier noch gespiegelt.&lt;/p&gt;

&lt;p&gt;Diese Anleitung hilft bei der Erstellung von passiven Checks. Es gibt dazu ein Skript, welches mit &lt;a href=&#34;http://www.fourmilab.ch/webtools/logtail/&#34;&gt;logtail&lt;/a&gt; und &lt;a href=&#34;http://jimsun.linxnet.com/postfix_contrib.html&#34;&gt;pflogsumm&lt;/a&gt; die Postfix Log-Dateien auswertet und in eine Statistik-Datei schreibt. Zum Schluss wird ein &lt;code&gt;UserParameter&lt;/code&gt; erstellt, welcher die Daten aus der Statistik-Datei an Zabbix weitergibt.&lt;/p&gt;

&lt;h3 id=&#34;vorraussetzungen-installieren&#34;&gt;Vorraussetzungen installieren&lt;/h3&gt;

&lt;p&gt;Wir müssen pflogsumm und logtail installieren. Bei &lt;a href=&#34;https://www.debian.org/&#34;&gt;Debian&lt;/a&gt; sieht das so aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;$ apt-get install pflogsumm logtail&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;skript-einrichten&#34;&gt;Skript einrichten&lt;/h3&gt;

&lt;p&gt;Das &lt;a href=&#34;https://tim.schumacher.im/media/blog/postfix-zabbix-ueberwachen/postfix-zabbix-stats.bash&#34;&gt;Skript&lt;/a&gt; muss als &lt;code&gt;postfix-zabbix-stats.bash&lt;/code&gt; in &lt;code&gt;/usr/local/bin&lt;/code&gt; gespeichert werden und als ausführbar (&lt;code&gt;+x&lt;/code&gt;) markiert werden.&lt;/p&gt;

&lt;p&gt;Danach legt man einen Cronjob für das Skript an, damit es die Statistik-Datei schreiben kann:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cron&#34; data-lang=&#34;cron&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-cron&#34; data-lang=&#34;cron&#34;&gt;*/5 * * * * /usr/local/bin/postfix-zabbix-stats.bash&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;zabbix-agent-einrichten&#34;&gt;Zabbix Agent einrichten&lt;/h3&gt;

&lt;p&gt;In der Datei &lt;code&gt;/etc/zabbix/zabbix_agentd.conf&lt;/code&gt; muss man den Wert &lt;code&gt;EnableRemoteCommands&lt;/code&gt; auf 1 setzen.&lt;/p&gt;

&lt;p&gt;Danach erstellt man eine Datei &lt;code&gt;/etc/zabbix/zabbix_agentd.conf.d/postfix.conf&lt;/code&gt; mit folgendem Inhalt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;UserParameter&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;postfix.pfmailq,mailq | grep -v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Mail queue is empty&amp;#34;&lt;/span&gt; | grep -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^[0-9A-Z]&amp;#39;&lt;/span&gt;
UserParameter&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;postfix&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;*&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,/usr/local/bin/postfix-zabbix-stats.bash $1&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Anschließend kannst du den Agenten neustarten.&lt;/p&gt;

&lt;h3 id=&#34;zabbix-template-importieren&#34;&gt;Zabbix Template importieren&lt;/h3&gt;

&lt;p&gt;Nun muss man das &lt;a href=&#34;https://tim.schumacher.im/media/blog/postfix-zabbix-ueberwachen/smtp_and_postfix_passive_checks_zabbix_template.xml&#34;&gt;Template&lt;/a&gt; importieren und dem Host, auf dem Postfix läuft, zuweisen und schon ist man fertig und bekommt nette Postfix-Statistiken.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DNSSEC mit Bind &amp; OVH</title>
      <link>https://tim.schumacher.im/blog/dnssec-mit-bind-und-ovh/</link>
      <pubDate>Tue, 04 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/dnssec-mit-bind-und-ovh/</guid>
      <description>&lt;p&gt;Ich habe gestern im &lt;a href=&#34;https://www.krautspace.de/&#34;&gt;Krautspace&lt;/a&gt; ein paar Takte zu &lt;a href=&#34;http://en.wikipedia.org/wiki/Domain_Name_System&#34;&gt;DNS&lt;/a&gt; im Allgemeinen und &lt;a href=&#34;http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions&#34;&gt;DNSSEC&lt;/a&gt; im Speziellen erzählt.&lt;/p&gt;

&lt;p&gt;Ziel des Abends war es, die &lt;a href=&#34;http://en.wikipedia.org/wiki/Shibboleth&#34;&gt;Schibboleth&lt;/a&gt; vorzustellen, die es braucht um DNSSEC mit Bind und OVH zum laufen zu bekommen und diese will ich hier nochmal für die Nachwelt hinterlassen. Ich habe das ganze für die Domain „kaoskinder.de“ gemacht.&lt;/p&gt;

&lt;p&gt;Zurest erzeugt man einen „zone signing key“:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;dnssec-keygen -a RSASHA512 -b &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt; -n ZONE kaoskinder.de&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Danach brauchts noch einen „key signing key“:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;dnssec-keygen -f KSK -a RSASHA512 -b &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt; -n ZONE kaoskinder.de&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Diese Befehle erzeugen 4 Dateien:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kkaoskinder.de.+010+11091.key&lt;/li&gt;
&lt;li&gt;Kkaoskinder.de.+010+11091.private&lt;/li&gt;
&lt;li&gt;Kkaoskinder.de.+010+13430.key&lt;/li&gt;
&lt;li&gt;Kkaoskinder.de.+010+13430.private&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die key-Dateien enthalten die öffentlichen Schlüssel und die private-Dateien aus offensichtlichen Gründen die privaten Schlüssel.&lt;/p&gt;

&lt;p&gt;Als nächstes inkludiert man die key-Dateien in die Zone-Datei:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dns&#34; data-lang=&#34;dns&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dns&#34; data-lang=&#34;dns&#34;&gt;$INCLUDE Kkaoskinder.de.+010+11091.key
$INCLUDE Kkaoskinder.de.+010+13430.key&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Danach muss man die zone-Datei unterschreiben:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;dnssec-signzone -A -3 &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;head -c &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt; /dev/random | sha1sum | cut -b &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;-16&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; -N INCREMENT -o kaoskinder.de -t db.kaoskinder.de.zone&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Diesen Schritt muss man alle 30 Tage wiederholen, da dann die Signaturen auslaufen.&lt;/p&gt;

&lt;p&gt;Der letzte Schritt erzeugt eine unterschriebene Zonen-Datei „db.kaoskinder.de.zone.signed“, diese muss dann noch in die bind-Konfiguration eintragen.&lt;/p&gt;

&lt;p&gt;Jetzt kann man z.B. mit dem &lt;a href=&#34;http://dnssec-debugger.verisignlabs.com/&#34;&gt;Verisign DNSSEC Debugger&lt;/a&gt; schonmal testen ob DNSSEC funktioniert. Es wird noch eine Fehlermeldung kommen, das kein DS-Record in der übergeordneten Zone existiert. Dieser Fehler wird in dem nächsten Schritt behoben, in dem wir unseren öffentlichen Schlüssel bei &lt;a href=&#34;http://www.ovh.de/&#34;&gt;OVH&lt;/a&gt; eintragen.&lt;/p&gt;

&lt;p&gt;Dazu loggt man sich im &lt;a href=&#34;https://www.ovh.de/managerv3/login.pl?xsldoc=&amp;amp;domain=&amp;amp;time=&amp;amp;language=de&amp;amp;csid=&amp;amp;ticketId=&amp;amp;level=&#34;&gt;alten OVH Interface&lt;/a&gt; ein. Danach wählt man oben die gewünschte Domain, wählt im linken Menü „Domain &amp;amp; DNS“, dann rechts oben „Sichere Delegation (DNSSEC)“. Dort klickt man auf „Änderung“.&lt;/p&gt;

&lt;p&gt;Jetzt sucht man sich eine der beiden key-Dateien aus, ich habe jetzt die Datei „Kkaoskinder.de.+010+11091.key“ ausgewählt. Die Datei sieht wie folgt aus:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dns&#34; data-lang=&#34;dns&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-dns&#34; data-lang=&#34;dns&#34;&gt;; This is a key-signing key, keyid 11091, for kaoskinder.de.
; Created: 20150407191914 (Tue Apr  7 21:19:14 2015)
; Publish: 20150407191914 (Tue Apr  7 21:19:14 2015)
; Activate: 20150407191914 (Tue Apr  7 21:19:14 2015)
kaoskinder.de. IN DNSKEY 257 3 10 AwEAAZ5v3RLmjVMcjEodqam6IXkkG9NQp3G88hddDY1VClGtIsJtgU42 6t61fDrKoHFRn607lbn06OkCre9fWBophP4xTt9sX877yNb1LRtOpLAS lEYY8p4w6OiDv3CMoyT6oO7j+L3g3puYc+57NmFa4hzWFrEF4RuVis4b argcPudoTISwA+/DB3C5UNwOQB5WsnSEXd4krVO/49Gs2FIOCj3/4Ja6 g/v3x0R3axkLZV1PnawYlDVpAI0qI3xXhxlzZvT64GI+HYQds3Im+Bvs aMO1S224xm/99v0TKwSLfPenX3DW0VpRY5efvUgVUu8zl6HaEQolLLmu ZaKVe9kEn/9mzDX30SkBtNNc0athdNDRofd710n86SnybDpn5K0qME7W qcW6n53voAaObv1yR3dmvFsVeu2dRhYHHqOzMH94JnqixsjTAGH80DKR ZjMEK666Va1jgBY928XPRx3zH8thQe+FrOK4Ad/kihZYwi9kovKeGBdl VVZDoI/CaRjdhSzpBShyXakNhNWtSo/qs7QN4TjxDdN9TYPKLSToIc2m mzvG/u5saTh/oTDSkP9Xh3bOceFKAV5iJJDVo5oDEUYNCyQL5YvcYJ1R tD2Fb1mzIrvPyOq5q3MDDhTjPEqBqiiVYwDKJ4eMy81AuxLUG4+Bekbc iprdIfcp3HdR6QAZ&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Der Wert nach keyid trägt man bei Kennung ein, die Zahl nach DNSKEY wählt man bei Flags aus. Als Algorithmus wählt man 10. Bei „öffentlicher Schlüssel“ trägt man den ganzen Kram hinter der 10 ein, also von „AwEAAZ5v“ bis „HdR6QAZ“. Dann klickt man auf „Bestätigen“ und wartet auf die Erfolgsmeldung.&lt;/p&gt;

&lt;p&gt;Jetzt da die Zone per DNSSEC gesichert ist, kann man sich auch den schönen Sachen wie &lt;a href=&#34;http://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities&#34;&gt;DANE&lt;/a&gt; oder &lt;a href=&#34;http://de.wikipedia.org/wiki/SSHFP_Resource_Record&#34;&gt;SSHFP&lt;/a&gt; hinwenden.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cold Coffee Experiment</title>
      <link>https://tim.schumacher.im/blog/cold-coffee-experiment/</link>
      <pubDate>Tue, 19 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/cold-coffee-experiment/</guid>
      <description>&lt;p&gt;Umgangssprachlich steht „kalter Kaffee“ ja für eine veraltete Nachricht, aber nicht in meinem Fall. Denn der
kalte Kaffee ist diesmal wörtlich zu nehmen. Es gibt nämlich die Möglichkeit Kaffee kalt zu brühen. Hier eine kleine
Beschreibung von dem, was ich gemacht habe.&lt;/p&gt;

&lt;p&gt;Ich habe zuerst alles gesammelt was ich so brauche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200 Gram Kaffeepulver&lt;/li&gt;
&lt;li&gt;1 Liter Wasser&lt;/li&gt;
&lt;li&gt;1 Kaffeefilter (Hatte ich nicht da, ich habe stattdessen ein feines Sieb genommen)&lt;/li&gt;
&lt;li&gt;2 große Behälter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ich habe das Pulver in den Behälter gegeben und dann nochmal gut umgerührt, damit das ganze Pulver auch feucht wurde.
Das sah dann so aus:&lt;/p&gt;


&lt;img  src=&#34;https://tim.schumacher.im/media/blog/cold-coffee-experiment/pre-cold-coffee.jpg&#34; alt=&#34;freshly brewed cold coffee&#34; class=&#34;ui fluid image&#34;&gt;
.

&lt;p&gt;Dann war erstmal das große Warten angesagt. Um genau zu sein 12 Stunden. Danach habe ich den Kaffee gefiltert. Die
einfache Variante zum Filtern ist wie oben schon geschrieben ein normaler Kaffeefilter. Da ich sowas aber nicht zur verfügung
hatte, verwendete ich ein feines Sieb. Das hat auch gut funktioniert. Mein gefiltertes Produkt sah so aus:&lt;/p&gt;


&lt;img  src=&#34;https://tim.schumacher.im/media/blog/cold-coffee-experiment/post-cold-coffee.jpg&#34; alt=&#34;freshly brewed cold coffee&#34; class=&#34;ui fluid image&#34;&gt;
.

&lt;p&gt;Eine wichtiger Hinweis: Das hier ist ein Konzentrat, also besser nicht unverdünnt trinken. &lt;a href=&#34;http://www.espressoblog.de/page5/page5.html&#34;&gt;Meine Anleitung&lt;/a&gt; schlägt
2 Einheiten warmes Wasser auf 1 Einheit Konzentrat vor. Mir war das allerdings immer noch etwas zu stramm und ich hatte
danach Mühe die Finger ruhig zu halten.&lt;/p&gt;

&lt;p&gt;So als Fazit kann ich sagen, dass jeder der gerne Kaffee trinkt, es auf jeden Fall ausprobieren sollte. Kalt gebrühter
Kaffee ist im Geschmack wesentlich milder, auch wenn er seine Wirkung immer noch, wenn nicht noch besser entfaltet. Die
Kehrseite ist natürlich der erhöhte Aufwand der Zubereitung. Ich werde für den Morgenkaffee erstmal bei warm Gebrühtem
bleiben. Aber wenn es mal wieder wärmer wird, werde ich das nochmal angehen, den Mixer auspacken, ein paar Eiswürfel,
Vanille-Eis, etwas Milch und ordentlich Kaffee-Konzentrat reinschütten, eben einen leckeren Eis-Kaffee zubereiten und genießen ;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Some easy Jazz!</title>
      <link>https://tim.schumacher.im/blog/essential-a-genius/</link>
      <pubDate>Tue, 19 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/essential-a-genius/</guid>
      <description>&lt;p&gt;Mal was locker flockigen Jazz für zwischendurch.&lt;/p&gt;

&lt;iframe width=&#34;100%&#34; height=&#34;400&#34; src=&#34;https://www.mixcloud.com/widget/iframe/?feed=%2FBoycutter%2Fessentially-a-genius-vol1-miles-davis%2F&#34; frameborder=&#34;0&#34; &gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>Unendliche Weiten</title>
      <link>https://tim.schumacher.im/blog/unendliche-weiten/</link>
      <pubDate>Tue, 19 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/unendliche-weiten/</guid>
      <description>&lt;p&gt;Ich finde ja, oft kommt es nicht so richtig rüber, wie weit und unermesslich das Weltall ist. In dem Video „Riding light“
sieht der Betrachter wie sich das Licht der Sonne vom Inneren unseres Sonnensystems bis zum Planeten Jupiter in Echtzeit
bewegt. Einen anderen Ansatz verfolgte das Video „&lt;a href=&#34;https://www.youtube.com/watch?v=0fKBhvDjuy0&#34;&gt;Power of Ten&lt;/a&gt;“ aus dem
Jahr 1977, in dem in 10s die Entfernung immer um 10 mulitipliziert wurde.&lt;/p&gt;


&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;//player.vimeo.com/video/117815404&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
 &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>DJ Scientist &amp; DJ Arok present: Godly Grooves</title>
      <link>https://tim.schumacher.im/blog/godly-grooves/</link>
      <pubDate>Mon, 24 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/godly-grooves/</guid>
      <description>&lt;p&gt;Sehr sehr abgefahrener Kram. den hier DJ Scientist and DJ Arok ausgegraben haben. Teilweise echt sehr, sehr gute Teile dabei. Der Inhalt, nunja ;-).&lt;/p&gt;

&lt;iframe
    width=&#34;100%&#34;
    height=&#34;166&#34;
    scrolling=&#34;no&#34;
    frameborder=&#34;no&#34;
    allow=&#34;autoplay&#34;
    src=&#34;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/1158498&amp;amp;color=%23ff5500&amp;amp;auto_play=false&amp;amp;hide_related=true&amp;amp;show_comments=false&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=false&#34;&gt;
&lt;/iframe&gt;

</description>
    </item>
    
    <item>
      <title>Messer — Lügen</title>
      <link>https://tim.schumacher.im/blog/messer-luegen/</link>
      <pubDate>Thu, 20 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>https://tim.schumacher.im/blog/messer-luegen/</guid>
      <description>
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;//www.youtube.com/embed/mXwKG1mSZ60&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

</description>
    </item>
    
  </channel>
</rss>