<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[IT-Kitchen]]></title><description><![CDATA[Aus dem Leben eines Fachinformatikers.]]></description><link>https://blog.kthx.at/</link><image><url>http://blog.kthx.at/favicon.png</url><title>IT-Kitchen</title><link>https://blog.kthx.at/</link></image><generator>Ghost 2.38</generator><lastBuildDate>Fri, 17 Apr 2026 05:15:46 GMT</lastBuildDate><atom:link href="https://blog.kthx.at/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Einfach durchoptimierte Docker-Images mit Multi-Stage Builds]]></title><description><![CDATA[Docker Images einfacher schreiben und trotzdem gleichzeitig besser optimieren... das geht mit Multi-Stage Builds! Wo sind die Vorteile gegenüber anderen Methoden und wie geht es?]]></description><link>https://blog.kthx.at/2018/08/27/multi-stage-builds-in-docker/</link><guid isPermaLink="false">5b83b0438eaede0001073d6f</guid><category><![CDATA[Docker]]></category><category><![CDATA[Optimierung]]></category><category><![CDATA[Dockerfiles]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Docker-Images]]></category><category><![CDATA[Einfach aber sauber]]></category><dc:creator><![CDATA[Carl]]></dc:creator><pubDate>Mon, 27 Aug 2018 09:18:37 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2018/08/docker-banner.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2018/08/docker-banner.png" alt="Einfach durchoptimierte Docker-Images mit Multi-Stage Builds"><p>Ich und andere Autoren des IT-Kitchens sind regelmäßige Nutzer von <a href="https://docker.com">Docker</a>. Es erlaubt uns auf einfache Art und Weise viele Serverprogramme und sonstige Tools ohne komplizierte Installationsprozesse und isoliert in ihrer eigenen Laufzeitumgebung aufzusetzen.</p>
<p>Voraussetzung für das einfache Aufsetzen von Programmen ist jedoch, dass für diese Programme ein sogenanntes <em>Image</em> existiert. In diesem Image ist zusammen mit dem Programm auch alles vorinstalliert was das Programm braucht um ihren Job zu erfüllen. Wenn man Glück hat, gibt es so ein Image bereits vorgebaut in einem Repository wie dem <a href="https://hub.docker.com">Docker Hub</a>. Ansonsten muss man selber so ein Image bauen, und das ist nun mal ein Prozess für sich.</p>
<p>In diesem Beitrag geht es um den Teil des Prozesses, der sich damit befasst, ein eigens geschriebenes Image zu optimieren, so dass <strong>wirklich</strong> nur das was man braucht und nicht mehr vorinstalliert ist. Ein typisches Szenario wäre zum Beispiel das Bauen einer JavaScript-basierten Web-App vom Quelltext.</p>
<p>Unsere App die wir bauen wollen benötigt eine Installation von Node.js und dessen Paketverwaltung NPM. Mit NPM werden alle in der App notierten Abhängigkeiten nachinstalliert, die für das Erzeugen von HTML-, JavaScript- und CSS-Dateien für den Browser benötigt werden. Diese Tools sind allerdings <strong>nur zur Bauzeit</strong>, und nicht zur Laufzeit notwendig!</p>
<h6 id="altemethodestepbystep">Alte Methode: Step by step</h6>
<p>Es gibt mehrere Wege dieses Problem nun anzugehen. Entweder baut man einmal die App und schifft dann das komplette Verzeichnis mit, ohne sich weiter Gedanken darum zu machen. Das hat den offensichtlichen Nachteil, dass der gesamte Quelltext samt nun unnötiger Entwicklungsumgebung und sonstigen eventuell übergroßen Ressourcen in dem Image mitgeliefert werden. Wir haben auch das Problem, dass wir uns zwischen dem <code>nginx</code> und dem <code>node</code> Image als Basis entscheiden müssen - das Nginx-Image bringt mit sich, dass wir Node und NPM extra nachinstallieren müssen mit potenziellem Verlust von Versionsfixierung, und das Node-Image würde wieder erzwingen, dass wir einen Teil der Entwicklungsumgebung im Image mitliefern und der Webserver muss auch noch extra mitinstalliert werden.</p>
<pre><code class="language-docker">FROM nginx:stable

# Installiere Node.js (mit NPM) - benötigt curl und gnupg
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl gnupg
RUN curl -sL https://deb.nodesource.com/setup_8.x | DEBIAN_FRONTEND=noninteractive bash -
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs

WORKDIR /source/

# Kopiere Quelldateien aus aktuellem Ordner nach /source/ wo wir jetzt drin sind
COPY . .

# Installiere Abhängigkeiten
RUN npm install

# Baue die App mittels eines NPM-Skripts mit Namen &quot;build:production&quot;
RUN npm run build:production

# Erzeugte Dateien an richtige Stelle verschieben
RUN rm -r /usr/share/nginx/html/
RUN mv dist /usr/share/nginx/html

</code></pre>
<h6 id="altemethodeallesineinemlayer">Alte Methode: Alles in einem Layer</h6>
<p>Man kann aber auch alle Befehle um das Image zu bauen in einen einzigen Schritt zusammenfassen, aus dem nachher nur ein zusätzliches <em>Layer</em> auf dem Basis-Image generiert wird. Zusätzlich zu den nun zusammengefassten Bauschritten werden aber nun auch Aufräumbefehle wie <code>apt-get clean</code> oder <code>rm -r /path/to/source</code> angehängt, um unnötige Dateien loszuwerden. Damit verlieren wir aber die Möglichkeit unsere Bauschritte zu cachen um zukünftige Builds schneller und inkrementell laufen zu lassen, und die Probleme von oben schleppen wir immer noch mit uns herum. Außerdem können wir nun unsere Schritte nicht mehr zeilengenau in Form von Kommentaren dokumentieren und müssen uns mit Backslash-basierten Abtrennungen zufrieden geben.</p>
<pre><code class="language-docker">FROM nginx:stable

# 1. Installiere Node (mit NPM) - benötigt curl und gnupg
# 2. Installiere Abhängigkeiten &amp; baue App
# 3. Verschiebe dist-Dateien zu Nginx-HTML-Dokumentenpfad
# 4. Aufräumen des Images

COPY . src/
RUN export DEBIAN_FRONTEND=noninteractive \
    &amp;&amp; apt-get update \
    &amp;&amp; apt-get install -y curl gnupg \
    &amp;&amp; (curl -sL https://deb.nodesource.com/setup_8.x | bash -) \
    &amp;&amp; apt-get install -y nodejs \
\
    &amp;&amp; (cd ./src \
        &amp;&amp; npm install \
        &amp;&amp; npm run build:production \
    ) \
\
    &amp;&amp; rm -r /usr/share/nginx/html/ \
    &amp;&amp; mv ./src/dist /usr/share/nginx/html \
\
    &amp;&amp; apt-get autoremove -y --purge nodejs \
    &amp;&amp; apt-get clean \
    &amp;&amp; rm -rf \
        ./src \
        /var/tmp/* \
        /tmp/* \
        /var/lib/apt/lists/* \
        /var/cache/apt/archives/*.deb \
        /var/cache/apt/archives/partial/*.deb \
        /var/cache/apt/*.bin
</code></pre>
<h6 id="neuemethodebaueninzweiteilen">Neue Methode: Bauen in zwei Teilen</h6>
<p>Das war bis zu einem bestimmten Zeitpunkt die Standardroutine… <a href="https://docs.docker.com/develop/develop-images/multistage-build/">bis Docker 17.05 endlich Multi-Stage Builds einführte</a>!</p>
<p>Mit Multi-Stage Builds können wir unser Image jetzt in zwei Sektionen aufspalten, die wir beide wie Images behandeln können. Die erste Sektion ist nur zuständig für die Installation der Entwicklungsumgebung und das Bauen der App. Die zweite Sektion ist dann unser eigentliches Image indem wir nur noch die korrekten <code>COPY</code>-Befehle brauchen um alles an die richtige Stelle zu kopieren. Implizit können wir damit alle Dateien einfach aus dem finalen Image ausschließen, die wir nicht brauchen, und können trotzdem vollständig von dem Caching für jeden Bauschritt Nutzen machen.</p>
<p>In unserem Fall würde das Dockerfile dann so aussehen:</p>
<pre><code class="language-docker"># # # Build-Sektion # # #

FROM node:8 AS builder

# Kopiere Quelldateien und arbeite in neuem source-Ordner
WORKDIR /source/
COPY . .

# Installiere Abhängigkeiten der App und baue die App
RUN npm install
RUN npm run build:production

# # # Finales Image # # #

FROM nginx:stable

# Kopiere Dateien an die richtige Stelle
COPY --from=builder /source/dist/ /usr/share/nginx/html/
</code></pre>
<p>Wir sagen Docker damit, dass unsere App in der ersten Sektion mittels dem <code>node</code>-Image auf Versions-Tag <code>8</code> gebaut werden soll, und geben dieser Sektion den Namen <code>builder</code> für später. Nachdem wir mit Bauen fertig sind, starten wir eine neue Sektion auf Basis des <code>nginx</code>-Images mit dem Versions-Tag <code>stable</code> indem wir einfach nochmal den <code>FROM</code>-Befehl nutzen. Der einzige Schritt der hier noch ausgeführt wird, ist ein <code>COPY</code> von unserer <code>builder</code>-Sektion den wir mit dem <code>--from</code>-Argument referenzieren. Damit werden unsere fertig gebauten Dateien aus dem <code>dist</code>-Ordner in den Standardpfad für die Nginx-HTML-Dokumente eingefügt und wir haben unser fertiges Image welches nur noch aus dem Basis-Image und unserem Layer mit den kopierten Dateien besteht.</p>
<p><em>Presto!</em> Ein einfaches, durchoptimiertes Image mit einem sauber geschriebenen Dockerfile.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPv6 bei online.net mit ESXi und pfSense]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Da <a href="https://blog.kthx.at/2016/12/01/howto-online-net-ipv6-via-dhclient6-auf-proxmox-einrichten/">Georg</a> IPv6 auf Proxmox laufen hat und ich soweit nur via <a href="http://he.net/">Hurricane Electric</a> einen IPv6 Anschluss auf der PfSense realisiert habe, habe ich einen Tipp von einem Freund bekommen wie das nun auch mit ESXi funktioniert!</p>
<p><strong>Hinweis</strong></p>
<p><strong>Solltet ihr bereits andere Tutorials probiert haben, so entfernt bitte alle Änderungen</strong></p>]]></description><link>https://blog.kthx.at/2017/08/26/ipv6-bei-online-net-mit-esxi-und-pfsense/</link><guid isPermaLink="false">5b083843124da00001783ea6</guid><category><![CDATA[Linux]]></category><category><![CDATA[Firewall]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[Setup]]></category><category><![CDATA[online.net]]></category><category><![CDATA[ESXi]]></category><category><![CDATA[VMWare]]></category><category><![CDATA[pfSense]]></category><dc:creator><![CDATA[Peter]]></dc:creator><pubDate>Sat, 26 Aug 2017 22:51:22 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2017/08/pfsense-logo-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2017/08/pfsense-logo-1.png" alt="IPv6 bei online.net mit ESXi und pfSense"><p>Da <a href="https://blog.kthx.at/2016/12/01/howto-online-net-ipv6-via-dhclient6-auf-proxmox-einrichten/">Georg</a> IPv6 auf Proxmox laufen hat und ich soweit nur via <a href="http://he.net/">Hurricane Electric</a> einen IPv6 Anschluss auf der PfSense realisiert habe, habe ich einen Tipp von einem Freund bekommen wie das nun auch mit ESXi funktioniert!</p>
<p><strong>Hinweis</strong></p>
<p><strong>Solltet ihr bereits andere Tutorials probiert haben, so entfernt bitte alle Änderungen die ihr durch diese gemacht habt.</strong></p>
<p>Diese Anleitung bezieht sich auf ein ESXi 6.5 Host mit Build 5310538, gehostet bei <a href="https://online.net/en">online.net</a> und mit der Standard Konfiguration.<br>
Das Standard Netzwerk Interface ist <em>vmbr0</em> das auf eth0 bridged.</p>
<p>Wir verwenden hierbei den von online.net zugewiesenen /48 Block bzw. den davon abgeleiteten /56</p>
<p>In dieser Anleitung verwenden wir folgenden IPv6-Block:</p>
<pre><code>2001:bc8:36df:ff00:: /56
</code></pre>
<p>Noch bevor wir am Host arbeiten können müssen wir uns, falls noch nicht geschehen ein IPv6 Block kostenfrei ordern und davon ein /56 Subnet. Wie? Hierzu verweise ich auf das <a href="https://documentation.online.net/en/dedicated-server/network/ipv6/split-subnet">online.net Wiki</a>.</p>
<p><strong>1. DUID Datei generieren</strong></p>
<p>Da <a href="https://online.net/en">online.net</a> mit DUIDs arbeitet, müssen wir die DUID, die im <a href="https://console.online.net/en/network">Controlpanel</a> angezeigt wird konvertieren.<br>
Am Besten funktioniert dies mit einer Linux Maschine:<br>
<code>echo 00:03:XX:XX:... | awk '{ gsub(&quot;:&quot;,&quot; &quot;); printf &quot;0: 0a 00 %s\n&quot;, $0 }' | xxd -r &gt; dhcp6c_duid</code></p>
<p>Am Schluss überträgt man die Datei via SFTP auf die pfSense in den Ordner <code>/var/db</code></p>
<p><strong>2. Einstellungen von pfSense</strong></p>
<p>Da es nicht so viel einzustellen gibt, habe ich ein paar Screenshots von meinem Setup gemacht. Diese am Besten anschauen und entsprechend anpassen (IPs und Regeln).</p>
<p>Wichtig hierbei ist, dass IPv6 aktiviert ist. Dies könnt ihr unter <em>System-&gt;Advanced-&gt;Networking</em> nachschauen:</p>
<p><img src="https://blog.kthx.at/content/images/2017/08/433.png" alt="IPv6 bei online.net mit ESXi und pfSense"></p>
<p>Nun meine WAN und LAN Konfiguration:<br>
<img src="https://blog.kthx.at/content/images/2017/08/908.png" alt="IPv6 bei online.net mit ESXi und pfSense"><br>
<img src="https://blog.kthx.at/content/images/2017/08/e6b.png" alt="IPv6 bei online.net mit ESXi und pfSense"></p>
<p>Nun noch sichern und es sollte funktionieren.</p>
<p>Um nun Regeln anzulegen müsst ihr diese Regeln in WAN einpflegen:<br>
<img src="https://blog.kthx.at/content/images/2017/08/2f5.png" alt="IPv6 bei online.net mit ESXi und pfSense"></p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[HowTo: online.net´s IPv6 via dhclient6 auf Proxmox einrichten]]></title><description><![CDATA[In dieser anleitung geht es darum IPv6 auf einem Proxmox Hypervisor einzurichten und IPv6 und IPv4 nutzbar für VMs zu machen.]]></description><link>https://blog.kthx.at/2016/12/01/howto-online-net-ipv6-via-dhclient6-auf-proxmox-einrichten/</link><guid isPermaLink="false">5b083843124da00001783ea5</guid><category><![CDATA[Linux]]></category><category><![CDATA[Hypervisor]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[online.net]]></category><category><![CDATA[Proxmox]]></category><category><![CDATA[IPv6]]></category><category><![CDATA[Setup]]></category><dc:creator><![CDATA[Georg]]></dc:creator><pubDate>Thu, 01 Dec 2016 23:22:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Ich schreibe diese Anleitung aus aktuellem Anlass, ich entschloss mich IPv6 auf meiner Proxmox Instanz einzurichten und plante etwa 4 Stunden ein nachdem ich die ersten Anleitungen gesichtet hatte, daraus wurden jetzt 7 Tage.</p>
<p>Um euch diese mühe zu ersparen, habe ich mich entschieden meinen ersten Beitrag hier in der IT-Kitchen zu verfassen.</p>
<p><strong>Was wir erreichen möchten:</strong></p>
<ol>
<li>Dualstack Betrieb von IPv4 und IPv6 auf dem Proxmox Host.</li>
<li>Dualstack Betrieb von IPv4 und IPv6 auf KVM´s und LXC Containern.</li>
<li>IPv4 oder IPv6 only Betrieb von KVM´s oder LXC Containern.</li>
</ol>
<p><strong>Hinweis</strong></p>
<p><strong>Solltet ihr bereits andere Tutorials probiert haben, so entfernt bitte alle Änderungen die ihr durch diese gemacht habt.</strong></p>
<p>Diese Anleitung bezieht sich auf ein Proxmox Host mit Kernel 4.4.21-1-pve, gehostet bei <a href="https://online.net/en">online.net</a> und mit ihrer Standard Konfiguration.<br>
Das Standard Netzwerk Interface ist <em>vmbr0</em> das auf eth0 bridged.</p>
<p>Wir verwenden hierbei den von online.net zugewiesenen /48 Block bzw. den davon abgeleiteten /56</p>
<p>In dieser Anleitung verwenden wir folgenden IPv6-Block:</p>
<pre><code>2001:bc8:2782:100::/56
</code></pre>
<p>Noch bevor wir am Host arbeiten können müssen wir uns, falls noch nicht geschehen ein IPv6 Block kostenfrei ordern und davon ein /56 Subnet. Wie? Hierzu verweise ich auf das <a href="https://documentation.online.net/en/dedicated-server/network/ipv6/split-subnet">online.net Wiki</a>.</p>
<p><strong>1. Einrichtung des Proxmox Hosts</strong></p>
<ol>
<li>
<p>Zunächst prüfen wir ob IPv6 aktiviert ist und aktivieren es ggf.</p>
<pre><code> nano /etc/modprobe.d/local.conf
</code></pre>
</li>
</ol>
<p>Hier muss folgender Wert stehen:</p>
<pre><code>    options ipv6 disable=0
</code></pre>
<ol start="2">
<li>
<p>Jetzt folgen einige Konfigrationen zwecks Forwarding und Router advertisement. Diese Einstellungen fügt ihr am Ende der</p>
<pre><code> /etc/sysctl.conf
</code></pre>
</li>
</ol>
<p>ein:</p>
<pre><code>     # IPv6
     net.ipv6.conf.all.forwarding=1
     # ONLINE IPv6
     net.ipv6.conf.all.accept_ra = 2
     net.ipv6.conf.all.accept_ra_defrtr = 1
     net.ipv6.conf.all.accept_ra_from_local = 0
     net.ipv6.conf.all.accept_ra_min_hop_limit = 1
     net.ipv6.conf.all.accept_ra_mtu = 1
     net.ipv6.conf.all.accept_ra_pinfo = 1
     net.ipv6.conf.all.accept_ra_rt_info_max_plen = 0
     net.ipv6.conf.all.accept_ra_rtr_pref = 1
     #My stuff:
     net.ipv6.bindv6only = 1
</code></pre>
<p>Da ich es bei der Fehlersuche, in den Tutorials die ich zu dem Thema immer die vollständigen Dateiinhalte vermisst habe werde ich diese nun hier veröffentlichen:<br>
<a href="https://pastebin.com/WEeUqk5g">pastebin.com</a></p>
<ol start="3">
<li>
<p>Nun müssen wir die Konfiguration von <a href="https://linux.die.net/man/8/dhclient">dhclient</a> vornehmen. Hierzu müssen wir folgende Datei erstellen:</p>
<pre><code> /etc/dhcp/dhclient6.conf
</code></pre>
</li>
</ol>
<p>Folgendes müsst ihr dort eintragen wobei DUID, mit der DUID eures /56 Subnetzes zu ersetzen ist, diese findet ihr unter Network in der <a href="https://console.online.net/en/network/">online.net Console</a>.</p>
<pre><code>    interface &quot;vmbr0&quot; {
       send dhcp6.client-id DUID;
    }
</code></pre>
<ol start="4">
<li><strong>Konfigurations Test</strong><br>
Zunächst solltet ihr euren Proxmox Host einmal neustarten damit alle Änderungen einmal sauber geladen werden.</li>
</ol>
<p>Nach dem Neustart führen wir manuell einmal alle Befehle aus die notwendig sind um IPv6 auf dem Host zu erhalten.</p>
<pre><code>    dhclient -cf /etc/dhcp/dhclient6.conf -6 -P -v vmbr0

    /sbin/ifconfig vmbr0 inet6 add 2001:bc8:2782:100::/56
</code></pre>
<p>Selbstverständlich ist bei diesem Befehl die IP Adresse auf die eures /56 Subnetz anzupassen. Jetzt sollten wir in der Lage sein via IPv6 zu kommunizieren. Dies testen wir folgendermaßen:</p>
<pre><code>    ping6 ipv6.google.com
</code></pre>
<p>Sollte der Ping nicht erfolgreich sein, solltest du die bisher vorgenommenen Einstellungen überprüfen, eventuell ist irgendwo ein Tippfehler, ich hatte bspw. ein Leerzeichen vor meiner DUID und es dauerte ewig dies zu bemerken.</p>
<ol start="5">
<li><strong>Finale Konfiguration des Hosts</strong><br>
Jetzt da wir uns sicher sind das unsere bisherigen Konfigurationen korrekt sind, kümmern wir uns darum das diese auch automatisch beim Systemstart angewendet werden, desweiteren fügen wir nun alle Interfaces hinzu die für die VMs benötigt werden.</li>
</ol>
<p>Zunächst fügen wir dem Interface 'vmbr0' eine Konfiguration für IPv6 hinzu. Dies geschieht wie folgt:</p>
<pre><code>    nano /etc/network/interfaces
</code></pre>
<p>Dort fügen wir unter der Konfiguration von 'iface vmbr0 inet static' folgenden eintrag hinzu:</p>
<pre><code>    iface vmbr0 inet6 auto
    
    auto vmbr1
    iface vmbr1 inet6 static
        address  2001:bc8:2782:100:1::
        netmask  64
        bridge_ports none
        bridge_stp off
        bridge_fd 0
</code></pre>
<p>Aufgrund eines Bugs der Kernel 4.4.13-1-pve und scheinbar auch aufwärts, muss vmbr0 auf auto eingestellt werden und mit einem Workaround via Script konfiguriert werden nachdem alle Systemkomponenten geladen haben.<br>
Das zweite Interface vmbr1 nutzen wir einzig und alleine für IPv6. Hierbei müsst ihr natürlich die Adresse an euer /56 Subnetz anpassen, <em>1c:1ab1::</em> könntet ihr lassen oder anpassen, dies ist rein zufällig gewählt und muss nur innerhalb von **:0000:0000:: - <em>:ffff:ffff::</em> liegen.</p>
<p>Meine vollständige <a href="http://pastebin.com/N74KnAjS">/etc/network/interfaces</a></p>
<p>Um <a href="https://linux.die.net/man/8/dhclient">dhclient</a> auszuführen und dem Interface vmbr0 zur richtigen Zeit eine Adresse zu geben, erstellen wir ein Script &quot;/etc/init.d/ipv6&quot; mit <a href="http://pastebin.com/FCTnDW1H">folgendem Inhalt</a>, die IPv6 Adressen müssen natürlich auf euer /56 Subnetz angepasst werden. Dieses machen wir dann zunächst ausfürbar und fügen es dann mit den passenden Parametern zum Autostart hinzu.</p>
<pre><code>    chmod +x /etc/init.d/ipv6
    update-rc.d ipv6 defaults 99
</code></pre>
<p><strong>Dies sollten jetzt alle notwendigen Konfigurationen am Host gewesen sein.</strong></p>
<p>Jetzt sollte der Host noch einmal neugestartet werden, nach dem Neustart sollte der Output von ifconfig -a in etwa so aussehen:</p>
<p><a href="http://pastebin.com/Wmt35tYZ">http://pastebin.com/Wmt35tYZ</a></p>
<p>Wichtig ist hierbei das vmbr0 zwei inet6 einträge besitzt einmal mit <em>Scope: Global</em> und einmal mit <em>Scope: Link</em></p>
<pre><code>ping6 ipv6.google.com
</code></pre>
<p>Sollte dies nicht der Fall sein, dann spring zum Ende der Anleitung dort gibt es noch Tipps zur Fehlersuche.</p>
<p><strong>Konfiguration einer VM</strong></p>
<p><em>IPv4 + IPv6:</em></p>
<p>Zunächst müssen wir der VM zwei Netzwerkkarten hinzufügen, eine sollte ja Standard sein.<br>
net0/eth0 nutzen wir um die IPv4 Adresse mit Hilfe der MAC Adresse von <a href="https://online.net/en">online.net</a> zu beziehen deshalb muss dieses Interface auf vmbr0 verweisen damit diese MAC Adresse auch erkannt werden kann.</p>
<p>net1/eth1 wird benutzt um der VM IPv6 zu geben, wir nutzen hierzu getrennte Interfaces da wir bei IPv6 Only virtuelle MAC Adressen nutzen die <a href="https://online.net/en">online.net</a> nicht bekannt sind und somit verworfen werden würden oder eventuell dazu führen das der Server Port (Netzwerkinterface) heruntergefahren wird, dies umgehen wir durch das Routing auf dem Host. Deshalb muss net1 auf vmbr1 verweisen.</p>
<p><img src="https://img.d3luxee.de/i/20161204142832.png" alt="Netzwerkadapter"></p>
<p>Auf dem Gast also in der VM müssen wir noch folgende einstellungen in den Interfaces vornehmen.</p>
<pre><code>auto eth1
iface eth1 inet6 static
address 2001:bc8:2782:100:1::1
netmask 112
gateway 2001:bc8:2782:100::
up ip -6 route add 2001:bc8:2782:100::/56 dev eth1
up ip -6 route add default via 2001:bc8:2782:100::
down ip -6 route del default via 2001:bc8:2782:100::
down ip -6 route del 2001:bc8:2782:100::/56 dev eth1
</code></pre>
<p>Diese Konfiguration konnte ich auch in Verbindung mit <a href="https://pfsense.org">PfSense</a> erfolgreich ans laufen bringen, desweiteren wird hierdurch die Limitierung von <a href="https://online.net/en">online.net</a> umgangen, da wir das Routing des gesamten /56 übernehmen und somit alle darin enthaltenen /64 netze vergeben können und nicht nur die die im <a href="https://online.net/en">online.net</a> Panel angelegt wurden.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>In diesem Beitrag gehe ich darauf ein wie man zwischen einer IPFire und einem Raspberry Pi eine OpenVPN Netz-zu-Netz-Verbindung herstellt.</p>
<h4 id="meinanwendungszweck">Mein Anwendungszweck</h4>
<p>Vorweg ich habe Zuhause eine Fritz!Box und habe auch nicht vor mir eine IPFire Hardware-Appliance anzuschaffen, weil ich für mich persönlich keinen Mehrwert darin sehe, welcher die</p>]]></description><link>https://blog.kthx.at/2016/03/10/ipfire-openvpn-netz-zu-netz-verbindung-mit-raspberrypi/</link><guid isPermaLink="false">5b083843124da00001783e99</guid><category><![CDATA[Firewall]]></category><category><![CDATA[IPFire]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[OpenVPN]]></category><category><![CDATA[RapsberryPi]]></category><category><![CDATA[Rasbian]]></category><category><![CDATA[Setup]]></category><dc:creator><![CDATA[Niklas]]></dc:creator><pubDate>Thu, 10 Mar 2016 07:11:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/ipfire-2.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/ipfire-2.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><p>In diesem Beitrag gehe ich darauf ein wie man zwischen einer IPFire und einem Raspberry Pi eine OpenVPN Netz-zu-Netz-Verbindung herstellt.</p>
<h4 id="meinanwendungszweck">Mein Anwendungszweck</h4>
<p>Vorweg ich habe Zuhause eine Fritz!Box und habe auch nicht vor mir eine IPFire Hardware-Appliance anzuschaffen, weil ich für mich persönlich keinen Mehrwert darin sehe, welcher die ca. 200€ teure Hardware rechtfertigen würde.<br>
Ich betreibe eine virtualisierte Serverumgebung hinter einer IPFire und möchte auf diese zugreifen können, ohne jedes mal die VPN-Verbindung von meinem PC aus aufbauen zu müssen.</p>
<h4 id="vorbereitung">Vorbereitung</h4>
<ul>
<li>RaspberryPi mit Raspian und root Zugriff</li>
<li>Fritz!Box o.ä. (Muss Port Forwarding und statisches Routing beherrschen, ggf. DynDNS)</li>
<li>root Zugriff auf die IPFire (mit statischer öffentlicher IP-Adresse) und OpenVPN Server konfiguriert</li>
</ul>
<h4 id="anmerkung">Anmerkung</h4>
<p>Anstatt des Raspberry PI’s kann auch ein (alter) PC mit Debian o.ä. benutzt werden.</p>
<h4 id="theorie">Theorie</h4>
<p>Wir haben auf der einen Seite eine IPFire (in meinem Fall virtuell).</p>
<p>Red0 ist als externes Interface konfiguriert, mit einer öffentlichen IP-Adresse. An green0 liegt das lokale Netz mit der Netzadresse 10.0.0.0/24 an.</p>
<p>Auf der anderen Seite einen Raspberry PI hinter einer Fritz.Box. Ankommende TCP und UDP Pakete bei der Fritz!Box auf Port 1195 werden an den Pi geforwarded. Anschließend wird eine statische Route eingetragen welche darauf verweist das alle Pakete mit dem Ziel 10.0.0.0/24 an den Pi geschickt werden.</p>
<p>Nach erfolgreicher Konfiguration werden die Pakete folgenden Weg nehmen:</p>
<p>PC ➔ Fritz!Box ➔ Raspberry PI –Open VPN Tunnel➔ IPFire ➔ Ziel</p>
<p>Rückweg:</p>
<p>Quelle ➔ IPFire –OpenVPN Tunnel ➔ Raspberry PI ➔ PC</p>
<p>Die lokalen IP-Adressbereiche werden im jeweils anderen LAN geroutet.</p>
<p>Kein Source-NAT etc…</p>
<h4 id="raspberrypi">RaspberryPi</h4>
<p>Zunächst benötigt der Pi eine statische IP-Adresse, dies kann über 2 Methoden realisiert werden</p>
<ul>
<li>
<p>Statische IP-Adresse am Pi festlegen</p>
<pre><code>  bash:~$ nano -w /etc/network/interfces
</code></pre>
</li>
<li>
<p>Den Inhalt der Datei durch folgenden ersetzen:</p>
<pre><code>  auto lo eth0
  iface lo inet loopback

  iface eth0 inet static
  address 192.168.2.100
  netmask 255.255.255.0
  network 192.168.2.254
  broadcast 192.168.2.255
  gateway 192.168.2.1
</code></pre>
</li>
</ul>
<p><strong>Anmerkung:</strong> <em>Die Adressen sind entsprechend anzupassen.</em></p>
<ul>
<li>DHCP anweisen diesem Gerät jedes mal die gleiche IP-Adresse zuzuweisen (Beispiel FRITZ!Box)</li>
<li>Webinterface der FRITZ!Box aufrufen (<a href="http://fritz.box">fritz.box</a>)</li>
<li>Heimnetz ➔ Netzwerk</li>
</ul>
<p>In dieser Liste dann den Pi heraussuchen, er sollte am Hostname erkennbar sein.<br>
Dann diesen Eintrag bearbeiten und den Haken bei <code>Diesem Netzwerkgerät immer die gleiche IPv4-Adresse zuweisen.</code> setzen.<br>
<img src="https://blog.kthx.at/content/images/2015/09/1-1.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
<img src="https://blog.kthx.at/content/images/2015/09/2.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
Anschließend wird noch die Paketliste aktualisiert und OpenVPN + Screen installiert. Dies erledigen wir mit folgendem Befehl:</p>
<pre><code>bash:~$ apt-get update &amp;&amp; apt-get install openvpn screen -y
</code></pre>
<p>Zuletzt und ganz wichtig muss im Kernel noch das Routing aktiviert werden. Dazu öffnen wir die Kernel Konfigurationsdatei:</p>
<pre><code>bash:~$ nano -w /etc/sysctl.conf
</code></pre>
<p>Fügen folgende Zeile hinzufügen:</p>
<pre><code>net.ipv4.ip_forward = 1
</code></pre>
<p>Und dann die Konfiguration des Kernels neu laden mit folgendem Befehl:</p>
<pre><code>bash:~$ sysctl -p /etc/sysctl.conf
</code></pre>
<h4 id="fritzbox">Fritz!Box</h4>
<p>Nun passen wir unsere Fritz!Box (o.ä.) an, ich werde nur auf die Konfiguration bei der Fritz!Box eingehen.</p>
<ul>
<li><strong>Was muss getan werden?</strong></li>
<li>Statische Route</li>
<li>Port-Forwarding</li>
<li>Falls benötigt DynDNS</li>
</ul>
<p>Beginnen wir mit dem Routing.</p>
<p><strong>Wozu statisches Routing?</strong></p>
<p>Weil, alle Clients im Heimnetzwerk als Gateway die Fritz!Box angegeben haben. Nun möchten wir an unserem PC z.B. eine SSH-Verbindung zu unserer IPFire herstellen.<br>
Wir geben in unserem SSH-Klienten unsere Ziel-IP ein z.B. 10.0.0.1 nun sieht der PC <em>„Hey, das Ziel befindet sich nicht in meinem LAN, also ab zum Standardgateway (Fritz!Box) mit meinem Paket“</em>.<br>
Genau hier tritt das statische Routing ein, dadurch weiß nämlich die Fritz!Box <em>„Hey, das schicke ich nicht ins Internet, sondern zu der und der IP (in unserem Fall der Raspberry Pi)“</em>.<br>
Dann ist unser Paket dort angelangt wo es hin soll.</p>
<p>Alternativ kann man auch eine statische Route am PC eintragen und diese mit einem Script bei jedem Start des PC’s ausführen lassen, aber wir machen es mit statischem Routing an der Fritz!Box, somit kommt man auch wenn man mal am Laptop ist überall drauf ohne Routen einzutragen.</p>
<p><strong>Nach so viel Theorie ab zur Praxis!</strong><br>
<img src="https://blog.kthx.at/content/images/2015/09/3.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
<img src="https://blog.kthx.at/content/images/2015/09/4.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
<img src="https://blog.kthx.at/content/images/2015/09/5.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"></p>
<h4 id="portforwarding">Port-Forwarding</h4>
<p>Unser Pi muss unter den öffentlichen IP-Adresse der Fritz!Box erreichbar sein, deshalb leiten wir Port <code>1195</code> <code>TCP</code> und <code>UDP</code> auf den Pi.</p>
<ul>
<li>Webinterface der FRITZ!Box aufrufen (<a href="http://fritz.box">fritz.box</a>)</li>
<li>Internet</li>
<li>Freigaben</li>
<li>Neue Portfreigabe<br>
<img src="https://blog.kthx.at/content/images/2015/09/6.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
Das Feld <code>an Computer</code> anpassen, dort müsst Ihr den Hostnamen eures PI’s her raussuchen, die IP-Adresse wird dann automatisch angepasst.<br>
<img src="https://blog.kthx.at/content/images/2015/09/7.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"></li>
</ul>
<p>Selbiges dann nochmal für TCP.</p>
<h4 id="dyndns">Dyn-DNS</h4>
<p>Dynamic-DNS ist von Nöten wenn ihr keine statische IP-Adresse besitzt. Wenn ihr euch sicher seit, dass ihr eine statische IP-Adresse habt dann könnt ihr diesen Part überspringen.</p>
<p>FritzOS bringt von Haus aus einen DynDns  mit um diesen zu aktivieren geht man wie folgt vor:</p>
<ul>
<li>Webinterface der FRITZ!Box aufrufen (<a href="http://fritz.box">fritz.box</a>)</li>
<li>Internet</li>
<li>Freigaben</li>
<li>Fritz!Box-Dienste</li>
<li>Internetzugriff<br>
<img src="https://blog.kthx.at/content/images/2015/09/8-1.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
Dort setzt Ihr den Toggle bei <code>Internetzugriff auf die Fritz!Box für HTTPS aktiviert</code><br>
Daraufhin speichern, dann wird euch in der Zeile <code>Internetadresse Ihrer FRITZ!Box</code> eure DynDns Domain angezeigt.<br>
Das <code>https://</code> ist für uns uninteressant, wir brauchen nur <code>xxxxxxxxxxxxxxxxxx.myfritz.net</code>.</li>
</ul>
<h4 id="ipfire">IPFire</h4>
<ul>
<li>
<p>Webinterface der IPFire öffnen</p>
</li>
<li>
<p>Dienste</p>
</li>
<li>
<p>OpenVPN</p>
</li>
<li>
<p>Hinzufügen<br>
<img src="https://blog.kthx.at/content/images/2015/09/9.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
Wir wollen eine Netz zu Netz Verbindung, also klicken wir dementsprechend den RadioButton und anschließend auf hinzufügen.<br>
<img src="https://blog.kthx.at/content/images/2015/09/10.png" alt="IPFire: OpenVPN Netz-zu-Netz-Verbindung mit RaspberryPi"><br>
Danach muss die Verbindung konfiguriert werden.</p>
</li>
<li>
<p>Name: Wie gewünscht, in den Beispielen verwende ich den Namen „n2n“</p>
</li>
<li>
<p>Konfiguriert als: OpenVPN-Server</p>
</li>
<li>
<p>Lokales Subnet: Ist das Subnet in der sich die IPFire befindet</p>
</li>
<li>
<p>OpenVPN Subnet: Kann frei gewählt werden (darf sich aber nicht mit Lokalen- oder Remotesubnet überschneiden)</p>
</li>
<li>
<p>Ziel-Port: 1195</p>
</li>
<li>
<p>Remote Host/IP: Statische externe IP der Fritz.Box oder DynDyn der Fritz.Box (xxxxxxxxx.myfritz.net)</p>
</li>
<li>
<p>Remote Subnet: Subnet in dem sich euer Pc und eure Fritz.Box befindet</p>
</li>
<li>
<p>Protokoll: UDP</p>
</li>
<li>
<p>Management Port: 1195</p>
</li>
</ul>
<p>Daraufhin speichern. Ihr sehr dann die OpenVPN Oberfläche. Jetzt ladet ihr das Clientpaket in .ZIP Form herunter und entpackt es. Dann habt ihr 2 Dateien (n2n.conf und n2n.p12), welche ihr auf Pi kopiert. Dies kann mit FileZilla oder jedem anderen beliebigen SFTP Klienten gemacht werden. Ich habe mir in /etc/openvpn ein Ordner n2n angelegt und dann diese beiden Dateien dort abgelegt.</p>
<p>Nun starten wir eine SSH-Verbindung zum Pi und loggen uns ein.</p>
<pre><code>bash:~$ cd /etc/openvpn/n2n
bash:~$ openssl pkcs12 -in XXX.p12 -clcerts -nokeys -nodes -out user.pem
bash:~$ openssl pkcs12 -in XXX.p12 -nocerts -nodes -out key.pem
bash:~$ openssl pkcs12 -in XXX.p2 -cacerts -nodes -out ca.pem
</code></pre>
<p>Anschließend editieren wir das Config-File:</p>
<pre><code>bash:~$ nano -w n2n.conf
</code></pre>
<p>Ihr ersetzt das</p>
<pre><code>pkcs12 n2n.p12
</code></pre>
<p>Durch</p>
<pre><code>ca /etc/openvpn/n2n/ca.pem
cert /etc/openvpn/n2n/user.pem
key /etc/openvpn/n2n/key.pem
</code></pre>
<p>Und setzt ein <code>#</code> vor folgende Zeilen um diese auszukommentieren, damit diese wie folgt aussehen</p>
<pre><code>#user nobody
#group nobody
#daemon XXXX
#writepid /var/run/XXX.pid
</code></pre>
<p>Das Ganze speichern <code>STRG</code> + <code>O</code> &amp; <code>STRG</code> + <code>X</code> zum Schließen.<br>
Wir haben oben die Zeilen auskommentiert, die diese Verbindung als Deamon gestartet hätte.</p>
<p>Warum?</p>
<p>Weil wir sie dann im Screen starten um so auch zu sehen was passiert. (Erleichtert vor Allem das Troubleshooting um einiges falls was nicht funktioniert.)</p>
<p>Dazu schreiben wir ein Bash Script:</p>
<pre><code>bash:~$ nano -w vpnconnect.sh

#!/bin/bash
modprobe tun
screen -AmdS N2NVPN openvpn --config /etc/openvpn/n2n/n2n.conf
</code></pre>
<p>Wenn ihr wollt das eure Verbindung immer beim Start des Pi’s aufgebaut wird ist der einfachste und schnellste Weg ein /etc/rc.local Eintrag.</p>
<pre><code>bash:~$ nano -w /etc/rc.local
</code></pre>
<p>In der Text-Datei einfach eine Zeile über <code>exit 0</code> folgendes schreiben:</p>
<pre><code>bash:~$ /etc/openvpn/n2n/vpnconnect.sh
</code></pre>
<p>Das Ganze speichern <code>STRG</code> + <code>O</code> &amp; <code>STRG</code> + <code>X</code> zum Schließen.<br>
Das Script ausführbar machen:</p>
<pre><code>bash:~$ chmod +x vpnconnect.sh
</code></pre>
<p>Damit wäre die Konfiguration geschafft.</p>
<h4 id="verbindungaufbauen">Verbindung aufbauen</h4>
<p>Zum einen müsst ihr am Pi die Client Seite starten:<br>
bash:~$ ./etc/openvpn/n2n/vpnconnect.sh</p>
<p>Zum Anderen unter IPFire Webfrontend ➔ Dienste ➔ OpenVPN den Toggle der Standortverbindung setzten. Um zu überprüfen was geschieht kann man dann den Screen am Pi öffnen. Ist der Verbindungsaufbau erfolgreich kann man noch einmal den jeweils anderen Router/Firewall anpingen um die Funktion noch zu überprüfen. Ansonsten kann man aus dem Screen Informationen auslesen, welche zur Problemlösung beitragen.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPsec Site2Site VPN zwischen einer FortiGate und IPfire]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Ich möchte euch heute eine Möglichkeit zeigen, wie ihr IPfrire und eine FortiGate Firewall über einen IPsec Tunnel verbinden könnt.<br>
Wir kennen das Drama, man möchte 2 Geräte von Unterschiedlichen Herstellern über ein VPN miteinander verbinden.<br>
IPsec ist hier die wohl Beste Wahl da so gut wie jeder VPN Router</p>]]></description><link>https://blog.kthx.at/2016/02/26/ipsec-zwischen-einer-fortigate-und-ipfire/</link><guid isPermaLink="false">5b083843124da00001783ea3</guid><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Fri, 26 Feb 2016 13:59:12 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2016/03/ipfire.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2016/03/ipfire.png" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><p>Ich möchte euch heute eine Möglichkeit zeigen, wie ihr IPfrire und eine FortiGate Firewall über einen IPsec Tunnel verbinden könnt.<br>
Wir kennen das Drama, man möchte 2 Geräte von Unterschiedlichen Herstellern über ein VPN miteinander verbinden.<br>
IPsec ist hier die wohl Beste Wahl da so gut wie jeder VPN Router / Firewall damit umgehen kann. Folgend werde ich euch zeigen wie ihr einen Site2Site IPsec VPN aufbauen könnt.</p>
<p>Als vorausetzung für die funktion gehe ich von Statischen IP-Adressen oder DynDNS in beiden Standorten aus.</p>
<p>Ich Beginne mit der Konfiguration auf der FortiGate.</p>
<h4 id="fortigatekonfiguration">FortiGate Konfiguration:</h4>
<p>Wir melden uns auf dem FortiGate Webinterface an und Navigieren zu<br>
<img src="https://blog.kthx.at/content/images/2016/02/vpn-fgt-2.PNG" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"></p>
<p>Mit einem Klick auf <code>Create New</code> landen wir in einem Wizard, diesen wir jedoch nicht verwenden werden.<br>
Wir vergeben unserem VPN einen Namen z.b. <code>VPN-Standort2</code> klicken auf <code>Custom VPN Tunnel (No Template)</code></p>
<p><strong>Network:</strong><br>
<img src="https://blog.kthx.at/content/images/2016/02/vpn-fgt-1-1.png" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"></p>
<p>(Remote Gateway: Hier könnt ihr unteranderem einen <code>Dialup User</code> für Einwählende IPsec Verbindungen von Dynamischen IP Adressen einrichten, oder einen <code>Dynamic DNS</code> auswählen.<br>
Im Feld IP Adresse Tragen wir die Statische öffentliche IP-Adresse von unserem Standort2 ein.)</p>
<p><strong>Authentication:</strong><br>
<img src="https://blog.kthx.at/content/images/2016/02/vpn-fgt-2.png" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
(Im Feld Method: kann man zwischen einem <code>Pre-shared Key</code> oder einem Zertifikat wählen.<br>
In meinem Fall verwende ich ein Pre-shared Key und trage diesen in das Vorgegeben Feld ein.<br>
Die IKE Version lassen wir auf <code>1</code> und belassen IKE Mode auf <code>Main (ID protection)</code></p>
<p><strong>Phase 1:</strong><br>
<img src="https://blog.kthx.at/content/images/2016/02/vpn-fgt-phase1.png" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
Es sollte bei der Encryption und Authentication eine gute Wahl getroffen werden Ich belasse meine Tunnel meist auf AES256 und SHA256.</p>
<p><strong>XAUTH:</strong><br>
Unseren XAUTH Type belassen wir auf <code>Disabled</code></p>
<p><strong>Phase 2:</strong><br>
<img src="https://blog.kthx.at/content/images/2016/02/vpn-fgt-3-1.png" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
(Im Punkt Local Address vergeben wir das Lokale Subnetz das wir Routen möchten.<br>
Technisch sind hier auch sogenannte 0.0.0.0 Netze möglich womit es recht einfach ist mehrere Subnetze über eine Phase 2 zu verbinden.<br>
Als Encryption setze ich wieder AES256 und SHA256 für die Authentication.)</p>
<p>Soweit die IPsec Konfiguration, der nächste Schritt ist es in der FortiGate die benötigten Policys für <code>Intern --&gt; VPN-Standort2</code> und <code>VPN-Standort2 --&gt; Intern</code> anzulegen.<br>
Damit der Tunnel auch online gehen kann benötigen wir abschließend noch eine Statische Route die uns sagt wo wir das Remote Subnetz finden.</p>
<h4 id="ipfirekonfiguration">Ipfire Konfiguration:</h4>
<p>Wir melden uns bei Standort-B auf dem Ipfire Web Interface an und Navigieren zu Services/IPsec.<br>
Da wir bei unserer IPsec Verbindung mit einem Pre-shared Key arbeiten benötigen wir kein Zertifikat.<br>
Um IPsec auf dem Red0 Interface zu aktivieren reicht es ein Hacken bei Enabled zu setzen und dies zu speichern.<br>
Unter Connection Status and -Control fügen wir uns jetzt mit einem Klick auf <code>Add</code> einen neuen IPsec Tunnel hinzu.</p>
<p><img src="https://blog.kthx.at/content/images/2016/02/ipfire-vpn.PNG" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
(wir wählen <code>Net-to-Net Virtual Private Network</code> und klicken auf <code>Add</code>)</p>
<p><img src="https://blog.kthx.at/content/images/2016/02/ipfire-vpn2-1.PNG" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
Durch einen Klick auf <code>Save</code> landen wir in der <code>advanced settings</code> Einstellung.<br>
<img src="https://blog.kthx.at/content/images/2016/02/ipsec-ad.PNG" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"><br>
(Grouptype: Da wir auf der FortiGate Seite bereits hohe Sicherheits Einstellungen vorgenommen haben und sich IPsec auf der IPfire Seite selbständig an die Verschlüsselung der Gegenseite anpasst. Können wir hier ohne Bedenken alles markieren werden.<br>
Lifetime: Wir sollten achten das die Zeit auf beiden Standorten identisch ist.)</p>
<p>Die VPN verbindung sollte jetzt online sein:<br>
<img src="https://blog.kthx.at/content/images/2016/02/ipsec-ipfire.PNG" alt="IPsec Site2Site VPN zwischen einer FortiGate und IPfire"></p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[StartSSL: 4096bit SHA2 A+ Zertifikate für NGINX]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Aus gegebenen Anlass habe ich mich dazu entschlossen, ein Beitrag zu diesem Thema zu schreiben.<br>
Es soll darum gehen, wie man sich bei <a href="https://www.startssl.com">StartSSL</a> ein gültiges Zertifikat anfordern kann und dieses im NGINX konfiguriert.</p>
<h6 id="generierenvon4096bitsha2keyerzeugungvonrequestfile">Generieren von 4096 Bit SHA2 Key + Erzeugung von Request File:</h6>
<p>Als Erstes generieren wir unser 4096</p>]]></description><link>https://blog.kthx.at/2015/10/10/startssl-4096bit-a-zertifikate-fur-nginx-2/</link><guid isPermaLink="false">5b083843124da00001783ea1</guid><category><![CDATA[SSL]]></category><category><![CDATA[TLS]]></category><category><![CDATA[Zertifikate]]></category><category><![CDATA[StartSSL]]></category><category><![CDATA[Sicherheit]]></category><category><![CDATA[A+]]></category><category><![CDATA[public-key]]></category><category><![CDATA[private-key]]></category><category><![CDATA[Nginx]]></category><category><![CDATA[Netzwerk]]></category><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Sat, 10 Oct 2015 15:55:32 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/10/vpn.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/10/vpn.jpg" alt="StartSSL: 4096bit SHA2 A+ Zertifikate für NGINX"><p>Aus gegebenen Anlass habe ich mich dazu entschlossen, ein Beitrag zu diesem Thema zu schreiben.<br>
Es soll darum gehen, wie man sich bei <a href="https://www.startssl.com">StartSSL</a> ein gültiges Zertifikat anfordern kann und dieses im NGINX konfiguriert.</p>
<h6 id="generierenvon4096bitsha2keyerzeugungvonrequestfile">Generieren von 4096 Bit SHA2 Key + Erzeugung von Request File:</h6>
<p>Als Erstes generieren wir unser 4096 Bit SHA2 Keyfile <code>example.org.key</code> und dessen dazugehöriges Request File <code>example.org.csr</code>.</p>
<p><u><strong>Das Keyfile ist das Herz unserer SSL/TLS Verschlüsslung und darf deshalb niemals in fremde Hände geraten!</strong></u></p>
<p><code>openssl req -nodes -newkey rsa:4096 -sha256 -keyout example.org.key -out example.org.csr</code><br>
(Es können alle nachfolgenden Abfragen mit Enter bestätigt werden, da diese bei StartSSL nicht berücksichtigt werden.)<br>
Wir setzen die Berechtigung am besten auf <code>chmod 600 example.org.key</code>.<br>
Somit ist unser Schlüssel nur für unseren User lesbar.</p>
<h6 id="einreichenvoncertificatesigningrequestfile">Einreichen von Certificate Signing Request file:</h6>
<p>Im nächsten Schritt müssen wir unser <code>example.org.csr</code> Request File bei StartSSL einreichen. StartSSL bietet uns hier zwar die Möglichkeit uns unseren Privat Key zu erstellen. Das sollten wir jedoch, wie wir eben gelernt haben, niemals machen.<br>
Oder gibst du wildfremden Menschen deinen Hausschlüssel?<br>
Wir überspringen somit diesen Punkt und importieren unser zuvor selbst erstelltes Request File.<br>
Wir werden anschließend nach einer Sub-Domain gefragt. Dort tragen wir, wenn wir ausschließlich für <code>example.org</code> ein Zertifikat ausstellen möchten, <code>www</code> ein.<br>
Nach Abschluss können wir uns unser Zertifikat im ZIP Bundel herunterladen. (Wir benötigen ausschließlich die Datei im Unterordner NGINX)<br>
Dieses Zertifikat öffnen wir in einem Editor, löschen das unterste Zertifikat heraus und speichern das Zertifikat als ssl.crt (Aus Gründen die mir nicht bekannt sind, verteilt StartSSL hier das falsche Intermediate Zertifikate wodurch wir händisch nacharbeiten müssen)</p>
<h6 id="herunterladenvonintermediatezertifikate">Herunterladen von Intermediate Zertifikate:</h6>
<p>Anschließend benötigen wir das richtige <code>StartCom Class 1 DV Server CA(pem)(SHA-2)</code> File von startssl.<br>
Dieses downloaden wir uns hier <code>https://www.startssl.com/certs/sca.server1.crt</code><br>
oder: <a href="https://www.startssl.com/root">https://www.startssl.com/root</a>, unter <mark>Intermediate CA Certificates</mark>/<mark>StartCom Class 1 DV Server CA(pem)(SHA-2)</mark></p>
<p>Wir haben jetzt alle Zertifikate und kommen zur eigentlichen Konfiguration des NGINX web Servers.</p>
<h6 id="aneinanderhngenvonpublickeys">Aneinanderhängen von Public Keys</h6>
<p>Bevor NGINX mit unseren Zertifikaten etwas anfangen kann, müssen wir unser <code>ssl.crt</code> und das<br>
(Intermediate CA Certificates)<code>sca.server1.crt</code> von StartSSL zusammenfügen. Das machen wir mit<br>
<code>cat ssl.crt sca.server1.crt &gt; ssl-unified.crt</code>.<br>
Das erstellte <code>ssl-unified.crt</code> ist absofort unser Public Key für NGINX</p>
<h6 id="erstellungvondiffiehellmanparameters">Erstellung von Diffie-Hellman Parameters:</h6>
<p><code>openssl dhparam -out dhparam.pem 4096</code><br>
(wem 4096 Bit zu paranoid erscheint kann auch auf 2048 Bit umstellen)</p>
<h6 id="nginxsslkonfiguration">NGINX SSL Konfiguration</h6>
<p><code>nano /etc/nginx/sites-available/example.org.conf</code></p>
<pre><code>    ssl on;  
    ssl_certificate /var/www/it-schley.eu/ssl/ssl-unified.crt;
    ssl_certificate_key /var/www/it-schley.eu/ssl/it-schley.eu.key;	
    ssl_dhparam /var/www/it-schley.eu/ssl/dhparam.pem;

    ssl_protocols TLSv1.1 TLSv1.2 TLSv1;

    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 10m;
    add_header Strict-Transport-Security max-age=31536000;
</code></pre>
<p>Nach Abschluss der Konfiguration sollte unser Zertifikat eine A+ Bewertung bekommen (Stand 10.10.2015)<br>
Testen kann man das unter <a href="https://www.ssllabs.com/ssltest/">https://www.ssllabs.com/ssltest/</a></p>
<p><img src="https://blog.kthx.at/content/images/2015/10/ssl.PNG" alt="StartSSL: 4096bit SHA2 A+ Zertifikate für NGINX"></p>
<p>Änderung: 14.02.2016</p>
<ul>
<li>änderungen von StartSSL eingetragen.</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Debian/Ubuntu: PHP-FPM isolieren per Chroot-Jail unter separatem User]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Gehen wir von folgender Situation aus: Wir haben eine Webseite auf einem Server mit PHP-FPM aufgesetzt, die PHP-Software, die die Website betreibt, ist auf der aktuellsten Version. Leider wurde erst letztens eine Sicherheitslücke in dem Code von der Software gemeldet, die noch nicht geschlossen wurde und den Hacker bereits ausnutzen</p>]]></description><link>https://blog.kthx.at/2015/09/23/php-fpm-chroot/</link><guid isPermaLink="false">5b083843124da00001783e9d</guid><category><![CDATA[Nginx]]></category><category><![CDATA[PHP-FPM]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Chroot]]></category><dc:creator><![CDATA[Carl]]></dc:creator><pubDate>Wed, 23 Sep 2015 05:51:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/php.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/php.jpg" alt="Debian/Ubuntu: PHP-FPM isolieren per Chroot-Jail unter separatem User"><p>Gehen wir von folgender Situation aus: Wir haben eine Webseite auf einem Server mit PHP-FPM aufgesetzt, die PHP-Software, die die Website betreibt, ist auf der aktuellsten Version. Leider wurde erst letztens eine Sicherheitslücke in dem Code von der Software gemeldet, die noch nicht geschlossen wurde und den Hacker bereits ausnutzen können um Zugriff auf das Dateisystem des Servers zu bekommen. Deswegen haben wir sichergestellt, dass wir ein Backup haben für den Fall, dass die Webseite komplett von einem Angriff ruiniert wird und neu installiert werden muss. Aber geht es nicht auch irgendwie, den Server außerhalb der Webseite zumindest abzusichern, dass wir nicht sämtliche Software oder gar den Server komplett neu installieren/konfigurieren müssen nach einem Angriff? Die Antwort ist ein <a href="//de.wikipedia.org/wiki/Chroot">Chroot</a> unter einem separaten Unix-Benutzer zur Einschränkung der Zugriffsrechte.</p>
<p>In diesem Artikel wird <em>eine</em> Möglichkeit der Umsetzung eines sogenannten <strong>Chroot-Jails</strong> für PHP-FPM vorgestellt, kombiniert mit separatem User zum Ausführen von PHP-Skripts. Es ist durchaus möglich, dass es bessere Methoden gibt um eine PHP-Webseite abzusichern, z.B. die Webseite in einen Docker-Container zu packen; einen Artikel dazu werde ich noch nachreichen.</p>
<h6 id="eigenenbenutzerzurphpausfhrung">Eigenen Benutzer zur PHP-Ausführung</h6>
<p>Zu aller erst werden wir einen eigenen Systemuser erstellen um Zugriffsrechte für PHP-Skripte einzuschränken. Das ist für den Fall, dass es eventuell in Linux auch einen Exploit geben könnte um den Chroot zu durchbrechen, dass dann trotzdem Dateien von anderen Webseiten nicht ruiniert und optional auch nicht ausgelesen werden können. Wir brauchen dafür Root-Rechte.</p>
<pre><code>root@example:~# adduser --system --no-create-home --home /var/www/example.org www-example-org
Adding system user `www-example-org' (UID 113) ...
Adding new user `www-example-org' (UID 113) with group `nogroup' ...
Not creating home directory `/var/www/example.org'.
root@example:~# 
</code></pre>
<p>Wir haben den Benutzer hier <code>www-example-org</code> genannt und das Webseitenverzeichnis <code>/var/www/example.org</code> als dessen Homeverzeichnis übergeben was optional aber sauberer ist. Punkte vertragen sich im Übrigen nicht immer gut mit Unix-Benutzernamen, also habe ich zur Sicherheit stattdessen Bindestriche verwendet.</p>
<h6 id="konfigurationdesphppoolsmitchroot">Konfiguration des PHP-Pools mit Chroot</h6>
<p>Schauen wir jetzt mal was PHP selbst direkt bietet um einen Chroot aufzusetzen. Dafür werfen wir einen Blick auf die Konfigurationsdateien für PHP-Pools in PHP-FPM. Auch hier brauchen wir Root-Rechte.</p>
<pre><code>root@example:~# cd /etc/php5/fpm/pool.d/
root@example:/etc/php5/fpm/pool.d# ls
www.conf
root@example:~# 
</code></pre>
<p>Standardmäßig findet sich in dem Ordner für die Poolkonfigurationen nur eine Konfiguration für den <code>www</code>-Pool der ein Socket aufsetzt über den Webserver (sowohl Apache als auch Nginx) mit PHP kommunizieren können.</p>
<p>Wir wollen aber nun einen separaten Pool für jede Webseite aufsetzen der so eingestellt ist, dass PHP-Skripte in diesem Pool in einer Chroot-Umgebung &quot;eingesperrt&quot; sind. Dafür erstellen wir eine neue Konfigurationsdatei, entweder durch Kopieren von <code>www.conf</code> und Hinzufügen/Auskommentieren/Bearbeiten entsprechender Zeilen oder einfach durch erstellen einer leeren Datei, je nach aktuellem Setup. Am bequemsten zu verwalten sind diese Konfigurationsdateien meiner Meinung nach wenn man sie gleich der Domain oder dem Verzeichnisnamen von der Webseite benennt, hier nennen wir es mal <code>chroot-example.org.conf</code>. Hier das Template mit Erklärung:</p>
<pre><code class="language-ini">[chroot-example.org]

; Der Unixsocket auf dem dieser Pool auf den Webserver hört
listen = /var/run/php5-fpm-chroot-example.org.sock

; Das Verzeichnis unter dem PHP laufen wird
prefix = /var/www/example.org

; Das obere Verzeichnis wird unser Chroot-Ziel!
chroot = $prefix

; Wir wollen im neuen Wurzelverzeichnis arbeiten
chdir = /

; Der User und die Gruppe unter der PHP laufen wird, gemäß dem User den wir vorher erstellt haben
user = www-example-org
group = www-data

; Der Besitzer und die Gruppe des Sockets.
; Als Besitzer nehmen wir den User, den wir vorhin angelegt haben und als Gruppe nehmen wir die gleiche Gruppe unter der unser Webserver läuft.
; Mit dem Zugriffsmodus (660) kombiniert stellt das sicher, dass nur der Webserver Zugriff auf diesen Socket hat.
listen.owner = www-example-org
listen.group = www-data 
listen.mode = 0660

; Ein Ordner in der Chroot-Umgebung in dem wir alle PHP-Sessions sicher ablegen
php_value[session.save_path] = /sessions

; Optional, ein paar Performance-Einstellungen für diesen Pool
pm=dynamic
pm.max_children=5
pm.start_servers=2
pm.min_spare_servers=1
pm.max_spare_servers=3
</code></pre>
<p>Zusammengefasst erstellen wir also hier einen Pool der unter dem gerade angelegten User <code>www-example-org</code> läuft in dem von uns gewollten Chroot. Außerdem ist dieser Pool dann nur für den Webserver zugänglich, über die Gruppe <code>www-data</code>.</p>
<p>So ähnlich wird auch mit jeder anderen Seite vorgegangen für die wir einen isolierten Chroot haben wollen. Dabei bekommt jeder Chroot einen eigenen Socketpfad (<code>listen</code>), einen eigenen Benutzer (<code>listen.owner</code>/<code>user</code>) und den entsprechenden eigenen <code>prefix</code>.</p>
<h6 id="dnsauflsungimchrootvianscd">DNS-Auflösung im Chroot via nscd</h6>
<p>Bevor wir fortfahren muss ich kurz erwähnen, dass in einer Chroot Umgebung PHP üblicherweise nicht ohne Probleme in der Lage ist DNS-Anfragen über <code>gethostbyname</code> oder <code>gethostbyaddr</code> aufzulösen. Damit das funktioniert wird man DNS-Anfragen aus dem Chroot irgendwie herausführen müssen da Linux-Programme das üblicherweise über Systemaufrufe erledigen die von Systemdateien abhängen die wir eventuell nicht in der Chroot-Umgebung haben wollen. Stattdessen verwenden wir eine Chroot-sichere Lösung die sich <em>nscd</em> (&quot;Name Service Cache Daemon&quot;) nennt. Dieser Daemon stellt einen speziellen Socket bereit den DNS-Anfragen via Systemaufrufe alternativ nutzen um die Abfragezeit zu beschleunigen (daher &quot;Cache&quot;). Diesen Socket können wir später via <code>mount</code> in den Chroot durchgeben.</p>
<p>Die Installation läuft normalerweise sehr einfach und bequem über <code>apt-get</code>: (Nicht vergessen davor ein <code>apt-get update</code> auszuführen!)</p>
<pre><code>root@example:~# apt-get install nscd -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  nscd
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/242 kB of archives.
After this operation, 355 kB of additional disk space will be used.
Selecting previously unselected package nscd.
(Reading database ... 53350 files and directories currently installed.)
Preparing to unpack .../nscd_2.19-18+deb8u1_amd64.deb ...
Unpacking nscd (2.19-18+deb8u1) ...
Processing triggers for systemd (215-17+deb8u2) ...
Processing triggers for man-db (2.7.0.2-5) ...
Setting up nscd (2.19-18+deb8u1) ...
Processing triggers for systemd (215-17+deb8u2) ...
root@example:~# service nscd start
root@example:~# 
</code></pre>
<p>Der letzte Befehl stellt sicher, dass nscd auch wirklich bereits läuft. Danach sollte der Socket <code>/var/run/nscd/socket</code> existieren.</p>
<h6 id="chrootverzeichnisstrukturautomatischerstellenundabbauen">Chroot-Verzeichnisstruktur automatisch erstellen und abbauen</h6>
<p>Als nächstes kümmern wir uns darum, dass die richtigen und nötigen Dateien in der Chroot-Umgebung existieren. Zur Verdeutlichung, meine Verzeichnisstruktur ist so, dass ich für jede Domain auf der eine Website läuft einen eigenen Ordner aufsetze in <code>/var/www</code>. Also als Tree-Ansicht:</p>
<pre><code>├── example.org/                                     &lt;= Soll im Chroot laufen
│   ├── htdocs/
│   │   └── index.php
│   ├── logs/
|   └── tmp/
├── sub.example.org/                                 &lt;= Soll im Chroot laufen
│   ├── htdocs/
│   │   └── index.php
│   ├── logs/
|   └── tmp/
└── underconstruction.example.org/                   &lt;= Das hier soll nachher nicht in einem Chroot laufen
    └── htdocs/
        └── index.html
</code></pre>
<p>Damit die Chroot-Umgebung anständig laufen kann müssen wir ein paar zusätzliche Ordner und Dateien freigeben auf die PHP dann von innen heraus zugreifen kann. <code>mount --bind</code> ist ein guter Weg um den Zugriff auf solche Dateien zu gewähren, das vermeidet vor allem zusätzliche Festplattenspeicherbelegung und es ist einfach generell eine sauberere Lösung.</p>
<p>Hier die Liste der Dateien und Ordner die ich freigebe samt Grund:</p>
<ul>
<li><code>/dev/null</code>, <code>/dev/random</code>, <code>/dev/urandom</code>, <code>/dev/zero</code> um Grundfunktionalitäten zu gewährleisten.</li>
<li><code>/usr/share/zoneinfo</code> um die Zeitzonenberechnung in PHP nicht zu beeinträchtigen, praktisch für Foren etc.</li>
<li><code>/etc/ssl/certs</code> und der eigentliche Ordner mit den Zertifikaten <code>/usr/share/ca-certificates</code> um kein Drama mit gültigen SSL-Zertifikaten bei HTTP-Verbindungen zu verursachen.</li>
<li><code>/var/run/mysqld</code> für die Freigabe des MySQL Serversockets.</li>
<li><code>/etc/hosts</code>, <code>/etc/resolv.conf</code> und <code>/var/run/nscd</code> für die Freigabe des oben genannten nscd Sockets damit DNS-Anfragen problemlos ablaufen.</li>
</ul>
<p>Allerdings kann es ein bisschen nervig sein das für jede Webseite manuell machen zu müssen, daher habe ich mir dafür ein sogenanntes LSB-Init-Skript geschrieben, das man in <code>/etc/init.d</code> einfügen kann und das dann beim Hochfahren und Herunterfahren des Systems mitstarten kann um bei neuen Webseiten einfach den Chroot automatisch aufzusetzen und sauber die Mounts wieder abzubauen bevor das System herunterfährt.</p>
<p>Den folgenden Inhalt habe ich unter <code>/etc/init.d/php5-fpm-chroot-setup</code> abgespeichert und dann mit <code>chmod +x</code> ausführbar gemacht. <code>Required-Start: nscd</code> stellt sicher, dass das Skript automatisch nach dem nscd hochfährt und die <code>CHROOT_FILES</code>-Variable enthält alle Ordner- und Dateipfade die in die Chroot-Umgebung gemountet werden sollen.</p>
<pre><code class="language-sh">#!/bin/sh

### BEGIN INIT INFO
# Provides:          php5-fpm-chroot-setup
# Required-Start:    nscd
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Mounts needed sockets and other data into a previously set up chroot environment.
### END INIT INFO

# Hier die Dateien und Ordner die in die Chroot-Umgebung gemountet werden sollen
CHROOT_FILES=&quot;/etc/hosts /etc/resolv.conf /etc/ssl/certs /usr/share/ca-certificates /dev/null /dev/random /dev/urandom /dev/zero /var/run/mysqld /var/run/nscd /usr/share/zoneinfo&quot;

case &quot;$1&quot; in
    restart|force-reload|start)
        # Aufräumen bevor wir aufbauen
        $0 stop 2&gt;/dev/null

        for chrootdir in /var/www/*; do
            # Nur in Ordnern mit eigenem /tmp Verzeichnis als Markierung einen Chroot aufsetzen
            if [ -d &quot;${chrootdir}/tmp&quot; ]; then
                # Berechtigungen von /tmp korrigieren
                chmod 777 &quot;${chrootdir}/tmp&quot;
                chmod +t &quot;${chrootdir}/tmp&quot;

                echo &quot;Setting up ${chrootdir}...&quot;
                for f in $CHROOT_FILES; do
                    if [ -d &quot;$f&quot; ]; then
                        # $f ist ein Pfad zu einem Verzeichnis
                        mkdir -p &quot;${chrootdir}${f}&quot;
                        mount --bind -o ro &quot;${f}&quot; &quot;${chrootdir}${f}&quot;
                    else
                        # $f ist ein Pfad zu einer Datei
                        mkdir -p &quot;${chrootdir}$(dirname &quot;${f}&quot;)&quot;
                        touch &quot;${chrootdir}${f}&quot;
                        mount --bind -o ro &quot;${f}&quot; &quot;${chrootdir}${f}&quot;
                    fi
                done
            fi
        done
    ;;

    stop)
        for chrootdir in /var/www/*; do
            if [ -d &quot;${chrootdir}/tmp&quot; ]; then
                echo &quot;Destructing ${chrootdir}...&quot;
                for f in $CHROOT_FILES; do
                    umount &quot;${chrootdir}${f}&quot;
                    if [ -d &quot;${chrootdir}${f}&quot; ] &amp;&amp; [ ! $(ls -A &quot;${chrootdir}${f}&quot;) ]; then
                        # Leerer Ordner, kann man löschen
                        rmdir &quot;${chrootdir}${f}&quot;
                    elif [ -f &quot;${chrootdir}${f}&quot; ]; then
                        # Datei, kann man löschen
                        rm &quot;${chrootdir}${f}&quot;
                    fi
                done
            fi
        done
    ;;

    *)
        echo &quot;Usage: $N {start|stop|restart|force-reload}&quot; &gt;&amp;2
        exit 1
    ;;
esac

exit 0
</code></pre>
<p>Klar kann dieses Skript ausgebaut werden, z.B. so, dass die Liste von Dateien die gemountet werden aus einer anderen Datei eingelesen wird, anstatt dass sie fest eingeschrieben wird. Außerdem wird hier einfach alles aus Sicherheitsgründen als &quot;read-only&quot; gemountet, was in manchen Situationen vielleicht unerwünscht ist. Aber als Basis funktioniert das wunderbar.</p>
<p>Zuletzt müssen wir, damit dieses Skript seine Arbeit automatisch beim Hoch- und Herunterfahren verrichtet, das Skript auch mittels <code>update-rc.d</code> installieren:</p>
<pre><code>root@example:~# update-rc.d php5-fpm-chroot-setup defaults
root@example:~#
</code></pre>
<p>Das was jetzt noch manuell erstellt werden muss sind in jedem Chroot jeweils ein Ordner für die HTTP-Dokumente, einer für Logs, einer für PHP-Sessions und noch einer für temporäre Dateien. Ich habe das so gemacht im Chroot-Ordner:</p>
<ul>
<li><code>htdocs</code> Unterordner für HTTP Dokumente mit eigenem persönlichen Unix Account als Besitzer, nur Unterordner/Dateien die Schreibrechte brauchen haben entsprechende Berechtigung via <code>chown</code> oder <code>chmod</code>.</li>
<li><code>logs</code> Unterordner für Webserverlogs mit dem vorher angelegten PHP-Benutzer als Besitzer.</li>
<li><code>tmp</code> Unterordner mit dem vorher angelegten PHP-Benutzer als Besitzer, wird vom Skript automatisch mit den richtigen Berechtigungen ausgestattet wird. PHP nutzt standardmäßig diesen Ordner wenn nichts anderes manuell als temporäres Verzeichnis gesetzt wurde.</li>
<li><code>sessions</code> Unterordner (weiter oben im PHP-Pool als Session-Speicherordner konfiguriert) mit oben angelegtem User als Besitzer und Modus <code>700</code> aus Sicherheitsgründen.</li>
</ul>
<p>Oder kurz in ein paar Befehlen:</p>
<pre><code>root@example:/var/www/example.org# mkdir -p htdocs logs tmp sessions
root@example:/var/www/example.org# chown icedream:icedream htdocs
root@example:/var/www/example.org# chown www-example-org:www-data logs
root@example:/var/www/example.org# chown www-example-org:www-data sessions
root@example:/var/www/example.org# chmod 700 sessions
</code></pre>
<p>Danach können wir <code>/etc/init.d/php5-fpm-chroot-setup start</code> ausführen und danach sollten wir sehen, dass das Skript in den Chroot-Ordnern die benötigten Sachen anständig gemountet hat:</p>
<pre><code>root@example:~# /etc/init.d/php5-fpm-chroot-setup start
Destructing /var/www/example.org...
Destructing /var/www/sub.example.org...
Setting up /var/www/example.org...
Setting up /var/www/sub.example.org...
root@example:~# ls /var/www/example.org
dev  etc  htdocs  sessions  tmp  usr  var
root@example:~#
</code></pre>
<p>Die &quot;Destructing&quot; Meldung rührt daher, dass das Skript automatisch das Abbauen eines eventuellen fehlerhaften vorherigen Chroot-Setups probiert bevor er den Chroot neu aufbaut um inkonsistente Setups zu vermeiden. Dieses Abbauen kann manuell mittels <code>/etc/init.d/php5-fpm-chroot-setup stop</code> angestoßen werden um zum Beispiel vor Backups das Chroot-Verzeichnis zu reinigen.</p>
<h6 id="konfigurierendeswebservers">Konfigurieren des Webservers</h6>
<p>Als nächstes müssen wir unsere Webseite im Webserver so konfigurieren, dass sie auch durch den soeben konfigurierten PHP-Pool in der Chroot-Umgebung läuft. Hier benutze ich Nginx aber in Apache sollte das ebenfalls einfach zu machen sein.</p>
<p>Wir legen für jede Webseite die im Chroot laufen wird im <code>/etc/nginx/sites-available</code> Ordner eine eigene Konfigurationsdatei an, die so ähnlich wie diese aussieht:</p>
<pre><code class="language-nginx">server {
        listen 80;
        listen [::]:80;

        root /var/www/example.org/htdocs;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.org;

        # Hier ist der wichtige Teil! Damit sagen wir Nginx, dass er den PHP-Pool, den wir
        # speziell für diese Seite aufgesetzt haben, auch benutzen soll.
        location ~ \.(php|php/.*)$ {
                include snippets/fastcgi-php.conf;
                fastcgi_param   SCRIPT_FILENAME /htdocs/$fastcgi_script_name;
                fastcgi_pass unix:/var/run/php5-fpm-chroot-example.org.sock;
        }
}
</code></pre>
<p>Seiten die nicht im Chroot laufen werden brauchen dann auch natürlich nicht die Sektion in der Konfiguration mit dem eigenen PHP-Socket.</p>
<p>Nicht vergessen die Konfiguration dann auch unter <code>/etc/nginx/sites-enabled</code> korrekt zu verlinken damit Nginx diese auch beim Laden miteinbezieht:</p>
<pre><code>root@example:/etc/nginx/sites-enabled# ln -s ../sites-available/example.org
</code></pre>
<h6 id="letzteschritte">Letzte Schritte</h6>
<p>Nach einem <code>service php5-fpm restart</code> sollte dann der neue Socket für den Pool in <code>/var/run/php5-fpm-chroot-example.org.sock</code> angelegt sein und ein anschließendes <code>service nginx reload</code> oder <code>service nginx restart</code> sollte den Nginx dazu bringen die neuen Webseitenkonfigurationen zu laden.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Online.net: IPv6 unter Debian einrichten]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Da IPv4 Adressen zur Neige gehen und man nun bei jedem ordentlichen Hoster ein /64 oder sogar /48 IPv6 Block bekommt, stellt sich die Frage warum man nicht diese Option nutzt, um für die Zukunft gerüstet zu sein.</p>
<p>Ich stelle hier nun eine Möglichkeit vor, mit dem ihr kinderleicht ein</p>]]></description><link>https://blog.kthx.at/2015/09/11/online-net-ipv6-unter-debian-einrichten6/</link><guid isPermaLink="false">5b083843124da00001783e9e</guid><category><![CDATA[online.net]]></category><category><![CDATA[Debian]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[Gateway]]></category><dc:creator><![CDATA[Peter]]></dc:creator><pubDate>Fri, 11 Sep 2015 15:40:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/1500x500.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/1500x500.jpg" alt="Online.net: IPv6 unter Debian einrichten"><p>Da IPv4 Adressen zur Neige gehen und man nun bei jedem ordentlichen Hoster ein /64 oder sogar /48 IPv6 Block bekommt, stellt sich die Frage warum man nicht diese Option nutzt, um für die Zukunft gerüstet zu sein.</p>
<p>Ich stelle hier nun eine Möglichkeit vor, mit dem ihr kinderleicht ein /48 IPv6 Block mit eurem online.net Server einrichtet.</p>
<h5 id="anforderungen">Anforderungen</h5>
<ul>
<li>online.net Server</li>
<li>root SSH Login</li>
</ul>
<p>Zuerst müsst ihr euch auf euren Server via SSH mit dem <code>root</code> User aufschalten. Dafür könnt ihr z.B. PuTTY benutzen.<br>
Anschließend erstellt ihr ein neues Script, das z.B <code>ipv6.sh</code> heißt. Der Inhalt dieses Scripts sieht folgendermaßen aus:</p>
<pre><code>#/bin/bash

DUID=$1

skill -9 dibbler-client
dpkg -P dibbler-client
rm -rvf /etc/dibbler /var/log/dibbler /var/lib/dibbler

apt-get install -y wide-dhcpv6-client vim-common tcpdump

/etc/init.d/wide-dhcpv6-client stop

echo 'profile default { script &quot;/etc/wide-dhcpv6/dhcp6c-script&quot;; };' &gt; /etc/wide/dhcpv6/dhcp6c.conf
echo 'id-assoc pd { prefix-interface eth0 { }; };' &gt;&gt; /etc/wide-dhcpv6/dhcp6c.conf
echo 'interface eth0 { send ia-pd 0; };' &gt;&gt; /etc/wide-dhcpv6/dhcp6c.conf
echo $DUID | awk '{ gsub(&quot;:&quot;,&quot; &quot;); printf &quot;0: 0a 00 %s\n&quot;, $0 }' | xxd -r &gt; /var/lib/dhcpv6/dhcp6c_duid

/etc/init.d/wide-dhcpv6-client start
</code></pre>
<p>Um das Script ausführbar zu machen, müsst ihr die Dateirechte verändern:</p>
<pre><code>chmod +x ipv6.sh  
</code></pre>
<p>Nun braucht ihr die DUID des IPv6 Blocks aus dem Controlpanel. Geht auf die Serverliste, wählt euren Server aus und klickt auf den IPv6 Reiter auf der linken Seite.<br>
Sucht oder erstellt euch einen Block und kopiert die DUID.<br>
Anschließen führt ihr das Script mit folgendem Befehl aus:</p>
<pre><code>./ipv6.sh DUID
</code></pre>
<p>Allerdings reicht das Script selbst nicht aus, also müsst ihr als nächstes den richtigen Gateway vom Router finden. Am Besten funktioniert das mit</p>
<pre><code>tcpdump -i eth0 -n -s 4000 -v ip6
</code></pre>
<p>Um nun die Gateway IP zu finden muss man nach einer Zeile, die <code>router advertisement</code> beinhaltet suchen.<br>
In meinem Fall wäre es<br>
<code>15:22:16.257672 IP6 (class 0xe0, hlim 255, next-header ICMPv6 (58) payload length: 32) fe80::e34f:6de3:bd24:42ff &gt; ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 32</code><br>
In diesem Fall ist <code>fe80::e34f:6de3:bd24:42ff</code> die Gateway IP.</p>
<p>Öffnet <code>/etc/network/interfaces</code> mit eurem Lieblingseditor und tragt folgende Einstellungen ein:</p>
<pre><code>iface eth0 inet6 static
address DEIN_IPv6_BLOCK::1
netmask 48
gateway DEINE_GATEWAY_IP
accept_ra 1
</code></pre>
<p>Damit der Linuxkernel noch die Anfragen annimmt und weiterschickt, muss folgendes in die <code>/etc/sysctl.conf</code> geschrieben werden:</p>
<pre><code>net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.eth0.autoconf = 0
net.ipv6.conf.eth0.accept_ra=1
</code></pre>
<p>Anschließend mit <code>sysctl -p</code> die Datei neu einlesen.</p>
<p>Um den DHCPv6 Client bei jedem Neustart des Server zu starten, tragt einfach folgendes in eure <code>/etc/rc.local</code> ein:</p>
<pre><code>/etc/init.d/wide-dhcpv6-client restart
ifdown eth0 &amp;&amp; ifup eth0
</code></pre>
<p>Nun sollte alles funktionieren! Startet euren Netzwerkadapter mit <code>ifdown eth0 &amp;&amp; ifup eth0</code> neu und pingt eine IPv6 fähige IP an:</p>
<pre><code>magic@ffmwu:~$ ping6 -c4  ipv6.google.com
PING google.com(par03s13-in-x08.1e100.net) 56 data bytes
64 bytes from par03s13-in-x08.1e100.net: icmp_seq=1 ttl=58 time=0.913 ms
64 bytes from par03s13-in-x08.1e100.net: icmp_seq=2 ttl=58 time=0.999 ms
64 bytes from par03s13-in-x08.1e100.net: icmp_seq=3 ttl=58 time=1.42 ms
64 bytes from par03s13-in-x08.1e100.net: icmp_seq=4 ttl=58 time=1.01 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.913/1.086/1.420/0.197 ms
</code></pre>
<p><em>Wichtig für das Ganze ist, dass Ihr in eurer Firewall Port 546 und 547 UDP freigibt</em></p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Wer aktuell mit einem Unitymedia oder einem Telekom Hybrid LTE Anschluss einen Standort mit seinem Hauptstandort verbinden möchte, wird früher oder später auf das Problem stoßen, dass man dank der IP Adressen Knappheit keine eigene IPv4 Adresse mehr von seinem Provider bekommt. Sondern über einen sogenannten DS-lite Tunnel, der sich</p>]]></description><link>https://blog.kthx.at/2015/09/07/ipfire-openvpn-site2site-tunnel-uber-ds-lite-tunnel/</link><guid isPermaLink="false">5b083843124da00001783e9a</guid><category><![CDATA[IPFire]]></category><category><![CDATA[OpenVPN]]></category><category><![CDATA[netz zu netz]]></category><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Mon, 07 Sep 2015 11:40:31 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/ipfire-4.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/ipfire-4.png" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"><p>Wer aktuell mit einem Unitymedia oder einem Telekom Hybrid LTE Anschluss einen Standort mit seinem Hauptstandort verbinden möchte, wird früher oder später auf das Problem stoßen, dass man dank der IP Adressen Knappheit keine eigene IPv4 Adresse mehr von seinem Provider bekommt. Sondern über einen sogenannten DS-lite Tunnel, der sich hinter einem NAT-Gateway befindet, sich ins Internet Verbindet. Somit teilt man sich eine öffentliche IPv4-Adresse mit mehreren Leuten.<br>
Es ist also keine Freigabe mehr von Ports über IPv4 möglich.<br>
Ich habe sehr lange nach einer Lösung für dieses Problem gesucht und möchte diese hier einmal für euch Dokumentieren.</p>
<h4 id="vorwort">Vorwort</h4>
<ul>
<li>Benötigt wird in beiden Standorten eine IPfire die dort auch als Gateway im Netzwerk fungiert.</li>
<li>Es muss gewährleistet sein das beide Standorte sich in einem eigenen Subnetz befinden</li>
<li>Der Hauptstandort benötigt eine Statische IPv4 Adresse, optional ein DynDNS</li>
</ul>
<h4 id="konfiguration">Konfiguration</h4>
<p><strong>Konfiguration von Hauptstandort:</strong><br>
Wir öffnen das Webinterface der Ipfire in meinem Fall ist dieses erreichbar unter <a href="https://10.0.0.1:444">https://10.0.0.1:444</a>. Dort angekommen gehen wir auf <code>Services/OpenVPN</code>.<br>
(Wenn wir das erste Mal die OpenVPN Konfigurationsseite öffnen, werden wir darauf hingewiesen ein Zertifikat zu generieren. Hier wählt ihr am besten einen 2048bit Schlüssel aus und warte ab bis dieser erstellt ist, was je nach Hardware einige Zeit dauern kann.)<br>
Ist das abgeschlossen landen wir im eigentlichen Konfigurationsmenü von OpenVPN<br>
<img src="https://blog.kthx.at/content/images/2015/09/ipfire-openvpn1.png" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"><br>
Wir klicken auf <code>Add</code> und erstellen uns ein <code>Net-to-Net Virtual Private Network</code><br>
<img src="https://blog.kthx.at/content/images/2015/09/ipfire-openvpn2.png" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"><br>
mit einem weiteren Klick auf <code>Add</code> kommt man in das Einstellung der N2N VPN Verbindung.</p>
<p><strong>Name:</strong> Hier vergibt man am besten den Namen des Standorts, der für den Tunnel vorgesehen ist.<br>
<strong>Act as:</strong> bleibt auf OpenVPN Server stehen.<br>
<strong>Remote host/IP:</strong> dieses Feld wird hier leer gelassen, somit erlauben wir die Einwahl von jeder IP-Adresse (später kann dies mit Firewallregeln  abgesichert werden)<br>
<strong>Local subnet:</strong> Hier tragen das Subnetz unseres Hauptstandorts ein,<br>
in meinem Fall: <code>10.0.0.0/24</code><br>
<strong>Remote subnet:</strong> Hier tragen wir das Subnetz unseres standortB ein, in meinem Fall: <code>10.0.1.0/24</code><br>
<strong>OpenVPN subnet:</strong> Wichtig ist hier eine IP Range zu wählen die zukünftig nicht in Verwendung ist, da wir hier nur 2 IP Adressen benötigen reicht uns eine /30 IP Range <code>172.30.60.0/255.255.255.252</code><br>
<strong>Destination port:</strong> Hier vergeben wir einen Port über den später die VPN Verbindung abläuft. (Dieser Port ist unabhängig von den normalen OpenVPN Server Einstellungen, in meinem Fall: <code>9988</code>)<br>
<strong>Manage Port:</strong> Hier tragen wir den selben Port ein der auch bei Destination Port vergeben wurde.</p>
<h6 id="mtusettings"><strong>MTU settings</strong></h6>
<p>Hier kann vorerst alles auf Standardeinstellungen gelassen werden.<br>
Um später mit der Performanz noch etwas zu experimentieren, können hier die Einstellungen getestet werden. z.B. <code>LZO-Compression</code></p>
<h6 id="cryptographicoptions"><strong>Cryptographic options</strong></h6>
<p><strong>Encryption:</strong>   <code>AES-CBC (256 bit, Default)</code><br>
<strong>Hash algorithm:</strong> <code>SHA2 (512 bit)</code></p>
<h6 id="authentication"><strong>Authentication</strong></h6>
<p><strong>User's full name or system hostname:</strong> <code>standortB</code></p>
<p>Zum Abschluss klicken wir auf <code>Save</code>.<br>
Wir starten das VPN Interface mit dem Klick auf die Checkbox im Menüpunkt Action.<br>
<img src="https://blog.kthx.at/content/images/2015/09/Enable-1.PNG" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"><br>
Um unser Zertifikat zu erhalten klicken wir bei <code>OpenVPN Net-to-Net</code> auf <code>Download Client Package (zip)</code>. Hier erhalten wir unsere <code>standortB-Client.zip</code>, die wir in unserem nächsten Schritt benötigen.</p>
<p>Als nächstes melden wir uns auf der IPFire an standortB im Webinterface an. (Die eine Verbindung zu unserer Haupt- IPFire aufbauen soll.)</p>
<p>Dort Wechseln wir in die OpenVPN Konfiguration und klicken auf <code>Add</code>.<br>
Hier laden wir unsere zuvor Heruntergeladene <code>standortB-Client.zip</code> hoch.<br>
<img src="https://blog.kthx.at/content/images/2015/09/upload.PNG" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"><br>
Ein Klick auf <code>Add</code> zeigt uns nochmals die von uns gesetzten Einstellungen. Wir akzeptieren das mit einem weiteren Klick auf <code>Add</code>.<br>
Als letzten Schritt muss das eben von uns angelegte VPN-Interface mit einem Klick auf die Checkbox gestartet werden.<br>
Die Statusleiste sollte uns jetzt <code>Connected</code> anzeigen. Somit steht unsere Verbindung!<br>
<img src="https://blog.kthx.at/content/images/2015/09/enable2.PNG" alt="IPFire: OpenVPN Site2Site Tunnel über DS-Lite oder Telekom Magenta Hybrid"></p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ubuntu: Booten via PXE von iSCSI Target]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Heute möchte ich mich damit beschäftigen wie man ein Ubuntu-System via PXE von einem iSCSI Target zum booten bringen kann.</p>
<h4 id="anwendungszweck">Anwendungszweck</h4>
<p>In meinem PC ist jedeglich eine SSD verbaut und ich habe keine große Lust die Partitionierung dieser zu ändern. Außerdem läuft bei mir im LAN schon ein PXE Server,</p>]]></description><link>https://blog.kthx.at/2015/09/07/ubuntu-booten-via-pxe-von-iscsi-target/</link><guid isPermaLink="false">5b083843124da00001783e9b</guid><category><![CDATA[Linux]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[iSCSI]]></category><category><![CDATA[PXE]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[TFTP]]></category><category><![CDATA[iscsitarget]]></category><category><![CDATA[open-iscsi]]></category><category><![CDATA[Setup]]></category><category><![CDATA[SAN]]></category><dc:creator><![CDATA[Stefan]]></dc:creator><pubDate>Mon, 07 Sep 2015 10:51:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/ubuntu-2.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/ubuntu-2.jpg" alt="Ubuntu: Booten via PXE von iSCSI Target"><p>Heute möchte ich mich damit beschäftigen wie man ein Ubuntu-System via PXE von einem iSCSI Target zum booten bringen kann.</p>
<h4 id="anwendungszweck">Anwendungszweck</h4>
<p>In meinem PC ist jedeglich eine SSD verbaut und ich habe keine große Lust die Partitionierung dieser zu ändern. Außerdem läuft bei mir im LAN schon ein PXE Server, weshalb also nicht einfach Ubuntu auf einem iSCSI Target installieren und via PXE davon booten?</p>
<p><em><strong>Anmerkung:</strong></em> <em>Ich setze für dieses Tutorial voraus das bereits ein korrekt konfigurierter PXE Server vorhanden ist, der in eine Syslinux-Umgebung bootet.</em></p>
<h4 id="iscsiamservereinrichten">iSCSI am Server einrichten</h4>
<h6 id="vorwort">Vorwort</h6>
<p>Zu Beginn benötigen wir erstmal ein Medium das via iSCSI freigegeben werden soll, dafür kann man entweder eine komplette Festplatte verwenden, diese darf dann allerdings am Server nicht gemountet werden und kann somit auch nur noch für iSCSI verwendet werden.<br>
Oder die zweite Möglichkeit, die ich auch bei mir angewandt habe, wir erstellen uns einen Festplatten Container und geben diesen frei.</p>
<h6 id="paketeinstallieren">Pakete installieren</h6>
<pre><code>bash:~$ apt-get update &amp;&amp; apt-get install iscsitarget iscsitarget-dkms -y
</code></pre>
<h6 id="containererzeugen">Container erzeugen</h6>
<pre><code>bash:~$ mkdir /iscsi_disks &amp;&amp; cd /iscsi_disks
bash:~$ dd if=/dev/zero of=ubuntu.disk count=0 bs=1 seek=80G
</code></pre>
<p>So erzeugen wir einen Container der später bis zu 80 GB groß werden darf, natürlich kann man die Größe beliebig anpassen.</p>
<h6 id="freigabeeinrichten">Freigabe einrichten</h6>
<pre><code>bash:~$ nano -w /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

bash:~$ nano -w /etc/iet/ietd.conf
# namens-regel: [iqn.jahr-monat.domain/ip:name]
Target iqn.2015-09.server.local:ubuntu
   Lun 0 Path=/iscsi_disks/ubuntu.disk,Type=fileio
   # Optional: ip des iSCSI Initiators, der sich verbinden darf (kann auch ein ganzes Netzwerk sein)
   initiator-address 192.168.2.0/24

bash:~$ /etc/init.d/iscsitarget restart
</code></pre>
<h6 id="freigabeberprfen">Freigabe überprüfen</h6>
<pre><code>bash:~$ ietadm --op show --tid=1
# Ausgabe:
Wthreads=8
Type=0
QueuedCommands=32
NOPInterval=0
NOPTimeout=0
</code></pre>
<h5 id="ubuntuinstallieren">Ubuntu installieren</h5>
<p><em><strong>Tip:</strong></em> <em>Bevor man mit der Installation beginnt sollte man sicherheitshalber alle im PC verbauten Festplatten abklemmen.</em></p>
<p>Zuerst booten wir ein normales Ubuntu Live System (CD/USB-Stick/PXE), dort öffnen wir erstmal ein Terminal und installieren die benötigten Pakete:</p>
<pre><code>bash:~$ sudo -i
bash:~$ apt-get update &amp;&amp; apt-get install open-iscsi -y
bash:~$ /etc/init.d/open-iscsi start
</code></pre>
<h6 id="iscsilaufwerkeinhngen">iSCSI Laufwerk einhängen</h6>
<pre><code>bash:~$ iscsiadm -m discovery -t st -p server.local
# Ausgabe:
192.168.2.2:3260,1 iqn.2015-09.server.local:ubuntu

bash:~$ iscsiadm -m node --targetname &quot;iqn.2015-09.server.local:ubuntu&quot; --portal &quot;server.local:3260&quot; --login
</code></pre>
<p>Nun können wir den normalen Ubuntu-Installer starten, die Partitionierung erledigen wir manuell und erstellen eine Partition für unseren Swap <em>(Empfehlung: 2GB)</em> und eine weitere Partition für unser System <em>(root)</em>, der wir den restlichen Speicher zuweisen. Dann fahren wir wie gewohnt mit der Installation fort.</p>
<p>Nachdem die Installation abgeschlossen ist <u><strong>starten wir nicht neu</strong></u>!</p>
<p>Damit unser firsch installiertes System booten kann sind noch ein paar Schritte nötig, wir müssen dazu mittels <code>chroot</code> in das System wechseln:</p>
<pre><code>bash:~$ sudo -i
bash:~$ mount /dev/sda2 /mnt
bash:~$ chroot /mnt /bin/bash
bash:~/$ mount -t proc none /proc
bash:~/$ echo &quot;nameserver 192.168.2.1&quot; &gt;&gt; /etc/resolv.conf
bash:~/$ apt-get update &amp;&amp; apt-get install initramfs-tools open-iscsi sysv-rc-conf -y
bash:~/$ echo &quot;iscsi&quot; &gt;&gt; /etc/initramfs-tools/modules
bash:~/$ echo &quot;InitiatorName=iqn.2015-09.server.local:ubuntu-client1&quot; &gt; /etc/iscsi/initiatorname.iscsi
bash:~/$ touch /etc/iscsi/iscsi.initramfs
bash:~/$ update-initramfs -u
bash:~/$ nano -w /etc/network/interfaces
auto eth0
iface eth0 manual

# Kernel und Initialramdisk auf den PXE Server kopieren
bash:~/$ scp /vmlinuz /initrd.img root@server.local:/tftp/iscsi/

# Umgebung verlassen
bash:~/$ umount /proc
bash:~/$ exit
</code></pre>
<p>Damit sollte unser System nun in der Lage sein zu booten, nun müssen wir nur noch einen Eintrag in unserem Syslinux Menü anlegen:</p>
<pre><code>label ubuntu-iscsi
    menu label Ubuntu (iSCSI)
    kernel iscsi/vmlinuz
    append initrd=iscsi/initrd.img ip=dhcp ISCSI_INITIATOR=iqn.2015-09.server.local:ubuntu-client1 ISCSI_TARGET=iqn.2015-09.server.local:ubuntu ISCSI_TARGET_IP=server.local ISCSI_TARGET_PORT=3260 root=UUID=5c0bd3d6-b43b-48d4-ac82-cc9b364f4544 rw
</code></pre>
<p><em><strong>Anmerkung:</strong></em> <em>Sollte der Domainname bei <code>ISCSI_TARGET_IP</code> nicht funktionieren, gibt man die IP-Adresse stattdessen an, außerdem ist bei <code>root</code> die <code>UUID</code> von <code>/dev/sda2</code> auf unserem iSCSI Target gemeint auslesen kann man sie wie folgt:</em></p>
<pre><code>bash:~$ sudo blkid /dev/sda2
</code></pre>
<p><em>Sollte man nach dem Boot nur einen schwarzen Bildschirm vorfinden hilft eventuell der Parameter <code>nomodeset</code>.</em></p>
<p>Somit sind wir nun fertig und können nun unser System via PXE booten.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[VMWare ESXi: ESXi 6.0 Custom ISO mit Community Treiberpaket]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Ich habe mich dazu entschlossen diesen Betrag zu schreiben da VMware seit ESXi 5.5 sehr viele Treiber für normale Hardware entfernt hat.<br>
Ohne diese es jedoch nicht mehr ohne weiteres möglich ist ESXi 6.0 beispielsweiße auf einem Normalen PC / Server zu installieren</p>
<h4 id="vorbereitung">Vorbereitung</h4>
<ul>
<li><a href="https://vibsdepot.v-front.de/wiki/index.php/ESXi-Customizer">ESXi-Customizer</a></li>
<li><a href="https://vibsdepot.v-front.de/wiki/index.php/Net51-drivers">Net51-drivers.vib</a></li>
<li><a href="https://my.vmware.com/web/vmware/evalcenter?p=free-esxi6">ESXi 6.</a></li></ul>]]></description><link>https://blog.kthx.at/2015/08/11/vmware-esxi-esxi-6-0-custom-iso-mit-community-treiberpaket/</link><guid isPermaLink="false">5b083843124da00001783e98</guid><category><![CDATA[Driver]]></category><category><![CDATA[Treiber]]></category><category><![CDATA[ESXi]]></category><category><![CDATA[6.0]]></category><category><![CDATA[ESXi-Customizer]]></category><category><![CDATA[UNetbootin]]></category><category><![CDATA[V-Front.de]]></category><category><![CDATA[VMWare]]></category><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Tue, 11 Aug 2015 08:31:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/vmware-2.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/vmware-2.jpg" alt="VMWare ESXi: ESXi 6.0 Custom ISO mit Community Treiberpaket"><p>Ich habe mich dazu entschlossen diesen Betrag zu schreiben da VMware seit ESXi 5.5 sehr viele Treiber für normale Hardware entfernt hat.<br>
Ohne diese es jedoch nicht mehr ohne weiteres möglich ist ESXi 6.0 beispielsweiße auf einem Normalen PC / Server zu installieren</p>
<h4 id="vorbereitung">Vorbereitung</h4>
<ul>
<li><a href="https://vibsdepot.v-front.de/wiki/index.php/ESXi-Customizer">ESXi-Customizer</a></li>
<li><a href="https://vibsdepot.v-front.de/wiki/index.php/Net51-drivers">Net51-drivers.vib</a></li>
<li><a href="https://my.vmware.com/web/vmware/evalcenter?p=free-esxi6">ESXi 6.0 ISO</a></li>
<li><a href="http://unetbootin.github.io">unetbootin</a> (optional)</li>
</ul>
<h4 id="durchfhrung">Durchführung</h4>
<p>Wir starten die ESXi-Customizer Anwendung:<br>
<img src="https://blog.kthx.at/content/images/2015/09/ESXi-Customizer.png" alt="VMWare ESXi: ESXi 6.0 Custom ISO mit Community Treiberpaket"><br>
Wir wählen wie erwünscht oben unsere ESXi 6.0 ISO aus.<br>
Im zweiten Bereich die gedownloadete VIB Datei mit allen enthaltenen ESXi 5.1 Treibern und klicken im letzten Schritt auf Run!</p>
<p>Die jetzt erstellte ISO Datei kann man sich jetzt entweder auf eine CD brennen, oder man erstellt sich einen bootbaren USB-Stick.<br>
Ich werde mir hier einen bootbaren USB-Stick mit der Software unetbootin erstellen<br>
<img src="https://blog.kthx.at/content/images/2015/09/UNetbootin.png" alt="VMWare ESXi: ESXi 6.0 Custom ISO mit Community Treiberpaket"><br>
Bei der Erstellung des USB-Sticks wird man gefragt ob einige Menü Dateien von UNetbootin überschrieben werden soll, das beantworten wir mit einem <code>Ja</code>.</p>
<p>Nachdem der USB-Stick erfolgreich erstellt wurde kann man mit der Installation beginnen!</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPFire: als OpenVPN Client nutzen]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Nachdem ich mir nun auch Zuhause eine IPFire hingestellt habe (<a href="https://blog.kthx.at/2015/02/28/ipfire-hardware-firewall-auf-apu-1c4-bundle-mit-dmz-und-wlan-access-point/">vielen Dank an Kevin</a>), wollte ich diese als Client für meine VPN-Verbindungen nutzen.</p>
<p><strong>Info:</strong> Die IP-Adresse meiner IPFire lautet <code>192.168.2.1</code> somit ist mein <code>green0</code> Netzwerk <code>192.168.2.0/24 (255.255.255.0)</code>.</p>
<p>Damit das Ganze</p>]]></description><link>https://blog.kthx.at/2015/04/05/ipfire-als-openvpn-client-nutzen/</link><guid isPermaLink="false">5b083843124da00001783e97</guid><category><![CDATA[Firewall]]></category><category><![CDATA[IPFire]]></category><category><![CDATA[Linux]]></category><category><![CDATA[OpenVPN]]></category><category><![CDATA[VPN]]></category><dc:creator><![CDATA[Stefan]]></dc:creator><pubDate>Sun, 05 Apr 2015 18:15:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/ipfire-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/ipfire-1.png" alt="IPFire: als OpenVPN Client nutzen"><p>Nachdem ich mir nun auch Zuhause eine IPFire hingestellt habe (<a href="https://blog.kthx.at/2015/02/28/ipfire-hardware-firewall-auf-apu-1c4-bundle-mit-dmz-und-wlan-access-point/">vielen Dank an Kevin</a>), wollte ich diese als Client für meine VPN-Verbindungen nutzen.</p>
<p><strong>Info:</strong> Die IP-Adresse meiner IPFire lautet <code>192.168.2.1</code> somit ist mein <code>green0</code> Netzwerk <code>192.168.2.0/24 (255.255.255.0)</code>.</p>
<p>Damit das Ganze funktioniert, muss man allerdings SSH auf der IPFire aktivieren.<br>
Dieses geht im Webinterface unter <code>System -&gt; SSH-Zugriff</code>.<br>
Dann schalten wir uns via SSH auf die IPFire auf:</p>
<pre><code>bash:~$ ssh root@192.168.2.1
</code></pre>
<p>Dort erstellen wir dann einen Ordner Namens <code>vpn</code>:</p>
<pre><code>bash:~$ mkdir vpn &amp;&amp; cd vpn
</code></pre>
<p>Ich habe zwei VPN’s mit denen ich mich verbinden möchte also erstelle ich mir nun zwei weitere Ordner im Ordner <code>vpn</code>:</p>
<pre><code>bash:~/vpn$ mkdir vpn1 vpn2
</code></pre>
<p>In diese Ordner kopiere ich meine Zertifikate und OpenVPN Konfigurationsdateien, allerdings müssen wir Letztere noch bearbeiten.</p>
<p>Der Pfad zu unserem Zertifikat muss nämlich absolut und nicht relativ sein, sonst gibts es später Probleme.<br>
Ebenfalls müssen wir, da wir mehr als ein VPN verwenden noch den adapter manuell angeben:</p>
<h6 id="vpn1">vpn1</h6>
<pre><code>dev tun0
</code></pre>
<h6 id="vpn2">vpn2</h6>
<pre><code>dev tun1
</code></pre>
<p>Somit verwendet unser erstes VPN immer <code>tun0</code> und das Zweite <code>tun1</code>.</p>
<p>Nachdem diese Vorberitungen nun abgeschlossen sind, können wir uns unser eigentliches Skript basteln:</p>
<h6 id="connectsh">connect.sh</h6>
<pre><code>#!/bin/bash
BASEPATH=/root/vpn
CONF_VPN1=$BASEPATH/vpn1/vpn1.ovpn
CONF_VPN2=$BASEPATH/vpn2/vpn2.ovpn
NET_GREEN0=192.168.2.0/24

# lade das für tun zuständige Kernel-Modul
modprobe tun

# verbinde mit vpn1
openvpn --config $CONF_VPN1 --daemon vpn1
# verbinde mit vpn2
openvpn --config $CONF_VPN2 --daemon vpn2

# erlaube den Zugriff auf das VPN von green0 aus
iptables -t nat -A POSTROUTING -s $NET_GREEN0 -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s $NET_GREEN0 -o tun1 -j MASQUERADE
</code></pre>
<p>Mit dem Befehl <code>chmod +x connect.sh</code> machen wir das Skript noch ausführbar und sind fertig.</p>
<p>Soll das Skript automatisch beim Booten ausgefürht werden, gibt man folgenden Befehl ein:</p>
<pre><code>bash:~$ echo &quot;/root/vpn/connect.sh&quot; &gt;&gt; /etc/sysconfig/rc.local
</code></pre>
<p>Nun wird unser Skript automatisch bei jedem Bootvorgang ausgeführt.</p>
<p>Alle PC’s, die nun im <code>green0</code> Netzwerk hängen, können nun unsere VPN-Verbindung verwenden, auf Wunsch kann man nun SSH wieder deaktivieren.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Heute bauen wir uns eine eigene Hardware Firewall, als Betriebssystem setze ich dazu Ipfire ein.<br>
Eine Open Source Firewall Distribution mit Deutschem Ursprung. <a href="http://www.ipfire.org">http://www.ipfire.org</a></p>
<h4 id="vorwort">Vorwort</h4>
<ul>
<li>Es muss die Möglichkeit bestehen seinen Router auf ein (bei Fritzbox <a href="http://avm.de/nc/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/131_DMZ-in-FRITZ-Box-einrichten/">exposed host</a> zu vergeben oder seinen Router auf <code>bridge Mode</code> zu</li></ul>]]></description><link>https://blog.kthx.at/2015/02/28/ipfire-hardware-firewall-auf-apu-1c4-bundle-mit-dmz-und-wlan-access-point/</link><guid isPermaLink="false">5b083843124da00001783e96</guid><category><![CDATA[DMZ]]></category><category><![CDATA[Firewall]]></category><category><![CDATA[Hardware FIrewall]]></category><category><![CDATA[IPFire]]></category><category><![CDATA[Linux]]></category><category><![CDATA[WLAN]]></category><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Sat, 28 Feb 2015 19:34:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/ipfire.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/ipfire.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><p>Heute bauen wir uns eine eigene Hardware Firewall, als Betriebssystem setze ich dazu Ipfire ein.<br>
Eine Open Source Firewall Distribution mit Deutschem Ursprung. <a href="http://www.ipfire.org">http://www.ipfire.org</a></p>
<h4 id="vorwort">Vorwort</h4>
<ul>
<li>Es muss die Möglichkeit bestehen seinen Router auf ein (bei Fritzbox <a href="http://avm.de/nc/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/131_DMZ-in-FRITZ-Box-einrichten/">exposed host</a> zu vergeben oder seinen Router auf <code>bridge Mode</code> zu schalten)</li>
</ul>
<h4 id="genutztehardware">Genutzte Hardware</h4>
<ul>
<li>1x <a href="http://www.amazon.de/gp/product/B005HXNUES?psc=1&amp;redirect=true&amp;ref_=oh_aui_detailpage_o04_s00">Digitus USB 2.0 RS 232 seriell Adapter</a></li>
<li>1x <a href="http://www.amazon.de/PC-Engines-Nachfolger-erfolgreichen-ALIX-Board/dp/B00NXU4XW0/ref=sr_1_4?ie=UTF8&amp;qid=1424210127&amp;sr=8-4&amp;keywords=PC+Engines+APU.1D4+Bundle">PC Engines APU.1D4 Bundle</a></li>
<li>1x [UD Atheros XSPANTM](UD Atheros XSPANTM)</li>
<li>2x [DELOCK WLANz Antenne](DELOCK WLANz Antenne)</li>
<li>1x <a href="http://www.amazon.de/gp/product/B006ANRHHU?psc=1&amp;redirect=true&amp;ref_=oh_aui_detailpage_o02_s00">BIGtec WLAN Adapterkabel RP SMA</a></li>
</ul>
<h4 id="genutztesoftware">Genutzte Software</h4>
<ul>
<li><a href="http://sourceforge.net/projects/win32diskimager/">win32diskimager</a></li>
<li>PuTTY</li>
<li>IPFire</li>
</ul>
<h3 id="derbau">Der Bau</h3>
<p>Der Einbau der Engines APU in das Aluminium Gehäuse gestaltet sich Relativ einfach und ist weitestgehend selbst erklärend.<br>
Wichtig ist an dem Punkt, nicht zu vergessen das beiliegende Kühl Pad an die Richtige Position unter des Mainboard an das Gehäuse zu Kleben.<br>
Da die APU keine Aktive Kühlung hat wird bei Weglassen des Pads die APU ihre besten tage wohl nicht lange haben.</p>
<h2 id="dieinstallation">Die Installation</h2>
<p>In meiner Konstellation möchte ich Ipfire auf die mPCIe SSD Installieren und natürlich auch davon starten.<br>
Dazu bereiten wir einen USB Stick vor, mit dem wir die APU Booten können. Dazu laden wir uns als aller erstes das ISO Image herunter, das finden wir auf der Ipfire Seite unter <a href="http://www.ipfire.org/">http://www.ipfire.org/</a>.<br>
Die nun vorliegende ISO Datei schreiben wir mit dem Tool <a href="http://sourceforge.net/projects/win32diskimager">win32diskimager</a> auf einen USB Stick der mindestens 1GB groß sein sollte. Nachdem unser USB Stick fertig ist stecken wir ihn an einen USB Port der APU.</p>
<p>Wir schließen nun unser <code>USB – Seriell Adapter</code> an unserem PC an und Installieren denn passenden Treiber Download. Bei mir wird der Adapter als <code>COM3</code> erkannt.<br>
<img src="https://blog.kthx.at/content/images/2015/09/COM3port.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Wir verbinden jetzt Das Seriell Kabel mit der APU und unsrem Adapter. Dazu ist zu beachten das wir Serial line auf <code>COM3</code> und der <code>Speed</code> auf <code>115200</code> gestellt wird, mit einem Klick auf <code>Open</code> starten wir die Verbindung mit unsrer APU.<br>
<img src="https://blog.kthx.at/content/images/2015/09/KiTTY-COM3.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Nun stecken wir unsere APU an den Strom und sehen sofort auf unsrem PuTTY Fenster eine Ausgabe.<br>
mit einem Klick auf <code>F12</code> öffnen wir das Boot Menü, dort wählen wir unseren USB Stick aus.<br>
<img src="https://blog.kthx.at/content/images/2015/09/1-.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Es sollte sich jetzt das Ipfire Installationsmenü starten.<br>
In diesem angekommen, gehen wir auf den Punkt <code>Serial console</code> options und von dort auf <code>Install IPFire (serial)</code> nun beginnt das Setup und wir klicken uns durch die Menüs, bis wir am Punkt sind wo wir unsere Festplatte auswählen können worauf IPFire installiert werden soll.  Wir wählen in unserem Fall die SATA-SSD aus und bestätigen mit einem klick auf <code>Alle Dateien löschen</code>.<br>
Wir wählen <code>ext4</code> als Dateisystem aus und bestätigen mit <code>OK</code>. Die Installation beginnt!<br>
<img src="https://blog.kthx.at/content/images/2015/09/8.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Nachdem die Installation erfolgreich abgeschlossen ist muss die IPFire Neugestartet werden, unsren USB stick können wir jetzt wieder abstecken.</p>
<h4 id="diegrundkonfiguration">Die Grundkonfiguration</h4>
<p>Nach dem Neustart landen wir in dem Installationsmenü in das wir später jederzeit wieder mit dem Befehl <code>setup</code> springen können, wir wählen <code>de-latin1</code> und geben unseren Domänennamen ein z.B. <code>xyz.local</code>.</p>
<p>Im <code>Netzwerkkonfigurationsmenü</code> klicken wir auf <code>Typ der Netzwerkkonfiguration</code> werden wir aufgefordert unseren Einsatzzweck zu bestimmen.</p>
<p>In meinem Beispiel ist das <code>GREEN + RED + ORANGE + BLUE</code> <em>(Green = LAN, Red = Internet, Orange = DMZ, Blue = Wlan)</em></p>
<p>Nun werden wir aufgefordert die <code>Netzwerkkartenzuordnung</code> vorzunehmen.<br>
<img src="https://blog.kthx.at/content/images/2015/09/16.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Für <code>GREEN</code> wählen wir unsere erste PCI Realtek Karte aus.<br>
<img src="https://blog.kthx.at/content/images/2015/09/17.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Für <code>RED</code> das 2. PCI Realtek Interface, für <code>ORANGE</code> das 3. PCI Realtek Interface und für <code>BLUE</code> unseren Qualcomm Atheros Wlan Chip.</p>
<p>Im Punkt Adresseinstellung definieren wir die IP Konfigurationen für jedes unserer Zugeordneten Interfaces, in meinem Fall:</p>
<pre><code>GREEN:  IP-Adresse: 10.0.1.1 mit der Subnetmask 255.255.255.0
BLUE:   IP-Adresse: 10.0.2.1 mit der Subnetmask 255.255.255.0
ORANGE: IP-Adresse: 10.0.3.1 mit der Subnetmask 255.255.255.0
RED:    IP-Adresse des exposed host eintragen.
</code></pre>
<p><img src="https://blog.kthx.at/content/images/2015/09/33.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Im Punkt <code>DNS- und Gatewayeinstellungen</code> wähle ich als DNS die Server vom <a href="http://www.ccc.de">Chaos Computer Club</a> und meine Fritzbox als Gateway.</p>
<pre><code>Primärer DNS: 213.73.91.35
Sekundärer DNS: 217.79.186.148
Standard-Gateway: 192.168.1.1
</code></pre>
<p>Nachdem alles eingestellt wurde können wir mit einem Klick auf <code>Fertig</code> noch einstellen ob wir einen DHCP Server betreiben wollen und ihm Standarteinstellungen übergeben.<br>
<img src="https://blog.kthx.at/content/images/2015/09/38.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Fast geschafft. der Klick auf <code>OK</code> startet unsere IPFire nun neu, währenddessen werden die SSH und HTTPS Zertifikate generiert<br>
<img src="https://blog.kthx.at/content/images/2015/09/40.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Geschafft unser IPFire ist jetzt einsatzbereit!!! Die Postbelegung sollte nun wie folgt aus<br>
<img src="https://blog.kthx.at/content/images/2015/09/41.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Wir verbinden unseren PC mit einem normalen Ethernet-Kabel mit dem <code>Green0</code> Port unserer Firewall, wenn wir einen DHCP Server aktiviert haben sollten wir eine nun selbständig eine IP-Adresse bekommen.<br>
<img src="https://blog.kthx.at/content/images/2015/09/IP-Adresse.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"><br>
Um auf das IPFire Admin Interface zu gelangen öffnen wir jetzt unseren Browser und gehen auf <a href="https://10.0.1.1:444">https://10.0.1.1:444</a> und melden uns mit admin und unsrem bei der Installation vergebenen Kennworts ein.<br>
<img src="https://blog.kthx.at/content/images/2015/09/Admin-Interface.png" alt="IPFire: Hardware Firewall auf APU.1C4 Bundle mit DMZ und WLAN Access Point"></p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[OpenVPN Server: Linux Server als Gateway nutzen]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Heute beschäftigen wir uns mit der Einrichtung eines OpenVPN Tun Servers und der Konfiguration des OpenVPN Clients</p>
<h4 id="vorbereitung">Vorbereitung:</h4>
<ul>
<li>Root zugriff auf einen Linux Server (Debian / Ubuntu)</li>
<li>Der Server darf nicht mit OpenVZ Virtualliesiert sein da dort die Kernelerweiterung für (TUN/TAP) nicht aktiviert werden kann</li>
</ul>
<h4 id="durchfhrung">Durchführung:</h4>
<p>Als erstes bringen wir</p>]]></description><link>https://blog.kthx.at/2015/02/17/openvpn-server-linux-server-als-gateway-nutzen/</link><guid isPermaLink="false">5b083843124da00001783e95</guid><category><![CDATA[Gateway]]></category><category><![CDATA[Linux]]></category><category><![CDATA[OpenVPN]]></category><category><![CDATA[VPN]]></category><dc:creator><![CDATA[Kevin]]></dc:creator><pubDate>Tue, 17 Feb 2015 19:22:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/vpn-1.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/vpn-1.jpg" alt="OpenVPN Server: Linux Server als Gateway nutzen"><p>Heute beschäftigen wir uns mit der Einrichtung eines OpenVPN Tun Servers und der Konfiguration des OpenVPN Clients</p>
<h4 id="vorbereitung">Vorbereitung:</h4>
<ul>
<li>Root zugriff auf einen Linux Server (Debian / Ubuntu)</li>
<li>Der Server darf nicht mit OpenVZ Virtualliesiert sein da dort die Kernelerweiterung für (TUN/TAP) nicht aktiviert werden kann</li>
</ul>
<h4 id="durchfhrung">Durchführung:</h4>
<p>Als erstes bringen wir unser System auf den aktuellsten Stand</p>
<pre><code>bash:~$ apt-get update &amp;&amp; apt-get upgrade -y
</code></pre>
<p>Den OpenVPN Server installieren wir jetzt mit:</p>
<pre><code>bash:~$ apt-get install openvpn -y
</code></pre>
<p>Als nächstes müssen wir die Konfigurationsfiles in das richtige Verzeichnis kopieren</p>
<pre><code>bash:~$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
bash:~$ gunzip /etc/openvpn/server.conf.gz
bash:~$ cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa2
</code></pre>
<p>Nun geht es an die Erstellung des Serverzertifikates</p>
<pre><code>bash:~$ cd /etc/openvpn/easy-rsa2/
bash:~$ mkdir keys
bash:~$ source ./vars
bash:~$ ./clean-all
bash:~$ ./build-ca
</code></pre>
<p><strong>Wichtig:</strong> bei <code>Common Name</code> Die IP-Adresse oder FQDN Namen eures Servers eintragen!</p>
<p>Als nächstes Schritt müssen noch  Zertifikate für die Clients erstellt werden die sich später mit dem Server verbinden sollen</p>
<pre><code>bash:~$ ./build-key client1
bash:~$ ./build-key client2
bash:~$ ./build-key client3
</code></pre>
<p>Daraufhin ist ein sogenannter Diffie-Hellman-Schlüsselaustausch zu generieren</p>
<pre><code>bash:~$ ./build-dh
</code></pre>
<p>Des Weiteren legen wir die zugehörige Server Konfigurationsdatei an</p>
<pre><code>bash:~$ cd /etc/openvpn/server.conf
bash:~$ nano -w server.conf
</code></pre>
<p>Hierzu kann die von mir bereits erstellte Konfiguration verwendet werden.</p>
<pre><code>port 1194
proto udp
dev tun

ca ./easy-rsa2/keys/ca.crt
cert ./easy-rsa2/keys/server.crt
key ./easy-rsa2/keys/server.key
dh ./easy-rsa2/keys/dh1024.pem
#crl-verify ./easy-rsa2/keys/crl.pem

push “redirect-gateway”
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

client-to-client
keepalive 10 120
comp-lzo

user nobody
group nogroup

persist-key
persist-tun

status openvpn-status.log
verb 3
</code></pre>
<p>Um den OpenVPN Server später auch wirklich als Gateway nutzen zu können müssen wir noch ein paar Routing Änderungen am Netzwerk des Servers einrichten, um dies zu tätigen öffnen wir die Datei <code>/etc/rc.local</code> mit einem Editor und tragen folgendes ans Ende der Datei ein. <code>„exit 0“</code> darf erst am ende der Datei sein!</p>
<pre><code>bash:~$ iptables -t nat -F POSTROUTING
bash:~$ echo 1 &gt; /proc/sys/net/ipv4/ip_forward
bash:~$ iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
</code></pre>
<p>Somit ist die eigentliche Einrichtung auf dem des VPN-Servers abgeschlossen.<br>
Damit alle Einstellungen korrekt übernommen werden sollte der gesamte Server neu gestartet werden, oder die Routing Einstellungen manuelle gesetzt werden!</p>
<h4 id="weitergehtesmitunserenclients">Weiter geht es mit unseren Clients</h4>
<p>Als erstes benötigen wir die OpenVPN Client Software für unser Endgerät dies finden wir auf der Entwicklerseite unter<br>
Windows:  <a href="http://openvpn.net/index.php/download/community-downloads.html">http://openvpn.net/index.php/download/community-downloads.html</a><br>
Linux: <code>apt-get install openvpn -y</code><br>
Android: <a href="https://play.google.com/store/apps/details?id=net.openvpn.openvpn&amp;hl=de">https://play.google.com/store/apps/details?id=net.openvpn.openvpn&amp;hl=de</a><br>
iOS: <a href="https://itunes.apple.com/de/app/openvpn-connect/id590379981?mt=8">https://itunes.apple.com/de/app/openvpn-connect/id590379981?mt=8</a></p>
<p>Als erstes müssen wir die Zertifikate unseres zuvor erstellten Clients herunterladen, dies Files liegen im Ordner <code>/etc/openvpn/easy-rsa2</code> auf dem Server benötigt werden.</p>
<pre><code>ca.crt
client1.crt
client1.key
</code></pre>
<p>Diese speichert ihr unter Windows am besten direkt im Ordner <code>C:\Program Files\OpenVPN\config</code></p>
<p>Der nächste Schritt ist es im Ordner <code>config</code> eine weitere Datei mit dem Namen <code>client1.ovpn</code> zu erstellen in die vollende Einstellungen eingetragen wird:</p>
<pre><code>client
dev tun
proto udp
# Hier FQDN oder IP des Servers eintragen!
remote example.org 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
comp-lzo
verb
</code></pre>
<p>Um sich mit dem OpenVPN-Server zu verbinden, öffnet die OpenVPN GUI mit Admin-Rechten und öffnen über das Tray-Icon das VPN Symbol.<br>
Dort klickt man auf <code>Verbinden</code>, nun sollte eine Verbindung mit dem VPN Server zustande kommen.</p>
<p>Testen ob ihr nun die IP-Adresse des Servers habt könnt ihr z.B. auf <a href="http://myip.is">http://myip.is</a>.</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Windows und die Netzwerklaufwerke]]></title><description><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><p>Wie es wahrscheinlich viele bereits wissen, bietet Windows an Netzwerkfreigaben als Laufwerk einzubinden.<br>
Ebenfalls soll es möglich sein diese nach einem Neustart zu behalten, nur klappte das bei mir noch nie.</p>
<p>Ich wollte drei verschiedene Freigaben, die auch noch drei unterschiedliche Zugangsdaten benötigen, einbinden.<br>
Windows lies mich das auch tun,</p>]]></description><link>https://blog.kthx.at/2015/02/04/windows-und-die-netzwerklaufwerke/</link><guid isPermaLink="false">5b083843124da00001783e94</guid><category><![CDATA[7]]></category><category><![CDATA[8]]></category><category><![CDATA[8.1]]></category><category><![CDATA[Freigabe]]></category><category><![CDATA[Netzwerk]]></category><category><![CDATA[Netzlaufwerk]]></category><category><![CDATA[Samba]]></category><category><![CDATA[Win]]></category><category><![CDATA[Windows]]></category><dc:creator><![CDATA[Stefan]]></dc:creator><pubDate>Wed, 04 Feb 2015 22:32:00 GMT</pubDate><media:content url="https://blog.kthx.at/content/images/2015/09/windows-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><!--kg-card-begin: markdown--><img src="https://blog.kthx.at/content/images/2015/09/windows-1.png" alt="Windows und die Netzwerklaufwerke"><p>Wie es wahrscheinlich viele bereits wissen, bietet Windows an Netzwerkfreigaben als Laufwerk einzubinden.<br>
Ebenfalls soll es möglich sein diese nach einem Neustart zu behalten, nur klappte das bei mir noch nie.</p>
<p>Ich wollte drei verschiedene Freigaben, die auch noch drei unterschiedliche Zugangsdaten benötigen, einbinden.<br>
Windows lies mich das auch tun, allerdings durfe ich nach jedem Neustart des Systems erneut meine Zugangsdaten eingeben.<br>
Wie man sich sicher denken kann, hat mich das auf die Dauer <em>„ein wenig“</em> genervt.</p>
<p>Also musste mal wieder die Holzhammermethode greifen, zuerst brauchen wir ein Batch-Skript das uns alle Laufwerke einbindet:</p>
<pre><code>@echo off
net use Y: \\10.0.0.2\freigabe1 /user:user1 passwort1
net use X: \\10.0.0.2\freigabe2 /user:user2 passwort2
net use Z: \\10.0.0.2\freigabe3 /user:user3 passwort3
</code></pre>
<p>Ich habe dann (<code>regedit.exe</code>) einen neuen Zeichensatz Names <code>MapNetworkDrives</code> unter <code>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</code> angelegt und diesem den Wert <code>C:\Scripts\MapDrives.bat</code> gegeben. Dort befindet sich nämlich mein Batch-Skript.<br>
Somit wird dieses Skript nun jedesmal, wenn sich mein Windows-Benutzer anmeldet, ausgeführt und meine Netzlaufwerke eingebunden.</p>
<p>Allerdings war es damit noch nicht vorbei, denn damit Windows bei der nächsten Anmeldung nicht erneut rumzickt muss ein zweites Skript her.<br>
Dieses bindet die Netzlaufwerke beim Abmelden des Nutzers wieder aus:</p>
<pre><code>@echo off
net use * /DELETE /Y
</code></pre>
<p>Dieses Skript bei der Abmeldung ausführen zu lassen, wollte bei mir diesmal allerdings nicht mithilfe der <code>Registry</code> funktionieren, also musste die <code>Gruppenrichtlinienverwaltung</code> her (<code>gpedit.msc</code>).<br>
Dort also nach <code>Benutzerkonfiguration &gt; Windows Einstellungen &gt; Skripte (Anmeldung/Abmeldung)</code> navigiert, einen Doppelklick auf <code>Abmeldung</code> gemacht, dort klickt man dann auf <code>Hinzufügen</code> und klickt im nächsten Fenster auf <code>Durchsuchen</code> und wählt das Zweite Batch-Skript aus.</p>
<p>Nun noch alles mit <code>Ok</code> bestätigen und schon werden alle benötigten Netzlaufwerke beim Anmelden eingebunden und beim Abmelden wieder ausgehangen und dann sagen mir Leute Linux sei kompliziert…</p>
<!--kg-card-end: markdown--><!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>