ubuntuusers.de Planethttps://planet.ubuntuusers.de/2024-03-18T07:09:59+01:00Der Planet fasst Nachrichten aus Blogs der Ubuntu- und Open-Source-Gemeinschaft zusammen. Der Planet wird vom Ikhayateam im Rahmen der Planetenregeln administrativ betreut. Wenn du einen passenden Blog kennst oder selbst führst, kannst du es vorschlagen und eintragen lassen.https://ubuntuusers.de/lizenz/Kommentar: Die Tücken von Rolling-Release-Distributionen2024-03-18T07:09:59+01:002024-03-18T07:09:59+01:00Cruizhttps://curius.de/2024/03/kommentar-die-tuecken-von-rolling-release-distributionen/https://curius.de/?p=8837<div><p>Wenn ich über Rolling-Release-Distributionen und den Wartungsaufwand von Linux schreibe, kommen zuverlässig Kommentare, dass das alles kein Problem sei und man selbst seit x Jahren mit der Distribution y ohne Neuinstallation arbeitet. Kann sein. Muss es nicht. Vor allem aber fehlt es an Planbarkeit.</p>
<span id="entry-text-65f946ebmore-8837"></span>
<p>Ende Februar hat KDE das lange angekündigte Mega Release veröffentlicht. Dabei handelt es sich um die gleichzeitige Aktualisierung des Plasma-Desktops auf Version 6 und der nun auf Qt 6 basierenden Applikationssammlung. Im Gegensatz zu früheren Versionssprüngen ist KDE hier ein grundsolides Release gelungen. Es gibt sinnvolle Verbesserungen, keine großen Brüche, keine signifikanten Funktionseinbußen und vor allem keine riesigen Buglisten. Hier hat KDE definitiv dazugelernt.</p>
<p>Für ein paar Tage war dann Ruhe. Schließlich mussten die Entwickler erst testen, dann bauen und die QA musste auch noch drüber laufen. Aber letzte Woche wurde Plasma 6 und alles was dazu gehört in openSUSE Tumbleweed verteilt. Das geschah ohne Zeitplan und ohne große Ankündigung. Wem das gerade nicht in den Kram passte, weil er das System gerade dringend für einen Arbeitsprozess oder ähnliches benötigte, der konnte ab diesem Tag nur noch das Aktualisieren und Neuinstallieren von Paketen einstellen. Sicherheitsupdates kommen dann natürlich auch nicht mehr. Rolling Release heißt eben auch unweigerlich mitrollen.</p>
<p>Das Update selbst ruckelte sehr stark. Das berichten viele Nutzer. Die Probleme – das möchte ich ausdrücklich betonen – lagen nicht bei KDE, sondern bei der Update-Routine von openSUSE. Der eigentliche Vorgang über zypper brach bei Anwendern mit laufender Wayland-Session mittendrin ab. Wer dann nicht auf TTY wechselte und dort das Update beendete, hatte ein inkonsistentes System und landete bestenfalls nach einem Neustart wieder bei Plasma 5. Größere Probleme waren dann noch fehlende Übergänge bei SDDM, weshalb hier entweder die Konfigurationsmöglichkeit verloren ging oder gleich alle Pakete. Die automatische Entsperrung von KWallet über PAM funktionierte nicht mehr und die Desktopsuche Baloo hing in einem Mix aus 5 und 6 fest. Hinzu kamen kleinere und größere Probleme mit einzelnen Programmen. Je nach Einschätzung des Aufwandes konnte man sich dann entweder einzeln auf Fehlersuche begeben (wobei ein Unfallauto immer ein Unfallauto bleibt) oder neu installieren. Das Zurückspringen über Snapper und ein erneuter Versuch brachte letztlich meist ein ähnliches Ergebnis, ist also nicht die Lösung.</p>
<p>Jetzt wird natürlich wieder jemand schreiben, mit der Distribution xyz wäre das nicht passiert, man hätte nur dies und jenes beachten müssen usw. usf.</p>
<p>Aber meiner Ansicht nach zeigt diese fehlerhaften Aktualisierung wieder verschiedene Punkte:</p>
<ul>
<li>RR-Verteilungen sind nur für den unkritischen privaten Gebrauch geeignet. Solche Großupdates sind nicht planbar, nicht vorhersehbar und nicht verschiebbar. Das macht RR-Distributionen für den produktiven Einsatz ungeeignet.</li>
<li>Die klassische Paketverwaltung mit ihren systemimmanenten Problemen ist am Ende ihres Entwicklungszyklus angelangt. Bessere Übergänge bei openSUSE hätten manches verhindert, aber das System aus tausenden Paketen mit fein definierten Abhängigkeiten und Überleitungen ist ein fehleranfälliges Konstrukt. Ein festes Image aus Basissystem und Desktop plus Anwendungsprogrammen hätte diese Probleme beim Update nicht verursacht.</li>
<li>Linux ist und bleibt wartungsintensiver als vergleichbare Systeme.</li>
</ul>
<p>Der Artikel <a href="https://curius.de/2024/03/kommentar-die-tuecken-von-rolling-release-distributionen/" rel="nofollow">Kommentar: Die Tücken von Rolling-Release-Distributionen</a> erschien zuerst auf <a href="https://curius.de" rel="nofollow">Curius</a></p></div>Ein privates Netz mit openVPN erstellen2024-03-15T23:00:00+01:002024-03-15T23:00:00+01:00Joe Slamhttps://www.produnis.de/blog/posts/2024-03-16-openvpn/https://www.produnis.de/blog/posts/2024-03-16-openvpn/<div><p>In diesem Blogpost zeige ich Schritt für Schritt, wie ich mein privates openVPN-Netzwerk aufgebaut habe.</p>
<p>Mein VPN soll die IPs <code>10.5.5.0/24</code> verwenden und “nur” dazu dienen, die Clients miteinander zu verbinden. Der Internettraffic wird <strong>nicht</strong> über dieses VPN geleitet.</p>
<section class="level2" id="entry-text-65f946efhardware">
<h2 class="anchored">Hardware</h2>
<p>Folgende Geräte kommen zum Einsatz:</p>
<ul>
<li><code>Master-CA</code>- ist die Zertifikationsinstanz, welche die Zertifikate ausstellt und signiert. Dies übernimmt mein Desktoprechner zuhause</li>
<li><code>openVPN-Server</code> - das übernimmit mein Homeserver</li>
<li><code>Clients</code> - mein Desktoprechner, mein Laptop sowie mein Büro-PC</li>
</ul>
</section>
<section class="level2" id="entry-text-65f946efinstallieren">
<h2 class="anchored">Installieren</h2>
<p>Zunächst installiere ich die benötigten Pakete:</p>
<div class="sourceCode" id="entry-text-65f946efcb1"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb1-1"><span class="fu">sudo</span> apt install openvpn easy-rasa</span></code></pre></div>
<p>Ich nutze Arch, btw, daher nutze ich Pacman:</p>
<div class="sourceCode" id="entry-text-65f946efcb2"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb2-1"><span class="ex">pacman</span> <span class="at">-S</span> openvpn easy-rsa </span></code></pre></div>
</section>
<section class="level2" id="entry-text-65f946efzertifikate-anlegen">
<h2 class="anchored">Zertifikate anlegen</h2>
<p>Bevor es wirklich los gehen kann, müssen die grundlegenden Zertifikate erstellt werden.</p>
<section class="level3" id="entry-text-65f946efmaster-ca">
<h3 class="anchored">Master CA</h3>
<p>Wir sind unsere eigene Zertifikationsinstanz, die alle weiteren Zertifikate für Server und Clients signiert. Diese Zertifikationsinstanz sollte auf einer anderen Maschine laufen als dem openVPN Server. Daher nutze ich meinen Desktop-PC zu hause dafür.</p>
<p>Wir erstellen zunächst das passende Verzeichnis unter <code>/etc/easy-rsa</code></p>
<div class="sourceCode" id="entry-text-65f946efcb3"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb3-1"><span class="fu">sudo</span> bash</span>
<span id="entry-text-65f946efcb3-2"><span class="fu">mkdir</span> /etc/easy-rsa</span>
<span id="entry-text-65f946efcb3-3"><span class="bu">cd</span> /etc/easy-rsa</span></code></pre></div>
<p>… und erzeugen hier das Master-CA <code>ca.crt</code>:</p>
<div class="sourceCode" id="entry-text-65f946efcb4"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb4-1"><span class="bu">export</span> <span class="va">EASYRSA</span><span class="op">=</span><span class="va">$(</span><span class="bu">pwd</span><span class="va">)</span></span>
<span id="entry-text-65f946efcb4-2"><span class="ex">easyrsa</span> init-pki</span>
<span id="entry-text-65f946efcb4-3"><span class="ex">easyrsa</span> build-ca</span></code></pre></div>
<p>Denke dir ein starkes Passwort für das Master-CA aus, und gib dir einen <em>Common Name</em>, ich habe da “Produnis” gewählt.</p>
<p>Die Datei <code>ca.crt</code> liegt nun im Unterordner <code>pki/</code></p>
</section>
<section class="level3" id="entry-text-65f946efserverzertifikat">
<h3 class="anchored">Serverzertifikat</h3>
<p>Jetzt legen wir die Zertifikate für unseren openVPN-Server an und signieren sie mit unserem Master-CA:</p>
<div class="sourceCode" id="entry-text-65f946efcb5"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb5-1"><span class="ex">easyrsa</span> gen-req SERVERNAME nopass</span>
<span id="entry-text-65f946efcb5-2"><span class="ex">easyrsa</span> sign-req server SERVERNAME</span></code></pre></div>
<p>Wir müssen die Aktion mit <code>yes</code> bestätigen und das eben erzeugte Passwort des Master-CA eingeben.</p>
<p>Das erzeugte und signierte Zertifikat für den openVPN-Server liegt nun in <code>pki/private/SERVERNAME.key</code> bereit. Ebenfalls liegt dort die Datei <code>pki/private/ca.key</code>. Diese benötigen wir später noch, um weitere Zertifikate zu signieren.</p>
<p>Der openVPN-Server benötigt noch weitere Dateien für die Verschlüsslung des Netzwerks. Da diese Dateien auch von den Clients benötigt werden, erzeuge ich mir ein eigenes Verzeichnis hierfür, welches so heisst, wie das VPN-Netz, das ich erzeugen möchte. In meinem Fall soll das Netzwerk “produnis” heissen. Der Name ist egal, aber so verliert man nicht die Übersicht.</p>
<div class="sourceCode" id="entry-text-65f946efcb6"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb6-1"><span class="fu">mkdir</span> /etc/easy-rsa/produnis</span>
<span id="entry-text-65f946efcb6-2"><span class="co"># diffie hellman für Perfect Forward Secrecy (PFS)</span></span>
<span id="entry-text-65f946efcb6-3"><span class="ex">openssl</span> dhparam <span class="at">-out</span> /etc/easy-rsa/produnis/dh.pem 2048</span>
<span id="entry-text-65f946efcb6-4"></span>
<span id="entry-text-65f946efcb6-5"><span class="co"># HMAC key um Man-in-the-Middle-Angriffe zu unterbinden</span></span>
<span id="entry-text-65f946efcb6-6"><span class="ex">openvpn</span> <span class="at">--genkey</span> secret /etc/easy-rsa/produnis/ta.key</span></code></pre></div>
<p>Jetzt kopieren wir alles auf den openVPN-Server. Folgende Dateien werden dort benötigt:</p>
<ul>
<li><code>/etc/easy-rsa/pki/private/SERVERNAME.key</code></li>
<li><code>/etc/easy-rsa/pki/issued/SERVERNAME.crt</code></li>
<li><code>/etc/easy-rsa/pki/ca.crt</code></li>
<li><code>/etc/easy-rsa/produnis/dh.pem</code></li>
<li><code>/etc/easy-rsa/produnis/ta.key</code></li>
</ul>
<p>Ich kopiere die Dateien zunächst ins <code>/tmp</code>-Verzeichnis des Servers.</p>
<div class="sourceCode" id="entry-text-65f946efcb7"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb7-1"><span class="fu">scp</span> /etc/easy-rsa/pki/private/SERVERNAME.key /etc/easy-rsa/pki/issued/SERVERNAME.crt /etc/easy-rsa/pki/ca.crt /etc/easy-rsa/produnis/dh.pem /etc/easy-rsa/produnis/ta.key user@server:/tmp </span></code></pre></div>
</section>
</section>
<section class="level2" id="entry-text-65f946efserver-einrichten">
<h2 class="anchored">Server einrichten</h2>
<p>Verbinde dich auf den Server und erstelle ein Unterverzeichnis in <code>/etc/openvpn/server/</code>, das wie das VPN-Netz heisst. Ich hatte ja <em>produnis</em> als Netznamen gewählt.</p>
<div class="sourceCode" id="entry-text-65f946efcb8"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb8-1"><span class="fu">ssh</span> user@server</span>
<span id="entry-text-65f946efcb8-2"><span class="fu">sudo</span> bash</span>
<span id="entry-text-65f946efcb8-3"><span class="fu">mkdir</span> /etc/openvpn/server/NETZNAME</span></code></pre></div>
<p>In diesen Ordner verschiebe ich die kopierten Dateien.</p>
<div class="sourceCode" id="entry-text-65f946efcb9"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb9-1"><span class="fu">mv</span> /tmp/SERVERNAME.key /tmp/SERVERNAME.crt /tmp/ca.crt /tmp/dh.pem /tmp/ta.key /etc/openvpn/server/NETZNAME/</span></code></pre></div>
<p>Im “Hauptordner” <code>/etc/openvpn/server/</code> erstelle ich die Datei <code>produnis.conf</code> mit folgendem Inhalt:</p>
<div class="sourceCode" id="entry-text-65f946efcb10"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb10-1"><span class="ex">port</span> 1194</span>
<span id="entry-text-65f946efcb10-2"><span class="ex">proto</span> udp</span>
<span id="entry-text-65f946efcb10-3"><span class="ex">dev</span> tun</span>
<span id="entry-text-65f946efcb10-4"><span class="ex">server</span> 10.5.5.0 255.255.255.0 </span>
<span id="entry-text-65f946efcb10-5"></span>
<span id="entry-text-65f946efcb10-6"><span class="co"># ihr müsst "produnis" durch eure Namen ersetzen</span></span>
<span id="entry-text-65f946efcb10-7"><span class="ex">ca</span> /etc/openvpn/server/produnis/ca.crt</span>
<span id="entry-text-65f946efcb10-8"><span class="ex">cert</span> /etc/openvpn/server/produnis/produnis.crt</span>
<span id="entry-text-65f946efcb10-9"><span class="ex">key</span> /etc/openvpn/server/produnis/produnis.key <span class="co"># This file should be kept secret</span></span>
<span id="entry-text-65f946efcb10-10"><span class="ex">dh</span> /etc/openvpn/server/produnis/dh.pem</span>
<span id="entry-text-65f946efcb10-11"><span class="ex">tls-crypt</span> /etc/openvpn/server/produnis/ta.key</span>
<span id="entry-text-65f946efcb10-12"></span>
<span id="entry-text-65f946efcb10-13"><span class="ex">client-to-client</span> <span class="co"># damit sich die clients untereinander sehen können</span></span>
<span id="entry-text-65f946efcb10-14"><span class="ex">ifconfig-pool-persist</span> /etc/openvpn/server/produnis/ipp.txt</span>
<span id="entry-text-65f946efcb10-15"><span class="ex">keepalive</span> 10 120</span>
<span id="entry-text-65f946efcb10-16"><span class="ex">cipher</span> AES-256-CBC</span>
<span id="entry-text-65f946efcb10-17"><span class="ex">max-clients</span> 5</span>
<span id="entry-text-65f946efcb10-18"><span class="ex">persist-key</span></span>
<span id="entry-text-65f946efcb10-19"><span class="ex">persist-tun</span></span>
<span id="entry-text-65f946efcb10-20"><span class="ex">status</span> /etc/openvpn/server/produnis/openvpn-status.log</span>
<span id="entry-text-65f946efcb10-21"><span class="ex">verb</span> 3</span>
<span id="entry-text-65f946efcb10-22"><span class="ex">explicit-exit-notify</span> 1</span></code></pre></div>
<p>Stelle sicher, dass openVPN auf alle Dateien zugreifen kann:</p>
<div class="sourceCode" id="entry-text-65f946efcb11"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb11-1"><span class="fu">chown</span> openvpn:network <span class="at">-R</span> /etc/openvpn/server</span></code></pre></div>
<p>Starte den Server mittels</p>
<div class="sourceCode" id="entry-text-65f946efcb12"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb12-1"><span class="ex">openvpn</span> /etc/openvpn/server/produnis.conf</span></code></pre></div>
<section class="level3" id="entry-text-65f946efsystemd">
<h3 class="anchored">Systemd</h3>
<p>Alle Konfigurationsdateien liegen in <code>/etc/openvpn/server/</code>, z.B. <code>/etc/openvpn/server/produnis.conf</code>. Die passende systemd-Service-Unit heisst nun genauso wie die <code>.conf</code>-Datei (nur ohne <code>.conf</code>) <code>openvpn-server@servername.service</code>.</p>
<p>In meinem Fall also</p>
<div class="sourceCode" id="entry-text-65f946efcb13"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb13-1"><span class="ex">systemctl</span> start openvpn-server@produnis.service</span>
<span id="entry-text-65f946efcb13-2"><span class="ex">systemctl</span> status openvpn-server@produnis.service</span></code></pre></div>
</section>
</section>
<section class="level2" id="entry-text-65f946efclients-hinzufügen">
<h2 class="anchored">Clients hinzufügen</h2>
<p>Auf der Master-CA-Maschine erzeugen wir nun weitere Zertifikate für jeden Client.</p>
<div class="sourceCode" id="entry-text-65f946efcb14"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb14-1"><span class="fu">sudo</span> bash</span>
<span id="entry-text-65f946efcb14-2"><span class="bu">cd</span> /etc/easy-rsa</span>
<span id="entry-text-65f946efcb14-3"><span class="ex">easyrsa</span> gen-req CLIENTNAME nopass</span>
<span id="entry-text-65f946efcb14-4"><span class="ex">easyrsa</span> sign-req client CLIENTNAME</span></code></pre></div>
<p>Wir müssen die Aktion mit <code>yes</code> bestätigen und das oben erzeugte Passwort des Master-CA eingeben.</p>
<p>Jetzt können wieder alle Dateien auf den Client übertragen werden. Benötigt werden</p>
<ul>
<li><code>/etc/easy-rsa/pki/private/CLIENTNAME.key</code></li>
<li><code>/etc/easy-rsa/pki/issued/CLIENTNAME.crt</code></li>
<li><code>/etc/easy-rsa/pki/ca.crt</code></li>
<li><code>/etc/easy-rsa/produnis/ta.key</code></li>
</ul>
<p>Ich kopiere diese Dateien zunächst ins <code>/tmp</code>-Verzeichnis auf dem Client:</p>
<div class="sourceCode" id="entry-text-65f946efcb15"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb15-1"><span class="fu">scp</span> /etc/easy-rsa/pki/issued/CLIENTNAME.crt /etc/easy-rsa/pki/private/CLIENTNAME.key /etc/easy-rsa/pki/ca.crt /etc/easy-rsa/produnis/ta.key user@client:/tmp</span></code></pre></div>
<section class="level3" id="entry-text-65f946efkonfiguration-der-clients">
<h3 class="anchored">Konfiguration der Clients</h3>
<p>Auf dem Client erstelle ich im Ordner <code>/etc/openvpn/client/</code> einen Unterordner <code>produnis</code>. In diesen lege ich alle Zertifikate.</p>
<div class="sourceCode" id="entry-text-65f946efcb16"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb16-1"><span class="fu">ssh</span> user@client</span>
<span id="entry-text-65f946efcb16-2"><span class="fu">sudo</span> bash</span>
<span id="entry-text-65f946efcb16-3"><span class="fu">mkdir</span> /etc/openvpn/client/produnis</span>
<span id="entry-text-65f946efcb16-4"><span class="fu">mv</span> /tmp/ca.crt /tmp/ta.key /tmp/CLIENTNAME.key /tmp/CLIENTNAME.crt /etc/openvpn/client/produnis/</span></code></pre></div>
<p>Im “Hauptordner” <code>/etc/openvpn/client/</code> erstelle ich die Datei <code>produnis.conf</code> mit folgendem Inhalt:</p>
<div class="sourceCode" id="entry-text-65f946efcb17"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb17-1"><span class="ex">client</span></span>
<span id="entry-text-65f946efcb17-2"><span class="ex">dev</span> tun</span>
<span id="entry-text-65f946efcb17-3"><span class="ex">proto</span> udp</span>
<span id="entry-text-65f946efcb17-4"></span>
<span id="entry-text-65f946efcb17-5"><span class="ex">remote</span> mein.server.de 1194 <span class="co"># ersetze mit Adresse des openVPN-Server</span></span>
<span id="entry-text-65f946efcb17-6"><span class="ex">ca</span> /etc/openvpn/client/produnis/ca.crt</span>
<span id="entry-text-65f946efcb17-7"><span class="ex">cert</span> /etc/openvpn/client/produnis/CLIENTNAME.crt</span>
<span id="entry-text-65f946efcb17-8"><span class="ex">key</span> /etc/openvpn/client/produnis/CLIENTNAME.key</span>
<span id="entry-text-65f946efcb17-9"><span class="ex">tls-crypt</span> /etc/openvpn/client/produnis/ta.key</span>
<span id="entry-text-65f946efcb17-10"><span class="ex">cipher</span> AES-256-CBC</span>
<span id="entry-text-65f946efcb17-11"><span class="ex">resolv-retry</span> infinite</span>
<span id="entry-text-65f946efcb17-12"><span class="ex">nobind</span></span>
<span id="entry-text-65f946efcb17-13"><span class="ex">persist-key</span></span>
<span id="entry-text-65f946efcb17-14"><span class="ex">persist-tun</span></span>
<span id="entry-text-65f946efcb17-15"><span class="ex">tun-mtu</span> 1350 <span class="co"># Unitymedia/Vodafone</span></span>
<span id="entry-text-65f946efcb17-16"><span class="ex">verb</span> 3</span></code></pre></div>
<p>Stelle sicher, dass openVPN auf alle Dateien zugreifen kann:</p>
<div class="sourceCode" id="entry-text-65f946efcb18"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb18-1"><span class="fu">chown</span> openvpn:network <span class="at">-R</span> /etc/openvpn/client</span></code></pre></div>
<p>Starte den Client mittels</p>
<div class="sourceCode" id="entry-text-65f946efcb19"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb19-1"><span class="ex">openvpn</span> /etc/openvpn/client/produnis.conf</span></code></pre></div>
</section>
<section class="level3" id="entry-text-65f946efmit-systemd-starten">
<h3 class="anchored">Mit Systemd starten</h3>
<p>Alle Konfigurationsdateien liegen in <code>/etc/openvpn/client/</code>, z.B. <code>/etc/openvpn/client/produnis.conf</code>. Die passende systemd-Service-Unit heisst nun genauso wie die <code>.conf</code>-Datei (nur ohne <code>.conf</code>) <code>openvpn-client@produnis.service</code>.</p>
<p>In meinem Fall also wieder</p>
<div class="sourceCode" id="entry-text-65f946efcb20"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb20-1"><span class="fu">sudo</span> systemctl start openvpn-client@produnis.service</span>
<span id="entry-text-65f946efcb20-2"><span class="fu">sudo</span> systemctl status openvpn-client@produnis.service</span></code></pre></div>
</section>
</section>
<section class="level2" id="entry-text-65f946efstatische-ip-adresse-für-die-clients-festlegen">
<h2 class="anchored">statische IP-Adresse für die Clients festlegen</h2>
<p>Dies ist eine Art DHCP-light, wir teilen jedem Client eine feste IP innerhalb des VPN-Netzes zu.</p>
<p>Erstelle auf dem Server ein Unterverzeichnis <code>ccd</code> (<strong>c</strong>lient <strong>c</strong>onfig <strong>d</strong>ir) und lege dort je eine Datei für jeden Client an.</p>
<div class="sourceCode" id="entry-text-65f946efcb21"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb21-1"><span class="fu">mkdir</span> /etc/openvpn/server/produnis/ccd</span>
<span id="entry-text-65f946efcb21-2"><span class="bu">cd</span> /etc/openvpn/server/produnis/ccd</span>
<span id="entry-text-65f946efcb21-3"><span class="fu">nano</span> CLIENTNAME</span></code></pre></div>
<p><code>CLIENTNAME</code> ist dabei der Name, den du beim Erzeugen der Zertifikate verwendet hast. Anhand des Zertifikats erkennt der Server den Client.</p>
<p>In die Datei schreibst du:</p>
<div class="sourceCode" id="entry-text-65f946efcb22"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb22-1"><span class="ex">ifconfig-push</span> 10.5.5.x 10.5.5.1</span></code></pre></div>
<p>wobei du <code>x</code> durch die gewünschte IP ersetzt. Die zweite IP ist die des VPN-Servers, also immer <code>10.5.5.1</code>.</p>
<p>Damit der Server über unsere IP-Listen Bescheid weiss, muss <code>/etc/openvpn/server/produnis.conf</code> um folgende Zeile erweitert werden:</p>
<div class="sourceCode" id="entry-text-65f946efcb23"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb23-1"><span class="ex">client-config-dir</span> /etc/openvpn/server/produnis/ccd</span></code></pre></div>
<p>Anschließend muss openVPN neu gestartet werden, z.B. mittels</p>
<div class="sourceCode" id="entry-text-65f946efcb24"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb24-1"><span class="ex">systemctl</span> restart openvpn-server@produnis.service</span></code></pre></div>
</section>
<section class="level2" id="entry-text-65f946effirewall-anpassen">
<h2 class="anchored">Firewall anpassen</h2>
<p>Falls ihr eine Firewall benutzt (und ich hoffe doch sehr, dass dies der Fall ist), muss diese für openVPN angepasst werden.</p>
<section class="level3" id="entry-text-65f946efiptables">
<h3 class="anchored">iptables</h3>
<p>Die iptables-Firewall muss auf dem Server und auf den Clients angepasst werden, damit openVPN funktioniert:</p>
<div class="sourceCode" id="entry-text-65f946efcb25"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb25-1"><span class="co">## openvpn general settings für Server und Client</span></span>
<span id="entry-text-65f946efcb25-2"><span class="ex">iptables</span> <span class="at">-A</span> INPUT <span class="at">-i</span> tun+ <span class="at">-j</span> ACCEPT</span>
<span id="entry-text-65f946efcb25-3"><span class="ex">iptables</span> <span class="at">-A</span> FORWARD <span class="at">-i</span> tun+ <span class="at">-j</span> ACCEPT</span>
<span id="entry-text-65f946efcb25-4"></span>
<span id="entry-text-65f946efcb25-5"><span class="co">## nur auf dem Server nächste Zeile ausführen</span></span>
<span id="entry-text-65f946efcb25-6"><span class="co">#iptables -t nat -A POSTROUTING -s 10.5.5.0/24 -o eth0 -j MASQUERADE </span></span>
<span id="entry-text-65f946efcb25-7"></span>
<span id="entry-text-65f946efcb25-8"><span class="co">## auf Server und Client muss Port 1194 fuer openVPN geöffnet werden</span></span>
<span id="entry-text-65f946efcb25-9"><span class="ex">iptables</span> <span class="at">-A</span> INPUT <span class="at">-i</span> eth0 <span class="at">-p</span> udp <span class="at">--destination-port</span> 1194 <span class="at">-j</span> ACCEPT</span></code></pre></div>
<p>Wenn euer Device nicht <code>eth0</code> heisst, müsst ihr den Befehl entsprechend anpassen.</p>
</section>
<section class="level3" id="entry-text-65f946efufw">
<h3 class="anchored">ufw</h3>
<p>Die ufw-Firewall muss auf dem Server und auf den Clients angepasst werden, damit openVPN funktioniert:</p>
<div class="sourceCode" id="entry-text-65f946efcb26"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb26-1"><span class="co"># openVPN</span></span>
<span id="entry-text-65f946efcb26-2"><span class="fu">sudo</span> ufw allow 1194</span>
<span id="entry-text-65f946efcb26-3"><span class="fu">sudo</span> ufw allow out 1194/udp</span></code></pre></div>
<p>Auf dem Server müssen noch drei weitere Einstellungen getroffen werden, damit das Netz funktioniert.</p>
<ol type="1">
<li><code>/etc/default/ufw</code></li>
</ol>
<div class="sourceCode" id="entry-text-65f946efcb27"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb27-1"><span class="fu">nano</span> /etc/default/ufw </span>
<span id="entry-text-65f946efcb27-2"></span>
<span id="entry-text-65f946efcb27-3"><span class="va">DEFAULT_FORWARD_POLICY</span><span class="op">=</span><span class="st">"ACCEPT"</span></span></code></pre></div>
<ol start="2" type="1">
<li><code>/etc/ufw/before.rules</code>, Füge die folgenden Zeilen <strong>vor</strong> der <code>*filter</code>-Sektion ein:</li>
</ol>
<div class="sourceCode" id="entry-text-65f946efcb28"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb28-1"><span class="fu">nano</span> /etc/ufw/before.rules</span>
<span id="entry-text-65f946efcb28-2"></span>
<span id="entry-text-65f946efcb28-3"><span class="co"># NAT-Tabelle hinzufügen</span></span>
<span id="entry-text-65f946efcb28-4"><span class="ex">*nat</span></span>
<span id="entry-text-65f946efcb28-5"><span class="ex">:POSTROUTING</span> ACCEPT <span class="pp">[</span><span class="ss">0:0</span><span class="pp">]</span></span>
<span id="entry-text-65f946efcb28-6"><span class="co"># OpenVPN-Regeln hinzufügen</span></span>
<span id="entry-text-65f946efcb28-7"><span class="ex">-A</span> POSTROUTING <span class="at">-s</span> 10.5.5.0/24 <span class="at">-o</span> eth0 <span class="at">-j</span> MASQUERADE</span>
<span id="entry-text-65f946efcb28-8"><span class="ex">COMMIT</span></span></code></pre></div>
<p>Wenn euer Device nicht <code>eth0</code> heisst, müsst ihr den Befehl entsprechend anpassen.</p>
<ol start="3" type="1">
<li><code>/etc/ufw/sysctl.conf</code></li>
</ol>
<div class="sourceCode" id="entry-text-65f946efcb29"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="entry-text-65f946efcb29-1"><span class="fu">nano</span> /etc/ufw/sysctl.conf</span>
<span id="entry-text-65f946efcb29-2"></span>
<span id="entry-text-65f946efcb29-3"><span class="ex">net/ipv4/ip_forward=1</span></span>
<span id="entry-text-65f946efcb29-4"><span class="ex">net/ipv6/conf/default/forwarding=1</span></span>
<span id="entry-text-65f946efcb29-5"><span class="ex">net/ipv6/conf/all/forwarding=1</span></span></code></pre></div>
</section>
</section>
<section class="level2" id="entry-text-65f946effertig">
<h2 class="anchored">Fertig</h2>
<p>Jetzt sollten sich alle Clients mit dem Server verbinden und sich untereinander “sehen” können. Da jeder Client von mir eine fest IP-Adresse zugewiesen bekommen hat, kann ich nun easy per ssh von Client zu Client oder auf den Server verbinden. Genau so, wie ich es wollte.</p>
</section>
<section class="level2" id="entry-text-65f946efweblinks">
<h2 class="anchored">Weblinks</h2>
<ul>
<li><a class="uri" href="https://wiki.archlinux.org/title/OpenVPN">https://wiki.archlinux.org/title/OpenVPN</a></li>
<li><a class="uri" href="https://wiki.archlinux.org/index.php/Easy-RSA">https://wiki.archlinux.org/index.php/Easy-RSA</a></li>
<li><a class="uri" href="https://www.itsfullofstars.de/2018/09/openvpn-assign-static-ip-to-client/">https://www.itsfullofstars.de/2018/09/openvpn-assign-static-ip-to-client/</a></li>
<li><a class="uri" href="https://bbs.archlinux.org/viewtopic.php?id=293930">https://bbs.archlinux.org/viewtopic.php?id=293930</a></li>
</ul>
<br /><span style="text-align: center;">
<div class="matrixfoot" id="entry-text-65f946efmatrixfooter">
<a href="https://matrix.to/#/#produnis-blog:tchncs.de">
<img src="https://www.produnis.de/images/Matrix.webp" width="60" />
</a>
Diskussion per Matrix unter <a href="https://matrix.to/#/#produnis-blog:tchncs.de">https://matrix.to/#/#produnis-blog:tchncs.de</a>
</div>
</span><br />
</section></div>Mozilla Location Service wird eingestellt2024-03-15T20:23:00+01:002024-03-15T20:23:00+01:00Sören Hentzschelhttps://www.soeren-hentzschel.at/location-service/mozilla-location-service-wird-eingestellt/https://www.soeren-hentzschel.at/?p=31695738<div><p><strong>Mozilla hat bekannt gegeben, dass der Mozilla Location Service als Alternative zum Geolocation-Service von Google eingestellt wird.</strong></p>
<p>Für die Positionsbestimmung auf Websites über die Geolocation-API verwenden Browser einen sogenannten Geolokalisierungs-Dienst. Auch Mozilla hat mit dem Mozilla Location Service (MLS) einen solchen Dienst im November 2013 <a href="https://www.soeren-hentzschel.at/location-service/mozilla-startet-einen-eigenen-geolokalisierungs-dienst/">gestartet</a>. Dieser wurde <a href="https://www.soeren-hentzschel.at/firefox/mozilla-ersetzt-google-geolocation-service-durch-eigenen-dienst-in-firefox/">seit März 2015</a> bis zuletzt im November 2023 standardmäßig anstelle des Google-Dienstes in Nightly- und frühen Beta-Versionen von Firefox als Dienst für die Geolocation-API verwendet. Finale Firefox-Versionen hatten zu jeder Zeit standardmäßig den Google-Dienst genutzt. Auch in finalen Firefox-Versionen wird der Mozilla Location Service für die Bestimmung der Suchregion verwendet, welche unter anderem dafür verantwortlich ist, welche Suchmaschinen standardmäßig zur Verfügung stehen.</p>
<p>Die Daten hat Mozilla dabei von der Community erhalten. So gab es ursprünglich mit dem Mozilla Stumbler eine eigene Android-App, welche GPS-Daten auf Grundlage von Bluetooth-Beacons, Mobilfunkmasten und WLAN-Zugangspunkten für den Mozilla Location Service sammelte. Auch in <a href="https://www.soeren-hentzschel.at/firefox-android/mozilla-veroeffentlicht-firefox-mobile-35-fuer-android/">Firefox 35 für Android</a> wurde im Jahr 2015 eine entsprechende Funktion integriert. Im Jahr 2019 war Skyhook Holdings, Inc. allerdings der Meinung, Mozilla verletzte deren Patente. Mozilla einigte sich, um einen Rechtsstreit zu vermeiden, was <a href="https://blog.mozilla.org/services/2019/09/03/a-new-policy-for-mozilla-location-service/">Änderungen</a> an den MLS-Richtlinien zur Folge hatte und weitere Investitionen und einen Ausbau erschwerten. Insbesondere eine mögliche kommerzielle Verwendung des Mozilla Location Services wurde damit erheblich eingeschränkt. Mit Veröffentlichung von Android 10 im gleichen Jahr funktionierte außerdem die Stumbler-App nicht mehr, welche 2021 schließlich <a href="https://discourse.mozilla.org/t/retiring-mozilla-stumbler/75206">offiziell eingestellt</a> worden war. Dementsprechend ist auch die Genauigkeit des Mozilla Location Services in den letzten Jahren gesunken. Nun hat Mozilla die Einstellung des Projekts <a href="https://discourse.mozilla.org/t/retiring-the-mozilla-location-service/128693">bekannt gegeben</a>.</p>
<p>Neue API-Keys werden bereits keine mehr ausgestellt. Ab dem 27. März werden keine Daten mehr über die API entgegengenommen und keine neuen Exports mehr als Download bereitgestellt. Am 10. April werden die Downloads gelöscht. Ab dem 12. Juni wird der Mozilla Location Service nur noch für Mozillas Anwendungsfälle zur Verfügung stehen. Am 31. Juli wird schließlich das GitHub-Repository archiviert werden.</p>
<p>Der Beitrag <a href="https://www.soeren-hentzschel.at/location-service/mozilla-location-service-wird-eingestellt/">Mozilla Location Service wird eingestellt</a> erschien zuerst auf <a href="https://www.soeren-hentzschel.at">soeren-hentzschel.at</a>.</p></div>Mozilla bekräftigt langfristige Manifest v2-Unterstützung in Firefox2024-03-14T20:52:16+01:002024-03-14T20:52:16+01:00Sören Hentzschelhttps://www.soeren-hentzschel.at/firefox/mozilla-bekraeftigt-langfristige-manifest-v2-unterstuetzung/https://www.soeren-hentzschel.at/?p=31695725<div><p><strong>Mozilla hat noch einmal sein Bekenntnis erneuert, anders als Google und damit stellvertretend auch für andere Entwickler von Chromium-basierten Browsern, parallel zur Unterstützung des Manifest v3 auch Erweiterungen mit dem Manifest v2 langfristig weiter in Firefox zu unterstützen.</strong></p>
<p>Entwickler von Browser-Erweiterungen nutzen die sogenannte WebExtension-Architektur. Dabei gibt es die ältere Version des Standards, das sogenannte Manifest v2, und dessen Weiterentwicklung, das Manifest v3. Firefox unterstützt seit Veröffentlichung von <a href="https://www.soeren-hentzschel.at/firefox/firefox-109-alle-neuerungen/">Firefox 109</a> im Januar 2023 das Manifest v3 zu großen Teilen.</p>
<p>Während Google seinen Plan aktiv vorantreibt, die Unterstützung für das Manifest v2 ab Sommer 2024 für Privatanwender und ab Juni 2025 für Enterprise-Nutzer <a href="https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline">einzustellen</a>, hat Mozilla noch einmal <a href="https://blog.mozilla.org/addons/2024/03/13/manifest-v3-manifest-v2-march-2024-update/">bestätigt</a>, keine Pläne zu haben, die Unterstützung für das Manifest v2 in Firefox in absehbarer Zukunft einzustellen. Und selbst, wenn Mozilla die Entscheidung irgendwann überdenken sollte, verspricht Mozilla, dies mit einem Vorlauf von mindestens einem Jahr anzukündigen.</p>
<p>Firefox wird auch weiterhin DOM-basierte Hintergrundscripte in Form von Event Pages sowie blockierende WebRequests im Manifest v3 unterstützen – zwei Features, welche Google mit dem Manifest v3 gestrichen hat und damit Entwickler von Erweiterungen für Chromium-basierte Browser einschränkt.</p>
<p>Der Beitrag <a href="https://www.soeren-hentzschel.at/firefox/mozilla-bekraeftigt-langfristige-manifest-v2-unterstuetzung/">Mozilla bekräftigt langfristige Manifest v2-Unterstützung in Firefox</a> erschien zuerst auf <a href="https://www.soeren-hentzschel.at">soeren-hentzschel.at</a>.</p></div>Übersetzungsfunktion von Firefox spricht jetzt weitere Sprachen2024-03-11T21:14:42+01:002024-03-11T21:14:42+01:00Sören Hentzschelhttps://www.soeren-hentzschel.at/firefox/uebersetzungsfunktion-von-firefox-weitere-sprachen-q1-2024/https://www.soeren-hentzschel.at/?p=31695715<div><p><strong>Firefox besitzt eine Übersetzungsfunktion für Websites, welche im Gegensatz zu Cloud-Übersetzern wie Google Translate lokal arbeitet, die eingegebenen Texte also nicht an einen fremden Server sendet. Nun hat Mozilla weitere unterstützte Sprachen aktiviert.</strong></p>
<p>Firefox wird seit Version 118 standardmäßig mit einer lokalen Funktion zur maschinellen Übersetzung von Websites für den Browser ausgeliefert. Das bedeutet, dass die Übersetzung vollständig im Browser geschieht und keine zu übersetzenden Inhalte an einen Datenriesen wie Google oder Microsoft übermittelt werden müssen. Dabei unterstützt Firefox bisher die Übersetzung aus und in die folgenden Sprachen: Deutsch, Englisch, Französisch, Italienisch, Spanisch, Portugiesisch, Niederländisch, Polnisch sowie Bulgarisch.</p>
<p><a href="https://github.com/mozilla/firefox-translations-models/pull/138">Ab sofort</a> werden weitere Sprachen unterstützt. So kann Firefox nun Websites auf Estnisch in andere Sprachen und umgekehrt übersetzen. Websites in den folgenden Sprachen können außerdem jetzt in eine der anderen unterstützten Sprachen übersetzt werden, aber noch nicht umgekehrt: Finnisch, Griechisch, Russisch, Slowenisch, Türkisch, Ukrainisch sowie Ungarisch.</p>
<p>Da die Sprachmodelle über die Remote-Einstellungen von Firefox bereitgestellt werden, ist die Unterstützung neuer Sprachen an kein Firefox-Update gebunden und funktioniert direkt in jedem Firefox mit aktivierter Übersetzungsfunktion.</p>
<p><a href="https://www.mozilla.org/de/firefox/channel/desktop/#nightly">Nightly-Versionen</a> von Firefox unterstützen noch <a href="https://github.com/mozilla/firefox-translations-models?tab=readme-ov-file#dev">weitere Sprachen</a>, deren Übersetzungsqualität aber von Mozilla als noch nicht gut genug beurteilt wurde, um diese jetzt schon in Beta- oder gar finalen Firefox-Versionen zu aktivieren. Da Übersetzungen in Firefox aktuell immer den Weg über Englisch gehen, steht Englisch in dieser Liste stellvertretend für alle unterstützten Sprachen, aus denen oder in die übersetzt werden soll.</p>
<p>Der Beitrag <a href="https://www.soeren-hentzschel.at/firefox/uebersetzungsfunktion-von-firefox-weitere-sprachen-q1-2024/">Übersetzungsfunktion von Firefox spricht jetzt weitere Sprachen</a> erschien zuerst auf <a href="https://www.soeren-hentzschel.at">soeren-hentzschel.at</a>.</p></div>RasAP – Der perfekte Ad-Blocker zuhause2024-03-07T15:50:02+01:002024-03-07T15:50:02+01:00Michael Koflerhttps://kofler.info/rasap-der-perfekte-ad-blocker-zuhause/https://kofler.info/?p=8044<div><p>Es gibt unzählige Möglichkeiten, die Web-Werbung zu minimieren. Die c’t hat kürzlich ausführlich zum Thema berichtet, aber die entsprechenden Artikel befinden sich auf heise.de hinter einer Paywall. Und heise.de ist ja mittlerweile auch eine Seite, die gefühlt mindestens so viel Werbung in ihre Texte einbaut wie spiegel.de. Das ist schon eine Leistung … Entsprechend lahm ist der Seitenaufbau im Webbrowser.</p>
<p>Egal, alles, was Sie wissen müssen, um zuhause einigermaßen werbefrei zu surfen, erfahren Sie auch hier — kostenlos und werbefrei :-)</p>
<figure class="wp-caption alignnone" id="entry-text-65f946ecattachment_8050"><a href="https://kofler.info/wp-content/uploads/raspap3-scaled.jpg"><img alt="" class="size-full wp-image-8050" height="1663" src="https://kofler.info/wp-content/uploads/raspap3-scaled.jpg" width="2560" /></a><figcaption class="wp-caption-text" id="entry-text-65f946eccaption-attachment-8050">Raspberry Pi 3B+ mit USB-WLAN-Adapter</figcaption></figure>
<p><span id="entry-text-65f946ecmore-8044"></span></p>
<h3>Konzept</h3>
<p>Die Idee ist simpel: Parallel zum lokalen Netzwerk zuhause richten Sie mit einem Raspberry Pi ein <em>zweites</em> WLAN ein. Das zweite Netz verwendet nicht nur einen anderen IP-Adressbereich, sondern hat auch einen eigenen Domain Name Server, der alle bekannten Ad-Ausliefer-Sites blockiert. Jeder Zugriff auf eine derartige Seite liefert sofort eine Null-Antwort. Sie glauben gar nicht, wie schnell die Startseite von heise.de, spiegel.de etc. dann lädt!</p>
<p>Alle Geräte im Haushalt haben jetzt die Wahl: sie können im vorhandenen WLAN des Internet-Routers bleiben, oder in das WLAN des Raspberry Pis wechseln. (Bei mir zuhause hat dieses WLAN den eindeutigen Namen/SSID <code>wlan-without-ads</code>.)</p>
<figure class="wp-caption alignnone" id="entry-text-65f946ecattachment_8051"><a href="https://kofler.info/wp-content/uploads/raspap-schema.png"><img alt="" class="size-full wp-image-8051" height="1647" src="https://kofler.info/wp-content/uploads/raspap-schema.png" width="3066" /></a><figcaption class="wp-caption-text" id="entry-text-65f946eccaption-attachment-8051">RaspAP auf dem Raspberry Pi spannt ein eigenes (beinahe) werbefreies WLAN auf</figcaption></figure>
<p>Zur Realisierung dieser Idee brauchen Sie einen Raspberry Pi — am besten <em>nicht</em> das neueste Modell: dessen Rechenleistung und Stromverbrauch sind zu höher als notwendig! Ich habe einen Raspberry Pi 3B+ aus dem Keller geholt. Auf dem Pi installieren Sie zuerst Raspbian OS Lite und dann RaspAP. Sie schließen den Pi mit einem Kabel an das lokale Netzwerk an. Der WLAN-Adapter des Raspberry Pis realisiert den Hotspot und spannt das werbefreie lokale Zweit-Netzwerk auf. Die Installation dauert ca. 15 Minuten.</p>
<h3>Raspberry Pi OS Lite installieren</h3>
<p>Zur Installation der Lite-Version von Raspberry Pi OS laden Sie sich das Programm <em>Raspberry Pi Imager</em> von <a href="https://www.raspberrypi.com/software/">https://www.raspberrypi.com/software/</a> herunter und führen es aus. Damit übertragen Sie Raspberry Pi OS Lite auf eine SD-Karte. (Eine SD-Karte mit 8 GiB reicht.) Am besten führen Sie gleich im Imager eine Vorweg-Konfiguration durch und stellen einen Login-Namen, das Passwort und einen Hostnamen ein. Sie können auch gleich den SSH-Server aktivieren — dann können Sie alle weiteren Arbeiten ohne Tastatur und Monitor durchführen. Führen Sie aber keine WLAN-Konfiguration durch!</p>
<p>Mit der SD-Karten nehmen Sie den Raspberry Pi in Betrieb. Der Pi muss per Netzwerkkabel mit dem lokalen Netzwerk verbunden sein. Melden Sie sich an (wahlweise mit Monitor + Tastatur oder per SSH) und führen Sie ein Update durch (<code>sudo apt update</code> und <code>sudo apt full-upgrade</code>).</p>
<h3>RaspAP installieren</h3>
<p>RaspAP steht für <em>Raspberry Pi Access Point</em>. Sein Setup-Programm installiert eine Weboberfläche, in der Sie unzählige Details und Funktionen Ihres WLAN-Routers einstellen können. Dazu zählen:</p>
<ul>
<li>Verwendung als WLAN-Router oder -Repeater</li>
<li>freie Auswahl des WLAN-Adapters</li>
<li>frei konfigurierbarer DHCP-Server</li>
<li>Ad-Blocking-Funktion</li>
<li>VPN-Server (OpenVPN, WireGuard)</li>
<li>VPN-Client (ExpressVPN, Mullvad VPN, NordVPN)</li>
</ul>
<p>An dieser Stelle geht es nur um die Ad-Blocking-Funktionen, die standardmäßig aktiv sind. Zur Installation laden Sie das Setup-Script herunter, kontrollieren kurz mit <code>less</code>, dass das Script wirklich so aussieht, als würde es wie versprochen RaspAP installieren, und führen es schließlich aus.</p>
<p>Die Rückfragen, welche Features installiert werden sollen, können Sie grundsätzlich alle mit <code>[Return]</code> beantworten. Das VPN-Client-Feature ist nur zweckmäßig, wenn Sie über Zugangsdaten zu einem kommerziellen VPN-Dienst verfügen und Ihr Raspberry Pi diesen VPN-Service im WLAN weitergeben soll. (Das ist ein großartiger Weg, z.B. ein TV-Gerät via VPN zu nutzen.)</p>
<p>Welche Funktionen Sie wirklich verwenden, können Sie immer noch später entscheiden. Das folgende Listing ist stark gekürzt. Die Ausführung des Setup-Scripts dauert mehrere Minuten, weil eine Menge Pakete installiert werden.</p>
<pre><code>wget https://install.raspap.com -O raspap-setup.sh
less raspap-setup.sh
bash raspap-setup.sh
The Quick Installer will guide you through a few easy steps
Using GitHub repository: RaspAP/raspap-webgui 3.0.7 branch
Configuration directory: /etc/raspap
lighttpd root: /var/www/html? [Y/n]:
Installing lighttpd directory: /var/www/html
Complete installation with these values? [Y/n]:
Enable HttpOnly for session cookies? [Y/n]:
Enable RaspAP control service (Recommended)? [Y/n]:
Install ad blocking and enable list management? [Y/n]:
Install OpenVPN and enable client configuration? [Y/n]:
Install WireGuard and enable VPN tunnel configuration? [Y/n]:
Enable VPN provider client configuration? [Y/n]: n
The system needs to be rebooted as a final step. Reboot now? [Y/n]
</code></pre>
<p>Wenn alles gut geht, gibt es nach dem Neustart des Raspberry Pi ein neues WLAN mit dem Namen <code>raspi-webgui</code>. Das Passwort lautet <code>ChangeMe</code>.</p>
<p>Sobald Sie Ihr Notebook (oder ein anderes Gerät) mit diesem WLAN verbunden haben, öffnen Sie in einem Webbrowser die Seite <a href="http://10.3.141.1">http://10.3.141.1</a> (mit <em>http</em>, nicht <em>https</em>!) und melden sich mit den folgenden Daten an:</p>
<p>Username: <code>admin</code><br />
Passwort: <code>secret</code></p>
<p>In der Weboberfläche sollten Sie als Erstes zwei Dinge ändern: das Admin-Passwort und das WLAN-Passwort:</p>
<ul>
<li>Zur Veränderung des Admin-Passworts klicken Sie auf das User-Icon rechts oben in der Weboberfläche, geben einmal das voreingestellte Passwort <code>secret</code> und dann zweimal Ihr eigenes Passwort an.
</li>
<li>
<p>Die Eckdaten des WLANs finden Sie im Dialogblatt <em>Hotspot</em>. Das Passwort können Sie im Dialogblatt <em>Security</em> verändern.</p>
</li>
</ul>
<figure class="wp-caption alignnone" id="entry-text-65f946ecattachment_8046"><a href="https://kofler.info/wp-content/uploads/raspap1.png"><img alt="" class="size-full wp-image-8046" height="954" src="https://kofler.info/wp-content/uploads/raspap1.png" width="1151" /></a><figcaption class="wp-caption-text" id="entry-text-65f946eccaption-attachment-8046">Die Weboberfläche von RaspAP mit den Hotspot-Einstellungen</figcaption></figure>
<figure class="wp-caption alignnone" id="entry-text-65f946ecattachment_8045"><a href="https://kofler.info/wp-content/uploads/raspap2.png"><img alt="" class="size-full wp-image-8045" height="1008" src="https://kofler.info/wp-content/uploads/raspap2.png" width="1151" /></a><figcaption class="wp-caption-text" id="entry-text-65f946eccaption-attachment-8045">Bei den Ad-Block-Einstellungen sind keine Änderungen erforderlich. Es schadet aber nicht, hin und wieder die Ad-Blocking-Liste zu erneuern.</figcaption></figure>
<p>RaspAP verwendet automatisch den WLAN-Namen (den <em>Service Set Identifier</em>) <code>raspi-webgui</code>. Auf der Einstellungsseite <em>Hotspot</em> können Sie einen anderen Namen einstellen. Ich habe wie gesagt <code>wlan-without-ads</code> verwendet. Danach müssen sich alle Clients neu anmelden. Fertig!</p>
<h3>USB-WLAN-Adapter</h3>
<p>Leider hat der lokale WLAN-Adapter des Raspberry Pis keine großartige Reichweite. Für’s Wohnzimmer oder eine kleine Wohnung reicht es, für größere Wohnungen oder gar ein Einfamilienhaus aber nicht. Abhilfe schafft ein USB-WLAN-Antenne. Das Problem: Es ist nicht einfach, ein Modell zu finden, das vom Linux-Kernel auf Anhieb unterstützt wird. Ich habe zuhause <em>drei</em> USB-WLAN-Adapter. Zwei haben sich als zu alt erwiesen (kein WPA, inkompatibel mit manchen Client-Geräten etc.); der dritte Adapter (BrosTrend AC650) wird auf Amazon als Raspberry-Pi-kompatibel beworben, womit ich auch schon in die Falle getappt bin. Ja, es gibt einen Treiber, der ist aber nicht im Linux-Kernel inkludiert, sondern muss manuell installiert werden:</p>
<p><a href="https://github.com/ElectricRCAircraftGuy/BrosTrendWifiAdapterSoftware">https://github.com/ElectricRCAircraftGuy/BrosTrendWifiAdapterSoftware</a></p>
<p>Immerhin gelang die Installation unter Raspberry Pi OS Lite auf Anhieb mit dem folgenden, auf GitHub dokumentierten Kommando:</p>
<pre><code>sh -c 'busybox wget deb.trendtechcn.com/install \
-O /tmp/install && sh /tmp/install'
</code></pre>
<p>Mit dem nächsten Neustart erkennt Linux den WLAN-Adapter und kann ihn nutzen. Das ändert aber nichts daran, dass mich die Installation von Treibern von dubiosen Seiten unglücklich macht, dass die Treiberinstallation nach jedem Kernel-Update wiederholt werden muss und dass die manuelle Treiberinstallationen bei manchen Linux-Distributionen gar nicht möglich ist (LibreELEC, Home Assistant etc.).</p>
<p>Wenn Sie gute Erfahrungen mit einem USB-WLAN-Adapter gemacht haben, hinterlassen Sie bitte einen kurzen Kommentar!</p>
<p>Sobald RaspAP den WLAN-Adapter kennt, bedarf es nur weniger Mausklicks in der RaspAP-Weboberfläche, um diesen Adapter für den Hotspot zu verwenden.</p>
<p>Alternativ können Sie den internen WLAN-Adapter auch ganz deaktivieren. Dazu bauen Sie in <code>config.txt</code> die folgende Zeile ein und starten den Raspberry Pi dann neu.</p>
<pre><code class="language-bash"># Datei /boot/firmware/config.txt
...
dtoverlay=disable-wifi
</code></pre>
<p>Danach kennt Raspberry Pi OS nur noch den USB-WLAN-Adapter, eine Verwechslung ist ausgeschlossen.</p>
<h3>Vorteile</h3>
<p>Der größte Vorteil von RaspAP als Ad-Blocker ist aus meiner Sicht seine Einfachheit: Der Werbeblocker kann mit minimalem Konfigurationsaufwand von jedem Gerät im Haushalt genutzt werden (Opt-In-Modell). Sollte RaspAP für eine Website zu restriktiv sein, dauert es nur wenige Sekunden, um zurück in das <em>normale</em> WLAN zu wechseln. Bei mir zuhause waren alle Familienmitglieder schnell überzeugt.</p>
<h3>Nachteile</h3>
<ul>
<li>Der Raspberry Pi muss per Ethernet-Kabel mit dem lokalen Netzwerk verbunden werden.
</li>
<li>
<p>Manche Seiten sind so schlau, dass sie das Fehlen der Werbung bemerken und dann nicht funktionieren. Es ist prinzipbedingt unmöglich, für solche Seiten eine Ausnahmeregel zu definieren. Sie müssen in das normale WLAN wechseln, damit die Seite funktioniert.</p>
</li>
<li>
<p>youtube-Werbung kann nicht geblockt werden, weil Google so schlau ist, die Werbefilme vom eigenen Server und nicht von einem anderen Server zuzuspielen. youtube.com selbst zu blocken würde natürlich helfen und außerdem eine Menge Zeit sparen, schießt aber vielleicht doch über das Ziel hinaus.</p>
</li>
<li>
<p>Mit RaspAP sind Sie in einem eigenen privaten Netz, NICHT im lokalen Netz Ihres Internet-Routers. Sie können daher mit Geräten, die sich im <code>wlan-without-ads</code> befinden, nicht auf andere Geräte zugreifen, die mit Ihrem lokalen Router (FritzBox etc.) verbunden sind. Das betrifft NAS-Geräte, Raspberry Pis mit Home Assistant oder anderen Anwendungen etc.</p>
</li>
</ul>
<h3>Keine Werbeeinnahmen mehr für Seitenbetreiber?</h3>
<p>Mir ist klar, dass sich viele Seiten zumindest teilweise über Werbung finanzieren. Das wäre aus meiner Sicht voll OK. Aber das Ausmaß ist unerträglich geworden: Mittlerweile blinkt beinahe zwischen <em>jedem</em> Absatz irgendein sinnloses Inserat. Werbefilme vervielfachen das Download-Volumen der Seiten, der Lüfter heult, ich kann mich nicht mehr auf den Text konzentrieren, den ich lese. Es geht einfach nicht mehr.</p>
<p>Viele Seiten bieten mir Pur-Abos an (also Werbeverzicht gegen Bezahlung). Diesbezüglich war <a href="https://checkout.derstandard.at/produkt/der-standard-at-pur">https://derstandard.at</a> ein Pionier, und tatsächlich habe ich genau dort schon vor vielen Jahren mein einziges Pur-Abo abgeschlossen. In diesem Fall ist es auch ein Ausdruck meiner Dankbarkeit für gute Berichterstattung. Früher habe ich für die gedruckte Zeitung bezahlt, jetzt eben für die Online-Nutzung.</p>
<p>Mein Budget reicht aber nicht aus, dass ich solche Abos für alle Seiten abschließen kann, die ich gelegentlich besuche: heise.de, golem.de, phoronix, zeit.de, theguardian.com usw. Ganz abgesehen davon, dass das nicht nur teuer wäre, sondern auch administrativ mühsam. Ich verwende diverse Geräte, alle paar Wochen muss ich mich neu anmelden, damit die Seiten wissen, dass ich zahlender Kunde bin. Das ist bei <em>derstandard.at</em> schon mühsam genug. Wenn ich zehn derartige Abos hätte, würde ich alleine an dieser Stelle schon verzweifeln.</p>
<p>Wenn sich Zeitungs- und Online-News-Herausgeber aber zu einem Site-übergreifenden Abrechnungsmodell zusammenschließen könnten (Aufteilung der monatlichen Abo-Gebühr nach Seitenzugriffen), würde ich mir das vielleicht überlegen. Das ist aber sowieso nur ein Wunschtraum.</p>
<p>Aber so, wie es aktuell aussieht, funktioniert nur alles oder nichts. Mit RaspAP kann ich die Werbung nicht für manche Seiten freischalten. Eine Reduktion des Werbeaufkommens auf ein vernünftiges Maß funktioniert auch nicht. Gut, dann schalte ich die Werbung — soweit technisch möglich — eben ganz ab.</p></div>Linux statt Windows auf dem Desktop – Nicht nur Musikproduktion2024-03-06T08:23:59+01:002024-03-06T08:23:59+01:00hoergenhttps://hyperblog.de/hoergen/2024/03/06/linux-statt-windows-auf-dem-desktop-nicht-nur-musikproduktion/https://hyperblog.de/hoergen/?p=556<div><p>Wie <a href="http://Linux%20%C3%BCberspringt%20Vier-Prozent-H%C3%BCrde%20auf%20dem%20Desktop" rel="noopener" target="_blank" title="">Golem</a> schreibt, erwägen wohl mittlerweile viele BenutzerInnen den Schritt auf Linux, statt von Window 10 auf Windows 11 und eventuell später auf irgendwelche monatliche Abo Varianten zu wechseln.</p>
<p>Da ich seit über 25 Jahren Linux auf dem Desktop nutze und immer noch absolut begeistert bin, würde ich jeden Menschen immer wieder ermutigen das auch auszuprobieren.</p>
<p>Um einige Zeit verschwendende Diskussionen zu vermeiden ein paar Punkte vorweg:</p>
<ol>
<li>Wer wenig visuelle Veränderungen haben will entscheidet sich für eine Linux Distribution mit <strong>KDE/Plasma</strong> z.B. die Distribution <a href="https://kubuntu.org/" rel="noopener" target="_blank" title="">Kubuntu</a> oder aus Deutschland das <a href="https://www.tuxedocomputers.com/de/TUXEDO-OS_1.tuxedo" rel="noopener" target="_blank" title="">Tuxedo OS</a> oder Mint oder eine andere Linux Distributionen</li>
<li>Um nicht komplett ins kalte Wasser springen zu müssen, können so ziemlich alle <strong>Linux Distributionen auf einen USB Stick</strong> „installiert“ (<a href="https://wiki.ubuntuusers.de/Live-USB/" rel="noopener" target="_blank" title="">Live-USB Stick</a>) werden und von dort einfach mal gestartet und ausprobiert werden. Ein USB Stick ist zwar langsam, aber es geht erst mal dabei nicht um Geschwindigkeit, sondern darum, ob es läuft und einen <strong>ersten Eindruck</strong> zu bekommen. Und zum Thema Geschwindigkeit: Ein installiertes Linux ist in 99% der Fälle wesentlich <strong>schneller als ein installiertes Windows</strong>.</li>
<li>Viele nutzen bereits schon <strong>Opensource Software</strong>, die hauptsächlich für Linux entwickelt wird. Da ist der Umstieg super einfach. Weil es gar kein Umstieg ist. Das prominenteste Beispiel dafür ist der <a href="https://www.mozilla.org/de/firefox/new/" rel="noopener" target="_blank" title="">Mozilla Firefox</a> Browser.</li>
<li>Viele sind über die Jahre so darauf getrimmt worden, dass sie z.B. auf <strong>Microsoft Office</strong> nicht verzichten können. Das ist aber reine Gehirnwäsche. <strong>Libreoffice</strong> bietet für 99% der Menschen mehr Funktionen, als sie tatsächlich nutzen.</li>
<li>Eine Sache, die mir immer wieder auffällt, wenn Menschen den <strong>Wechsel von Windows zu Linux</strong> erwägen ist, dass sie aufgrund der erweiterten Möglichkeiten plötzlich vorgefertigte <strong>Funktionsanforderungen</strong> stellen, die sie zuvor noch nie hatten bzw die unter Windows nur sehr sehr umständlich möglich sind. Hier bitte die Kirche im Dorf lassen, oder sich selbst um diese <strong>hoch individualisierten</strong> <strong>Lösungen</strong> kümmern bzw die Suchmaschine dazu konsultieren. Vermutlich gibt es diese Lösung schon.</li>
<li>Natürlich ändern sich bei einem Betriebssystemwechsel auch häufig die Namen bestimmter Softwarekomponenten. Aber auch die <strong>Eingewöhnungsphase</strong> ist recht kurz. Ich spreche da aus Erfahrung mit Menschen, die teils einfach so spontan Linux haben wollten und bis heute sehr glücklich damit sind.</li>
<li>Ich habe im Laufe der Zeit ein paar einfach verständliche <strong>Erklär-Videos</strong> zum <strong>Thema Linux und Linux und Musikproduktion</strong> auf meinem <a href="https://www.youtube.com/@OdoSendaidokai" rel="noopener" target="_blank" title="">Musikproduktions Kanal „Odo Sendaidokai“</a> produziert, die ich hier für alle interessierten Menschen verlinke. Und wer sich für Musikproduktion generell interessiert, ist natürlich gerne eingeladen den <a href="https://www.youtube.com/@OdoSendaidokai" rel="noopener" target="_blank" title="">Kanal</a> zu abonnieren. Seit längerer Zeit produziere ich die Videos auf Deutsch und Englisch. Inklusive regelmäßiger <a href="https://www.youtube.com/@OdoSendaidokai/streams" rel="noopener" target="_blank" title="">Livestreams</a> auf Deutsch, in denen ich meist Tracks von Anfang an produziere bzw auch Vieles erkläre. Zum Thema Musikproduktion betreibe ich zusätzlich noch das <a href="https://hyperblog.de/klangwerk/" rel="noopener" target="_blank" title="">Blog „Klangwerk“</a>.</li>
<li>Für die Musikproduktion unter Linux ist für dich <a href="https://hyperblog.de/hoergen/tag/pipewire/" rel="noopener" target="_blank" title="">Pipewire</a> natürlich sehr interessant und dafür habe ich hier im Blog auch noch einige erklärende Artikel.</li>
</ol>
<p>Hier die Liste der Linux Erklär-Videos:</p>
<ol>
<li><a href="https://www.youtube.com/watch?v=cAWDfLSheUI" rel="noopener" target="_blank" title="">Linux Supersonic from Zero to Hero Musikproduktion | DE</a> (16.01.2024)</li>
<li><a href="https://www.youtube.com/watch?v=TwclVdsVIqM" rel="noopener" target="_blank" title="">Bitwig Linux Musicproduction 11/2023 | deutsch</a> (19.11.2023)</li>
<li><a href="https://www.youtube.com/watch?v=_BYOq0Q5HL4" rel="noopener" target="_blank" title="">Musikproduktion mit Linux (auch Bitwig)</a> (12.07.2021)</li>
<li><a href="https://www.youtube.com/watch?v=aX84va5a1Fo" rel="noopener" target="_blank" title="">Windows VST mit Bitwig unter Linux</a> (02.10.2021)</li>
<li><a href="https://www.youtube.com/watch?v=D0ydoJ_Fjw0" rel="noopener" target="_blank" title="">Bitwig JackAudio OBS Linux (Deutsch) – UPDATE 2022 Pipewire ist jetzt der Standard</a> (15.11.2020)</li>
</ol><p>The post <a href="https://hyperblog.de/hoergen/2024/03/06/linux-statt-windows-auf-dem-desktop-nicht-nur-musikproduktion/">Linux statt Windows auf dem Desktop – Nicht nur Musikproduktion</a> first appeared on <a href="https://hyperblog.de/hoergen">Dem hoergen Blog</a>.</p></div>Sicherheits-Update Thunderbird 115.8.1 veröffentlicht2024-03-06T07:08:23+01:002024-03-06T07:08:23+01:00Sören Hentzschelhttps://www.soeren-hentzschel.at/thunderbird/thunderbird-115-8-1/https://www.soeren-hentzschel.at/?p=31695707<div><div class="content">
<p><strong>Die MZLA Technologies Corporation hat mit Thunderbird 115.8.1 ein Sicherheits- und Fehlerbehebungs-Update für seinen Open Source E-Mail-Client veröffentlicht.</strong></p>
</div>
<h2>Neuerungen von Thunderbird 115.8.1</h2>
<p>Mit dem Update auf Thunderbird 115.8.1 hat die MZLA Technologies Corporation ein Update für seinen Open Source E-Mail-Client veröffentlicht und behebt damit mehrere Probleme, welche sich in den <a href="https://www.thunderbird.net/en-US/thunderbird/115.8.1/releasenotes/">Release Notes (engl.)</a> nachlesen lassen. Auch eine <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2024-11/">Sicherheitslücke</a> wurde mit Thunderbird 115.8.1 behoben.</p>
<p>Der Beitrag <a href="https://www.soeren-hentzschel.at/thunderbird/thunderbird-115-8-1/">Sicherheits-Update Thunderbird 115.8.1 veröffentlicht</a> erschien zuerst auf <a href="https://www.soeren-hentzschel.at">soeren-hentzschel.at</a>.</p></div>Vim – Bereiche mit Klammern umschließen2024-03-05T16:27:51+01:002024-03-05T16:27:51+01:00hoergenhttps://hyperblog.de/hoergen/2024/03/05/vim-bereiche-mit-klammern-umschliessen/https://hyperblog.de/hoergen/?p=551<div><hr class="wp-block-separator has-alpha-channel-opacity" />
<p>Manchmal ist die Denke einfach zu kompliziert. Da wollte ich in vim einen Bereich möglichst effizient mit runden Klammern versehen und habe eine Weile rum gemurgst, bis ich dann die einfache Lösung gefunden habe:</p>
<ol>
<li>Bereich auswählen mit <code>v</code> und z.B. <code>$</code> bis zum Zeilenende</li>
<li>dann <code>c</code> drücken</li>
<li><code>()</code> schreiben</li>
<li><code>ESC</code> drücken und</li>
<li>ein großes (shift) <code>P</code> drücken</li>
</ol>
<p>also <code>v$c()<ESC>P</code></p>
<p>Und alles ist schön umklammert.</p>
<p>Wenn es egal ist den Bereich visuell zu markieren, dann geht es auch ohne das v und das $ (bis Zeilenende) muss nach dem c eingegeben werden. (Danke Rebeka!)</p>
<p><code>c$()<ESC>P</code> oder gleich <code>C()<ESC>P</code></p>
<p>Weitere Varianten wären:</p>
<ol>
<li>Bis zum nächsten Vorkommen z.B. des Buchstabens „m“ <code>cfm()<ESC>P</code></li>
<li>Vom vorherigem Vorkommen eines „t“ bis zum nächsten Vorkommen eines „m“ <code>Ftcfm()<ESC>P</code> </li>
<li>Wenn mitten im Wort gestartet wird, das natürlich auch umklammert werden soll, als erstes ein <code>b</code> tippen z.B. <code>bC()<ESC>P</code> </li>
<li>Die nächsten 3 Worte <code>c3w()<ESC>P</code> oder eben <code>bc3w()<ESC>P</code></li>
</ol>
<p></p>
<p></p><p>The post <a href="https://hyperblog.de/hoergen/2024/03/05/vim-bereiche-mit-klammern-umschliessen/">Vim – Bereiche mit Klammern umschließen</a> first appeared on <a href="https://hyperblog.de/hoergen">Dem hoergen Blog</a>.</p></div>Mozilla veröffentlicht Firefox 123.0.12024-03-05T13:58:44+01:002024-03-05T13:58:44+01:00Sören Hentzschelhttps://www.soeren-hentzschel.at/firefox/mozilla-veroeffentlicht-firefox-123-0-1/https://www.soeren-hentzschel.at/?p=31695699<div><p><strong>Mozilla hat Firefox 123.0.1 veröffentlicht und behebt damit mehrere Probleme der Vorgängerversion.<br /></strong></p>
<p><a href="https://www.mozilla.org/de/firefox/new/"><strong>Download Mozilla Firefox 123.0.1</strong></a></p>
<p>Mit dem Update auf Firefox 123.0.1 behebt Mozilla ein Problem, welches bei Verwendung mancher Themes verursachte, dass bei einer Website, die von Firefox übersetzt wurde, in der Adressleiste die Sprache nicht erkennbar war, in welche übersetzt worden ist.</p>
<p>Ein anderes behobenes Darstellungsproblem betrifft das Entwicklerwerkzeug „Web-Speicher“, bei welchem der Text in markierten Zeilen nur schwer zu lesen war.</p>
<p>Firefox 123.0.1 behebt auch mehrere Webkompatibilitätsprobleme. So wurde das <code>change</code>-Event nicht mehr ausgelöst, wenn ein <code>textarea</code>-Element geleert worden ist. Konische Farbverläufe wurden unter Windows mit aktivierter Hardwarebeschleunigung nicht mehr korrekt dargestellt. Außerdem wurde ein Fehler im JIT-Compiler der JavaScript-Engine behoben, bei dem <code>String.prototype.lastIndexOf</code> einen falschen Rückgabewert lieferte, wenn der Suchtext leer war.</p>
<p>Ein weiteres behobenes Problem betrifft Flatpak-Nutzer unter Linux, für welche andere Wörterbücher als <code>en-US</code> nicht mehr funktionierten.</p>
<p>Schließlich wurde noch ein Problem der chinesischen Firefox-Variante behoben, welches verursachte, dass auf der Seite, die beim Öffnen eines neuen Tabs erscheint, nur noch eine Fehlermeldung zu sehen war.</p>
<p>Der Beitrag <a href="https://www.soeren-hentzschel.at/firefox/mozilla-veroeffentlicht-firefox-123-0-1/">Mozilla veröffentlicht Firefox 123.0.1</a> erschien zuerst auf <a href="https://www.soeren-hentzschel.at">soeren-hentzschel.at</a>.</p></div>Atuin - Den Verlauf der Shell auf mehreren Rechnern synchronisieren2024-03-03T10:31:12+01:002024-03-03T10:31:12+01:00Fryboyterhttps://fryboyter.de/atuin-den-verlauf-der-shell-auf-mehreren-rechnern-synchronisieren/https://fryboyter.de/atuin-den-verlauf-der-shell-auf-mehreren-rechnern-synchronisieren/<div><p>Da ich mehrere Rechner nutze, habe ich die Angewohnheit bestimmte Dinge beispielsweise mit dem Notebook anzufangen, dann eine Pause zu machen (weil ich zum Beispiel schlafen will) und dann mit einem meiner normalen Rechner weiterzumachen. An sich kein Problem, allerdings fehlt mir in solch einem Fall oft der Verlauf der Befehle, die ich in der Shell ausgeführt habe.</p>
<p>Daher habe ich mir nun <a href="https://github.com/atuinsh/atuin">Atuin</a> zugelegt. Hierbei handelt es sich nicht um die <a href="https://discworld.fandom.com/wiki/Great_A%27Tuin">Schildkröte</a>, sondern um ein Tool, welches die Historie einer Shell lokal in einer SQLite-Datenbank speichert, deren Inhalt man mit anderen Rechnern synchronisieren kann.</p>
<p>Die Einträge in dieser Datenbank werden um diverse Informationen erweitert. Zum Beispiel dem Exit Code, Current Working Directory und so weiter. Die Suche innerhalb der Einträge erfolgt in der Standardkonfiguration “<a href="https://de.wikipedia.org/wiki/Unscharfe_Suche">fuzzy</a>”.</p>
<p>Für die Synchronisation zwischen mehreren Rechnern wird ein Server, den die Entwicklerin von Atuin zur Verfügung stellt, genutzt. Die Übertragung der Daten erfolgt hierbei mittels <a href="https://de.wikipedia.org/wiki/Ende-zu-Ende-Verschl%C3%BCsselung">E2EE</a>. Wer ihr nicht vertraut, kann entweder einen solchen Server selbst hosten (<a href="https://docs.atuin.sh/self-hosting/server-setup/">https://docs.atuin.sh/self-hosting/server-setup/</a>) oder Atuin nur lokal nutzen. Letzteres hat im Grunde dann nur den Vorteil der besseren Suche.</p>
<p>Es gibt auch noch andere Tools zur Synchronisation von bereits ausgeführten Befehlen in der Shell. Zum Beispiel <a href="https://github.com/cantino/mcfly">https://github.com/cantino/mcfly</a>. Aber als jemand der jeden Roman von Terry Pratchett besitzt und gelesen hat, musste ich mich einfach für Atuin entscheiden.</p></div>Eine rollende Veröffentlichung bedeutet nicht eine schnellstmögliche Veröffentlichung2024-03-01T15:26:39+01:002024-03-01T15:26:39+01:00Fryboyterhttps://fryboyter.de/eine-rollende-veroeffentlichung-bedeutet-nicht-eine-schnellstmoegliche-veroeffentlichung/https://fryboyter.de/eine-rollende-veroeffentlichung-bedeutet-nicht-eine-schnellstmoegliche-veroeffentlichung/<div><p>Vor ein paar Tagen wurde KDE Plasma 6 veröffentlicht. Nur wenige Tage später fragen sich schon die ersten Nutzer warum beispielsweise Arch Linux diese neue Version noch nicht anbietet.</p>
<p>Bei einer rollenden Distribution geht es primär nicht darum, dass bestimmte Updates so schnell wie möglich in den Paketquellen angeboten werden. Es geht darum, dass Updates nach und nach über die gleichen Paketquellen angeboten werden. Es geht also nicht darum wer den ersten Platz bei einem Wettrennen hat. Mit OpenSuse <a href="https://news.opensuse.org/2024/01/19/clarifying-misunderstandings-of-slowroll/">Slowroll</a> soll es daher auch eine Distribution geben, die rollt, aber bei der Updates vergleichsweise langsam angeboten werden.</p>
<p>Im Falle von Arch Linux wird somit in der Regel auch nie erste Hauptversion eines neuen Kernels (z. B. 6.0) über die offiziellen Paketquellen angeboten, sondern in der Regel immer erst das erste “Minor-Update” (z. B. 6.0.1). Ich vermute, das wird bei KDE Plasma 6 auch der Fall sein. Vor nächster Woche wird Plasma 6 also vermutlich nicht in den offiziellen Paketquellen von Arch Linux erscheinen. Wenn aus Sicht der Entwickler von Arch Linux weitere Gründe gegen ein Update auf Plasma 6 sprechen, wird es vermutlich sogar noch länger dauern.</p></div>Was wir aus dem Fediverse-Spam für Codeberg lernen können2024-03-01T14:57:59+01:002024-03-01T14:57:59+01:00Fryboyterhttps://fryboyter.de/was-wir-aus-dem-fediverse-spam-f%C3%BCr-codeberg-lernen-koennen/https://fryboyter.de/was-wir-aus-dem-fediverse-spam-f%C3%BCr-codeberg-lernen-koennen/<div><p>Heute will ich mal nicht mit einem eigenen Artikel langweilen, sondern nur auf einen anderen Artikel hinweisen. Dieser hat zwar direkt nichts mit Linux oder OSS zu tun und ist auch noch in englischer Sprache verfasst, aber ich hoffe um Nachsicht.</p>
<p>Otto, eines der Mitglieder von Codeberg, hat kürzlich einen <a href="https://blog.codeberg.org/what-we-can-learn-from-the-fediverse-spam-for-codeberg.html">Artikel</a> bezüglich des <a href="https://de.wikipedia.org/wiki/Fediverse">Fediverse</a> veröffentlicht, den ich recht interessant finde. Ohne ihn bewerten zu wollen.</p>
<p>Bei <a href="https://codeberg.org">Codeberg</a> handelt es sich um eine Alternative zu Github, die auch für die Entwicklung von Projekten genutzt wird, die unter Linux verwendete werden. Also zumindest so gesehen passt das Ganze doch zu Linux und OSS. Zumal ein Großteil aller Fediverse-Nutzer Linux oder OSS im Allgemeinen nutzen werden. Vergesst das mit der Nachsicht somit einfach. ;-)</p></div>Auf der Suche nach Ubuntu Touch Pine64 20.04 UBPorts Images2024-03-01T09:16:56+01:002024-03-01T09:16:56+01:00andihttps://linux.waldstepper.de/auf-der-suche-nach-ubuntu-touch-pine64-20-04-ubports-images/https://linux.waldstepper.de/?p=469<div><p>Mein PinePhone in der <em>Community Edition: UBports</em> hat das letzte Update im Sommer 2021 empfangen. Es hängt auf Ubuntu 16.04 (2021-08-20) fest.</p>
<p>Nun habe ich mir überlegt mir das aktuelle Ubuntu Touch 20.04 herunterzuladen und es dann von der MicroSD-Karte zu starten.<br />
Ich gehe auf die UT Projektseite <a href="https://gitlab.com/ook37/pinephone-pro-debos/-/releases">https://gitlab.com/ook37/pinephone-pro-debos/-/releases</a> und lade die Datei <em>ubuntu-touch-pinephone-img-arm64.raw.xz</em> herunter. <a href="https://ci.ubports.com/job/focal-hybris-rootfs-arm64/job/master/lastSuccessfulBuild/artifact/">Downloadseite</a></p>
<p>Ich schreibe das Image ohne es zu entpacken auf meine MicroSD-Karte.</p>
<pre>andi@X230:~$ xzcat Downloads/ubuntu-touch-pinephone-img-arm64.raw.xz | sudo dd bs=8M status=progress of=/dev/mmcblk0
</pre>
<p>Das PinePhone bootet von der MicroSD-Karte. In den <em>Systemeinstellungen -> Info -> Betriebssystem</em> wird mir <em>Ubuntu 16.04 (2021-08-20)</em> angezeigt. Das ist die gleiche Version wie das von meinem instalierten UT auf dem PinePhone.<br />
Wo ist Ubuntu Touch 20.04, gab es seit 2021 keine Aktualisierungen?</p></div>KDE Plasma 6 veröffentlicht2024-02-28T22:12:00+01:002024-02-28T22:12:00+01:00Viktor Garskehttps://blog.v-gar.de/2024/02/kde-plasma-6-veroffentlicht/https://blog.v-gar.de/2024/02/kde-plasma-6-veroffentlicht/<div><p>Kurz notiert: heute wurde die Desktopumgebung Plasma 6 aus dem KDE-Projekt freigegeben. Mit dem Umstieg auf Qt 6 und den einhergehenden Arbeiten ist es nach knapp 10 Jahren der erste große Major-Release (KDE Plasma 5 wurde 2014 veröffentlicht). Eine weitere wegweisende Änderung ist, dass der Fokus nun klar auf dem Display-Server Wayland liegt, der auch nun zur Standardeinstellung wurde. X11 wird jedoch weiterhin unterstützt.</p>
<p>Eine Auswahl der weiteren Änderungen:</p>
<ul>
<li>Es gibt einen neuen Overview-Effekt.</li>
<li>Durch Wayland wird nun auch HDR unterstützt.</li>
<li>Es gibt neue Filter zur Unterstützung bei Farbenblindheit.</li>
<li>Das Einstellungsprogramm wurde überarbeitet.</li>
<li>Der bekannte KDE Cube ist zurück.</li>
<li>Neue Standardeinstellungen:<ul>
<li>Dateien/Verzeichnisse werden nun mit einem Klick ausgewählt und mit einem Doppelklick geöffnet.</li>
<li>Das Panel ist nun standardmäßig schwebend.</li>
<li>Thumbnail-Grid ist nun der Standard-Task-Switcher.</li>
<li>Scrollen auf dem Desktop führt nun nicht mehr zum Wechsel der virtuellen Desktops.</li>
</ul>
</li>
</ul>
<p>Auch die KDE-Anwendungen erfahren umfangreiche Updates. All diese Informationen können im <a href="https://kde.org/de/announcements/megarelease/6/">Release Announcement</a> nachvollzogen werden. </p>
<p>KDE Plasma 6 sollte nun sukzessive auch in die Distributionen Einzug halten. Arch Linux ist als Beispiel für einen Rolling Release da schon schnell dabei. Ob und inwiefern komplexe Setups des traditionell sehr einstellbaren Desktop-Systems umgezogen werden können, wird sich dann zeigen. Ein großer Vorteil des KDE-Ansatzes zeigt sich allerdings schon im Release-Announcement: viele der Funktionen <em>können</em> genutzt werden, müssen es aber nicht. Dem Endanwender wird die Wahl überlassen, welche Optionen er nutzen möchte.</p></div>Longplayer2024-02-26T22:00:42+01:002024-02-26T22:00:42+01:00yhaupenthal+feed@posteo.de (Y Haupenthal)https://uxg.ch/block/2024/02/26/longplayer/https://uxg.ch/block/2024/02/26/longplayer/<div><p>Irgendwann bin ich mal ueber <a href="https://en.wikipedia.org/wiki/Longplayer">Longplayer <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> gestolpert und finde das ja
grossartig 😄</p>
<p>Auf der Wikipedia Seite wird z.B. auch <a href="https://en.wikipedia.org/wiki/As_Slow_as_Possible">As Slow as Possible <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
erwaehnt, auch super.</p>
<p>Vor allem grossartig finde ich, dass das auch <a href="https://longplayer.org/listen/live-stream/">gestreamt werden
kann <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>.</p>
<p>Noch besser finde ich aber, dass <a href="https://longplayer.org/listen-files/longplayer.pls">die Streamdatei <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> eine <a href="https://de.wikipedia.org/wiki/PLS_%28Dateiformat%29">pls Datei
ist <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>, die auch einfach mit <a href="https://de.wikipedia.org/wiki/Cat_%28Unix%29"><code>cat</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> geschrieben werden kann:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">cat <<! >~/longplayer.pls
</span></span><span class="line"><span class="cl"><span class="o">[</span>playlist<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Title1</span><span class="o">=</span>Longplayer
</span></span><span class="line"><span class="cl"><span class="nv">File1</span><span class="o">=</span>http://icecast.spc.org:8000/longplayer
</span></span><span class="line"><span class="cl"><span class="nv">NumberOfEntries</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="nv">Length1</span><span class="o">=</span>-1
</span></span><span class="line"><span class="cl">!
</span></span></code></pre></div><p>Und kann dann z.B. mit <a href="https://de.wikipedia.org/wiki/Mpv"><code>mpv</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> abgespielt werden (die direkte URL
wuerde uebrigens auch gehen):</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">mpv ~/longplayer.pls <span class="c1"># oder direkt</span>
</span></span><span class="line"><span class="cl">mpv http://icecast.spc.org:8000/longplayer
</span></span></code></pre></div><p><a href="https://uxg.ch/block/2015/11/25/text2youtubevideo.sh/#hintergrundmusik">Musik in der Shell</a> finde ich schon sehr lange sehr spannend!
🎶 🤓</p></div>Was ist Ubuntu Pro und wie schalte ich es ab?2024-02-26T09:19:00+01:002024-02-26T09:19:00+01:00nospam@example.com (Guenny)https://itrig.de/index.php?/archives/2447-Was-ist-Ubuntu-Pro-und-wie-schalte-ich-es-ab.htmlhttps://itrig.de/index.php?%2Farchives%2F2447-guid.html=<div><p>Ubuntu Pro ist eine Updateerweiterung für bestimmte Pakete der bekannten Distribution.<br />
Ubuntu LTS soll so 10 Jahre Abdeckung für über 25.000 Pakete erhalten. Zusätzlich erhältst du Kernel Livepatching, Telefonsupport und Pakete fürs Hardening (NIST-certified FIPS crypto-modules, USG hardening mit CIS and DISA-STIG Profilen und Common Criteria EAL2).</p>
<p>Leider wird für dieses kostenpflichtige Produkt Werbung gemacht, auf dem Terminal und im Ubuntu Update Manager.<br />
Sollte dich das stören, kannst du diese Meldungen mit wenigen Befehlen abschalten.<br />
Alternativ kannst du dich auch einfach für <a href="https://ubuntu.com/pro/subscribe" target="_blank" title="https://ubuntu.com/pro/subscribe">Ubuntu Pro</a> anmelden, denn der Zugang ist für Privatanwender für bis zu fünf Installationen umsonst.</p>
<h2>Ubuntu Pro Nachrichten abschalten</h2>
<pre><code class="language-bash">sudo pro config set apt_news=false </code></pre>
<p>Das Abschalten der APT News reicht nicht ganz aus, um dir die Werbeeinblendung zu ersparen.<br />
Du musst zusätzlich eine Datei editieren und deren Inhalt auskommentieren</p>
<pre><code class="language-bash">nano /etc/apt/apt.conf.d/20apt-esm-hook.conf</code></pre>
<p><img alt="ubuntu-pro-werbung-abschalten" class="serendipity_image_center" height="183" src="https://itrig.de/uploads/ubuntu-pro-werbung-abschalten.png" title="ubuntu-pro-werbung-abschalten" width="676" /></p>
<h2>Ubuntu Advantage deaktivieren oder deinstallieren</h2>
<p>Optional kannst du das <em>Ubuntu Advantage Paket</em> entfernen, bzw. die <em>Expanded SecurityMaintenance (ESM)</em> abschalten, wenn du magst.<br />
Ubuntu Advantage war der Vorgänger von Ubuntu Pro<br />
Dieses beinhaltet wie die Pro-Variante Kernel Livepatching, Unterstützung für Landscape oder Zugriff auf eine Wissensdatenbank. Alles Dinge, die für Privatanwender nur bedingt interessant sind.</p>
<pre><code>sudo systemctl disable ubuntu-advantage
#oder
sudo apt remove ubuntu-advantage-tools
# esm hook deaktivieren
sudo mv /etc/apt/apt.conf.d/20apt-esm-hook.conf /etc/apt/apt.conf.d/20apt-esm-hook.conf.disabled</code></pre>
<h2>Unterschied Ubuntu Advantage und Ubuntu Pro</h2>
<p>Solltest du nun maximal verwirrt sein, was zu welchem Supportmodell gehört und wie es unterstützt wird, hier ein Vergleich von <a href="https://endoflife.date/ubuntu#fnref:1:1" target="_blank" title="https://endoflife.date/ubuntu#fnref:1:1">endoflifedate</a>. Ubuntu Pro (Infra-Only) steht in der Tabelle für das alte Ubuntu Advantage.</p>
<p><img alt="ubuntu-lts-vs-ubuntu-pro" class="serendipity_image_center" height="363" src="https://itrig.de/uploads/ubuntu-lts-vs-ubuntu-pro.png" title="ubuntu-lts-vs-ubuntu-pro" width="754" /></p>
<p> </p></div>Mit einem Dualstack-Reverse-Proxy Internet-Protokolle verbinden2024-02-26T06:00:00+01:002024-02-26T06:00:00+01:00Jörg Kastninghttps://www.my-it-brain.de/wordpress/mit-einem-dualstack-reverse-proxy-internet-protokolle-verbinden/https://www.my-it-brain.de/wordpress/?p=3762<div><p><a href="https://www.my-it-brain.de/wordpress/mit-einem-dualstack-proxy-internet-protokolle-verbinden/">Mit einem Dualstack-Proxy Internet-Protokolle verbinden</a> beschrieb eine Möglichkeit, um von Hosts, welche ausschließlich über IPv6-Adressen verfügen, auf Ziele zugreifen zu können, die ausschließlich über IPv4-Adressen verfügen. In diesem Beitrag betrachte ich die andere Richtung.</p>
<p>Zu diesem Beitrag motiviert hat mich der <a href="https://www.my-it-brain.de/wordpress/ipv6-kein-anschluss-unter-dieser-nummer/#comment-48426">Kommentar von Matthias</a>. Er schreibt, dass er für den bei einem Cloud-Provider gehosteten Jenkins Build Server IPv4 deaktivieren wollte, um Kosten zu sparen. Dies war jedoch nicht möglich, da Kollegen aus einem Co-Workingspace nur mit IPv4 angebunden sind und den Zugriff verloren hätten.</p>
<p>Doch wie kann man nun ein IPv6-Netzwerk für ausschließlich IPv4-fähige Clients erreichbar machen, ohne für jeden Host eine IPv4-Adresse zu buchen? Dazu möchte ich euch anhand eines einfachen Beispiels eine mögliche Lösung präsentieren.</p>
<h2 class="wp-block-heading">Vorkenntnisse</h2>
<p>Um diesem Text folgen zu können, ist ein grundsätzliches Verständnis von <a href="https://de.wikipedia.org/wiki/Domain_Name_System">DNS</a>, dessen <a href="https://de.wikipedia.org/wiki/Resource_Record">Resource Records</a> (RR) und des <a href="https://de.wikipedia.org/wiki/Host_(HTTP-Header-Feld)">HTTP-Host-Header-Felds</a> erforderlich. Die Kenntnis der verlinkten Wikipedia-Artikel sollte hierfür ausreichend sein.</p>
<h2 class="wp-block-heading">Umgebung</h2>
<p>Zu diesem Proof of Concept gehören:</p>
<ul>
<li>Ein Dualstack-Reverse-Proxy-Server (<a href="https://www.haproxy.org/">HAProxy</a>) mit den DNS-RR:
<ul>
<li>haproxy.example.com. IN A 203.0.113.1</li>
<li>haproxy.example.com IN AAAA 2001:DB8::1</li>
</ul>
</li>
<li>Zwei HTTP-Backend-Server mit den DNS-RR:
<ul>
<li>www1.example.com IN AAAA 2001:DB8::2</li>
<li>www2.example.com IN AAAA 2001:DB8::3</li>
</ul>
</li>
<li>Zwei DNS-RR:
<ul>
<li>www1.example.com IN A 203.0.113.1</li>
<li>www2.example.com IN A 203.0.113.1</li>
</ul>
</li>
<li>Ein Client mit einer IPv4-Adresse</li>
</ul>
<p>Ich habe mich für <a href="https://www.haproxy.org/">HAProxy</a> als Reverse-Proxy-Server entschieden, da dieser in allen Linux- und BSD-Distributionen verfügbar sein sollte und mir die <a href="https://www.haproxy.com/blog/introduction-to-haproxy-maps">HAProxy Maps</a> gefallen, welche ich hier ebenfalls vorstellen möchte.</p>
<p>Der Versuchsaufbau kann wie folgt skizziert werden:</p>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="" class="wp-image-3764" height="321" src="https://www.my-it-brain.de/wordpress/wp-content/uploads/2024/01/reverse-proxy-skizze.png" width="508" /><figcaption class="wp-element-caption">Ein Dualstack-Reverse-Proxy-Server (B) verbindet IPv4-Clients mit IPv6-Backend-Servern</figcaption></figure></div>
<h2 class="wp-block-heading">HAProxy-Konfiguration</h2>
<p>Für dieses Minimal-Beispiel besteht die HAProxy-Konfiguration aus zwei Dateien, der HAProxy Map <code>hosts.map</code> und der Konfigurationsdatei <code>poc.cfg</code>.</p>
<pre class="wp-block-code"><code>~]$ cat /etc/haproxy/conf.d/hosts.map
www1.example.com serversa
www2.example.com serversb</code></pre>
<p>Eine <a href="https://www.haproxy.com/blog/introduction-to-haproxy-maps">HAProxy Map</a> besteht aus zwei Spalten. In der ersten Spalte stehen die FQDNs, welche vom HTTP-Client aufgerufen werden können. In der zweiten Spalte steht der Name des Backends aus der HAProxy-Konfiguration, welcher bestimmt, an welche Backend-Server eine eingehende Anfrage weitergeleitet wird. In obigem Beispiel werden Anfragen nach <code>www1.example.com</code> an das Backend <code>serversa</code> und Anfragen nach <code>www2.example.com</code> an das Backend <code>serversb</code> weitergeleitet.</p>
<p>Die HAProxy Maps lassen sich unabhängig von der HAProxy-Konfigurations-Datei pflegen und bereitstellen. Map-Dateien werden in ein Elastic Binary Tree-Format geladen, so dass ein Wert aus einer Map-Datei mit Millionen von Elementen ohne spürbare Leistungseinbußen nachgeschlagen werden kann.</p>
<p>Die HAProxy-Konfigurations-Datei <code>poc.cfg</code> für dieses Minimal-Beispiel ist ähnlich simpel:</p>
<pre class="wp-block-code"><code>~]$ cat /etc/haproxy/conf.d/poc.cfg
frontend fe_main
bind :80
use_backend %[req.hdr(host),lower,map(/etc/haproxy/conf.d/hosts.map)]
backend serversa
server server1 2001:DB8::1:80
backend serversb
server server1 2001:DB8::2:80</code></pre>
<p>In der ersten Zeile wird ein Frontend mit Namen <code>fe_main</code> definiert. Zeile 2 bindet Port 80 für den entsprechenden Prozess und Zeile 3 bestimmt, welches Backend für eingehende HTTP-Anfragen zu nutzen ist. Dazu wird der HTTP-Host-Header ausgewertet, falls notwendig, in Kleinbuchstaben umgewandelt. Mithilfe der Datei <code>hosts.map</code> wird nun ermittelt, welches Backend zu verwenden ist.</p>
<p>Die weiteren Zeilen definieren zwei Backends bestehend aus jeweils einem Server, welcher auf Port 80 Anfragen entgegennimmt. In diesem Beispiel sind nur Server mit IPv6-Adressen eingetragen. IPv4-Adressen sind selbstverständlich auch zulässig und beide Versionen können in einem Backend auch gemischt auftreten.</p>
<p>Kann eine HTTP-Anfrage nicht über die <code>hosts.map</code> aufgelöst werden, läuft die Anfrage in diesem Beispiel in einen Fehler. Für diesen Fall kann ein Standard-Backend definiert werden. Siehe hierzu den englischsprachigen Artikel <a href="https://www.haproxy.com/blog/introduction-to-haproxy-maps">Introduction to HAProxy Maps</a> von <a href="https://www.haproxy.com/blog/author/clavoie">Chad Lavoie</a>.</p>
<h2 class="wp-block-heading">Der Kommunikationsablauf im Überblick und im Detail</h2>
<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="" class="wp-image-3767" height="494" src="https://www.my-it-brain.de/wordpress/wp-content/uploads/2024/01/dualstack-reverse-proxy-poc.png" width="508" /><figcaption class="wp-element-caption">Der Kommunikationsablauf im Überblick</figcaption></figure></div>
<p>Von einem IPv4-Client aus benutze ich <code>curl</code>, um die Seite <code>www1.example.com</code> abzurufen:</p>
<pre class="wp-block-code"><code>~]$ curl -4 -v http://www1.example.com
* processing: http://www1.example.com
* Trying 203.0.113.1:80...
* Connected to www1.example.com (203.0.113.1) port 80
> GET / HTTP/1.1
> Host: www1.example.com
> User-Agent: curl/8.2.1
> Accept: */*
>
< HTTP/1.1 200 OK
< server: nginx/1.20.1
< date: Sat, 06 Jan 2024 18:44:22 GMT
< content-type: text/html
< content-length: 5909
< last-modified: Mon, 09 Aug 2021 11:43:42 GMT
< etag: "611114ee-1715"
< accept-ranges: bytes
<
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title></code></pre>
<p>Der FQDN <code>www1.example.com</code> wird mit der IPv4-Adresse <code>203.0.113.1</code> aufgelöst, welche dem Host <code>haproxy.example.com</code> gehört. Bei der Zeile <code>Host: www1.example.com</code> handelt es sich um den HTTP-Host-Header, welchen der HAProxy benötigt, um das richtige Backend auszuwählen.</p>
<p>Es ist zu sehen, dass wir eine Antwort von einem NGINX-HTTP-Server erhalten. Der HTML-Quelltext wurde gekürzt.</p>
<p>Damit ist es gelungen, von einem IPv4-Client eine Ressource abzurufen, die von einem IPv6-Server bereitgestellt wird.</p>
<p>Im Access-Log des Backend-Servers mit der IPv6-Adresse <code>2001:DB8::2</code> sieht man:</p>
<pre class="wp-block-code"><code>2001:DB8::1 - - [06/Jan/2024:19:44:22 +0100] "GET / HTTP/1.1" 200 5909 "-" "curl/8.2.1" "192.0.2.1"</code></pre>
<p>Die Anfrage erreicht den Backend-Server von der IPv6-Adresse des <code>haproxy.example.com</code> (<code>2001:DB8::1</code>). Die am Ende der Zeile zu sehende IPv4-Adresse (<code>192.0.2.1</code>) gehört dem IPv4-Client, von dem ich die Anfrage gesendet habe.</p>
<h2 class="wp-block-heading">Gedanken zur Skalierung</h2>
<p>In diesem Beispiel sind die Server <code>www1.example.com</code> und <code>www2.example.com</code> über ihre IPv6-Adressen direkt erreichbar. Nur die Client-Anfragen von IPv4-Clients laufen über den Reverse-Proxy. Wenn man es wünscht, kann man selbstverständlich sämtliche Anfragen (von IPv4- und IPv6-Clients) über den Reverse-Proxy laufen lassen.</p>
<p>In kleinen Umgebungen kann man einen Reverse-Proxy wie HAProxy zusammen mit Squid (vgl. Artikel <a href="https://www.my-it-brain.de/wordpress/mit-einem-proxy-internet-protokolle-verbinden/">Mit einem Dualstack-Proxy Internet-Protokolle verbinden</a>) auf einem Host laufen lassen. Selbstverständlich kann man sie auch auf separate Hosts verteilen.</p>
<p>Hochverfügbarkeit lässt sich auch hier mit <a href="https://keepalived.org/">keepalived</a> nachrüsten:</p>
<ul>
<li><a href="https://www.ibm.com/docs/en/linux-on-z?topic=available-keepalived-haproxy">Keepalived and HAProxy</a> in IBM Documentation</li>
<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/load_balancer_administration/s2-lvs-keepalived-haproxy-vsa">Chapter 1.3. keepalived and haproxy</a> in RHEL 7 Documentation</li>
</ul>
<h2 class="wp-block-heading">Abschließende Gedanken</h2>
<p>Die Internet-Protokolle IPv4 und IPv6 werden wohl noch eine ganze Zeit gemeinsam das Internet bestimmen und parallel existieren. Ich bin mir sogar sicher, dass ich das Ende von IPv4 nicht mehr miterleben werde. Dualstack-(Reverse)-Proxy-Server stellen eine solide und robuste Lösung dar, um beide Welten miteinander zu verbinden.</p>
<p>Sicher bleiben noch ausreichend Herausforderungen übrig. Ich denke da nur an Firewalls, Loadbalancer, NAT und Routing. Und es werden sich auch Fälle finden lassen, in denen Proxyserver nicht infrage kommen. Doch mit diesen Herausforderungen beschäftige ich mich dann in anderen Artikeln.</p>
<h2 class="wp-block-heading">Quellen und weiterführende Links</h2>
<ul>
<li><a href="https://de.wikipedia.org/wiki/Domain_Name_System">https://de.wikipedia.org/wiki/Domain_Name_System</a></li>
<li><a href="https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol">https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol</a></li>
<li><a href="https://de.wikipedia.org/wiki/Host_(HTTP-Header-Feld)">https://de.wikipedia.org/wiki/Host_(HTTP-Header-Feld)</a></li>
<li><a href="https://de.wikipedia.org/wiki/Resource_Record">https://de.wikipedia.org/wiki/Resource_Record</a></li>
<li><a href="https://www.rfc-editor.org/rfc/rfc2606.html">https://www.rfc-editor.org/rfc/rfc2606.html</a></li>
<li><a href="https://www.rfc-editor.org/rfc/rfc3849.html">https://www.rfc-editor.org/rfc/rfc3849.html</a></li>
<li><a href="https://www.rfc-editor.org/rfc/rfc5737.html">https://www.rfc-editor.org/rfc/rfc5737.html</a></li>
<li><a href="https://www.haproxy.org/">https://www.haproxy.org/</a></li>
<li><a href="https://www.haproxy.com/blog/introduction-to-haproxy-maps">https://www.haproxy.com/blog/introduction-to-haproxy-maps</a></li>
<li><a href="https://keepalived.org/">https://keepalived.org/</a></li>
<li><a href="https://www.ibm.com/docs/en/linux-on-z?topic=available-keepalived-haproxy">Keepalived and HAProxy</a> in IBM Documentation</li>
<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/load_balancer_administration/s2-lvs-keepalived-haproxy-vsa">Chapter 1.3. keepalived and haproxy</a> in RHEL 7 Documentation</li>
</ul></div>Goto2024-02-25T16:21:57+01:002024-02-25T16:21:57+01:00yhaupenthal+feed@posteo.de (Y Haupenthal)https://uxg.ch/block/2024/02/25/goto/https://uxg.ch/block/2024/02/25/goto/<div><figure class="lb">
<a href="https://uxg.ch/block/2024/02/25/goto/sharp.jpg">
<img alt="Taschencomputer Sharp PC-1500A" class="" height="188" src="https://uxg.ch/block/2024/02/25/goto/sharp_hued5d04f273c991d79652430049404bc4_477173_250x250_fit_q90_h2_box.webp" width="250" />
</a>
<figcaption>Taschencomputer Sharp PC-1500A</figcaption>
</figure>
<p>Mit dem <del>Taschenrechner</del> <a href="https://de.wikipedia.org/wiki/Sharp_PC-1500">Taschencomputer Sharp PC-1500 <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> von
meinem Vater habe ich vor Dekaden (ca. 2) angefangen zu programmieren.
Ganz simpel in Basic. Haengen geblieben ist auf jeden Fall das “goto” *in
Nostalgie schwelg*</p>
<hr />
<p>Einen Weiterleitungsservice (bzw. <a href="https://de.wikipedia.org/wiki/Kurz-URL-Dienst">Kurz-URL-Dienst <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>) wie
<a href="https://de.wikipedia.org/wiki/Bitly">bitly <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> wollte ich schon lange selbst hosten. <a href="https://de.wikipedia.org/wiki/Open_Source">Open Source <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
Varianten <a href="https://github.com/738/awesome-url-shortener">gibt es ja einige <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>.</p>
<p>Aber warum noch eine weitere Software einsetzen, wenn es auch einfach™
mit <a href="https://gohugo.io">Hugo <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> geht, was ich <a href="https://uxg.ch/block/2022/02/18/v12.0.0/">sowieso schon nutze</a>?</p>
<p>Im Folgenden stelle ich 3 Varianten vor, einmal die native Version <a href="https://gohugo.io/content-management/urls/#aliases">mit
Aliases <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> (wenigster Aufwand, aber auch <strong>Voraussetzung</strong>
fuer die beiden anderen Varianten), dann via einem <a href="https://httpd.apache.org">Apache
Webserver <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> und <code>.htaccess</code>-Dateien (mittlerer Aufwand, Apache
muss natuerlich eingesetzt werden) und zuletzt via einem <a href="https://nginx.org">nginx
Webserver <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> und inkludierten Dateien (hoechster Aufwand, nginx
muss natuerlich eingesetzt werden).</p>
<h2 id="entry-text-65f94710aliases">Aliases <a href="https://uxg.ch/block/2024/02/25/goto/#aliases">#</a></h2>
<p>Das folgende ist abgeguckt von <a href="https://dannorth.net/hugo-redirects/">Dan North <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> (von dort kam auch die
Inspiration fuer das alles hier) und nutzt das Hugo <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/alias.html">Alias
Template <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>.</p>
<p>Im Prinzip nutze ich dafuer eine eigene <a href="https://gohugo.io/content-management/sections/">Sektion <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> unter
<code>content</code> namens <code>goto</code>.</p>
<p>Fuer <a href="https://uxg.ch/goto/">die goto-Uebersichtsseite</a> nutze ich dazu ein <code>list.html</code>
Template:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/goto/list.html</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f94710da89780a09732c562c54ab554c2500d2-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#da89780a09732c562c54ab554c2500d2-1">1</a>
</span><span class="lnt" id="entry-text-65f94710da89780a09732c562c54ab554c2500d2-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#da89780a09732c562c54ab554c2500d2-2">2</a>
</span><span class="lnt" id="entry-text-65f94710da89780a09732c562c54ab554c2500d2-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#da89780a09732c562c54ab554c2500d2-3">3</a>
</span><span class="lnt" id="entry-text-65f94710da89780a09732c562c54ab554c2500d2-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#da89780a09732c562c54ab554c2500d2-4">4</a>
</span><span class="lnt" id="entry-text-65f94710da89780a09732c562c54ab554c2500d2-5"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#da89780a09732c562c54ab554c2500d2-5">5</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">define</span> <span class="s">"main"</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="nx">partial</span> <span class="s">"title.html"</span> <span class="p">.</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="p">.</span><span class="nx">Content</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="nx">partial</span> <span class="s">"goto-list.html"</span> <span class="p">.</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span></span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p><code>title.html</code> enthaelt quasi nur die Ueberschrift und <code>.Content</code> den Text
auf dieser Uebersichtsseite. Spannend ist das Partial <code>goto-list.html</code>:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/partials/goto-list.html</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-1">1</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-2">2</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-3">3</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-4">4</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-5"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-5">5</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-6"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-6">6</a>
</span><span class="lnt" id="entry-text-65f947105bd54433ab89eb8d6d456be6bd83aa75-7"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#5bd54433ab89eb8d6d456be6bd83aa75-7">7</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p"><</span><span class="nx">ul</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">range</span> <span class="nx">where</span> <span class="p">.</span><span class="nx">Pages</span> <span class="s">"Params.public"</span> <span class="s">"eq"</span> <span class="kc">true</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="nx">li</span><span class="p">><</span><span class="nx">a</span> <span class="nx">href</span><span class="p">=</span><span class="s">"{{ .Permalink }}"</span><span class="p">>{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">File</span> <span class="p">}}{{</span> <span class="p">.</span><span class="nx">BaseFileName</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}<</span><span class="o">/</span><span class="nx">a</span><span class="p">></span> <span class="p">(</span><span class="nx">kurz</span> <span class="nx">fuer</span> <span class="o">&</span><span class="nx">bdquo</span><span class="p">;{{</span> <span class="p">.</span><span class="nx">Title</span> <span class="p">}}</span><span class="o">&</span><span class="nx">ldquo</span><span class="p">;)</span> <span class="nx">leitet</span> <span class="nx">weiter</span> <span class="nx">zu</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="nx">with</span> <span class="nx">print</span> <span class="s">"["</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">target</span> <span class="s">"]("</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">target</span> <span class="s">")"</span> <span class="p">}}{{</span> <span class="err">$</span><span class="p">.</span><span class="nx">Page</span><span class="p">.</span><span class="nx">RenderString</span> <span class="p">.</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="o">/</span><span class="nx">li</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="o">/</span><span class="nx">ul</span><span class="p">></span></span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>Hierdurch werden nur die Shortlinks in der Uebersicht angezeigt, die den
Parameter <code>public</code> auf <code>true</code> gesetzt haben. Eine
Beispieldatei ist z.B. diese hier, die <a href="https://uxg.ch/goto/">dann dort auch angezeigt
wird</a>:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> content/goto/ls.md</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f94710b12b73ac40436cc3888c797b9e4c342f-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#b12b73ac40436cc3888c797b9e4c342f-1">1</a>
</span><span class="lnt" id="entry-text-65f94710b12b73ac40436cc3888c797b9e4c342f-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#b12b73ac40436cc3888c797b9e4c342f-2">2</a>
</span><span class="lnt" id="entry-text-65f94710b12b73ac40436cc3888c797b9e4c342f-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#b12b73ac40436cc3888c797b9e4c342f-3">3</a>
</span><span class="lnt" id="entry-text-65f94710b12b73ac40436cc3888c797b9e4c342f-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#b12b73ac40436cc3888c797b9e4c342f-4">4</a>
</span><span class="lnt" id="entry-text-65f94710b12b73ac40436cc3888c797b9e4c342f-5"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#b12b73ac40436cc3888c797b9e4c342f-5">5</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-md"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: "Linkshrubbery"
</span></span><span class="line"><span class="cl">public: true
</span></span><span class="line"><span class="cl">target: https://ls.uxg.ch
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>Der Rest der Magic passiert dann auf der Detailseite, hier wird die
Markdowndatei via des <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/alias.html">Alias Templates <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> in eine kleine
HTML-Datei umgewandelt, die dann mit Hilfe von dem <a href="https://www.w3schools.com/tags/att_meta_http_equiv.asp"><code><meta> http-equiv</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> Attribut eine Weiterleitung auf das
<code>target</code> macht:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/goto/single.html</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f94710381a59a166e872dac5f07bd372bfd918-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#381a59a166e872dac5f07bd372bfd918-1">1</a>
</span><span class="lnt" id="entry-text-65f94710381a59a166e872dac5f07bd372bfd918-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#381a59a166e872dac5f07bd372bfd918-2">2</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="cm">/* https://dannorth.net/hugo-redirects/ */</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="nx">template</span> <span class="s">"_internal/alias.html"</span> <span class="p">(</span><span class="nx">dict</span> <span class="s">"Permalink"</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">target</span><span class="p">)</span> <span class="o">-</span><span class="p">}}</span></span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>Soweit so gut, dieses “Feature” nutze ich auch in vielen alten
Eintraegen, damit auch weiterhin Weiterleitungen funktionieren.</p>
<p>Leider hat das einen Nachteil, denn es ist keine “richtige”
Weiterleitung. Z.B. wird <a href="https://everything.curl.dev/http/redirects#html-redirects">curl es nicht als Weiterleitung
erkennen <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>, da der <a href="https://de.wikipedia.org/wiki/HTTP-Statuscode#3xx_%E2%80%93_Umleitung">Status-Code keine 3xy <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
ist.</p>
<h2 id="entry-text-65f94710apache">Apache <a href="https://uxg.ch/block/2024/02/25/goto/#apache">#</a></h2>
<p>Diese Variante habe ich mir von <a href="https://tilseiffert.de/posts/2211-hugo-htaccess/">Til Seiffert abgeguckt <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>. Dort wird
eine <a href="https://de.wikipedia.org/wiki/.htaccess"><code>.htaccess</code>-Datei <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> genutzt, um <strong>alle</strong> Hugo Aliases in
einer Datei zu sammeln und damit eine “richtige” und schnellere
Weiterleitung zu bekommen.</p>
<p>In meinem Anwendungsfall brauche ich das nicht fuer alle Aliases,
sondern eben nur fuer die in der Sektion <code>goto</code>, aber die Vorgehensweise
ist aehnlich.</p>
<p>Zur Nutzung muss die <a href="https://gohugo.io/getting-started/configuration/#configuration-file"><code>hugo.toml</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>, genauer <a href="https://gohugo.io/templates/output-formats/#customizing-output-formats">outputFormats <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
und <a href="https://gohugo.io/templates/output-formats/#media-types">mediaTypes <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> erweitert werden:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">outputFormats</span><span class="p">.</span><span class="nx">htaccess</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">baseName</span> <span class="p">=</span> <span class="s2">".htaccess"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">isPlainText</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mediaType</span> <span class="p">=</span> <span class="s2">"text/htaccess"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">notAlternative</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">mediaTypes</span><span class="p">.</span><span class="s2">"text/htaccess"</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">suffixes</span> <span class="p">=</span> <span class="s2">""</span>
</span></span></code></pre></div><p>Zudem muss noch im <a href="https://gohugo.io/content-management/front-matter/">Front matter <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> der <code>content/goto/_index.md</code>
festgelegt werden, dass fuer diese Sektion “html” und “htaccess”
ausgegeben werden soll, aber kein “rss”, was erstmal <a href="https://gohugo.io/templates/output-formats/#output-formats-for-pages">der Standard fuer
Sektionen <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> ist:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-md"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: "goto"
</span></span><span class="line"><span class="cl"><span class="gh"># no rss here please, but html and htaccess
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>outputs:
</span></span><span class="line"><span class="cl"><span class="k">-</span> html
</span></span><span class="line"><span class="cl"><span class="k">-</span> htaccess
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></div><p>Die eigentliche <code>.htaccess</code> fuer die Sektion <code>goto</code> sieht dann wie folgt
aus (hier wird eine <a href="https://gohugo.io/methods/page/file/">Hugo Page Methode namens File <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> genutzt):</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/goto/section.htaccess</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f947101e36c2cbb6716e96767cc7f1bd9ffffd-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#1e36c2cbb6716e96767cc7f1bd9ffffd-1">1</a>
</span><span class="lnt" id="entry-text-65f947101e36c2cbb6716e96767cc7f1bd9ffffd-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#1e36c2cbb6716e96767cc7f1bd9ffffd-2">2</a>
</span><span class="lnt" id="entry-text-65f947101e36c2cbb6716e96767cc7f1bd9ffffd-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#1e36c2cbb6716e96767cc7f1bd9ffffd-3">3</a>
</span><span class="lnt" id="entry-text-65f947101e36c2cbb6716e96767cc7f1bd9ffffd-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#1e36c2cbb6716e96767cc7f1bd9ffffd-4">4</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="nx">RewriteEngine</span> <span class="nx">On</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="k">range</span> <span class="p">.</span><span class="nx">Pages</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="nx">Redirect</span> <span class="mi">302</span> <span class="p">.</span><span class="o">/</span><span class="p">{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">File</span> <span class="p">}}{{</span> <span class="p">.</span><span class="nx">BaseFileName</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}(</span><span class="err">\</span><span class="o">/</span><span class="err">?</span><span class="p">)</span><span class="err">$</span> <span class="p">{{</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">target</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>Ich habe hier den <a href="https://de.wikipedia.org/wiki/HTTP-Statuscode#3xx_%E2%80%93_Umleitung">HTTP-Statuscode 302 <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> gewaehlt, da
sich die Ziele theoretisch aendern koennen (und nginx diesen Code auch
nutzt fuer die temporaere Weiterleitung). <a href="https://http.cat/status/307">307 <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> waere auch eine
Moeglichkeit.</p>
<p>Da ich nicht Apache als Webserver einsetze, kann ich nicht garantieren,
dass das auch alles so klappt. Aber mit der <code>.htaccess</code> in einem
Verzeichnis sollte™ das gehen. Wenn nicht, gerne <a href="https://uxg.ch/contact/">Bescheid
geben</a>.</p>
<h2 id="entry-text-65f94710nginx">nginx <a href="https://uxg.ch/block/2024/02/25/goto/#nginx">#</a></h2>
<p>Da ich als Webserver <a href="https://nginx.org"><code>nginx</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> einsetze und hierbei
die Nutzung von <a href="https://www.nginx.com/resources/wiki/start/topics/examples/likeapache-htaccess/">.htaccess-Dateien keine gute Idee <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> ist,
habe ich mir was anderes ueberlegt.</p>
<p>Die Vorgehensweise aehnelt hier sehr <a href="https://uxg.ch/tags/linux/rss.xml#apache">der
Apache-Variante</a>, denn auch hier muessen
<a href="https://gohugo.io/templates/output-formats/#customizing-output-formats">outputFormats <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> und <a href="https://gohugo.io/templates/output-formats/#media-types">mediaTypes <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> in der
<a href="https://gohugo.io/getting-started/configuration/#configuration-file"><code>hugo_toml</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> hinzugefuegt werden:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">outputFormats</span><span class="p">.</span><span class="nx">nginx</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">baseName</span> <span class="p">=</span> <span class="s2">"nginx"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">isPlainText</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mediaType</span> <span class="p">=</span> <span class="s2">"text/conf"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">notAlternative</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">mediaTypes</span><span class="p">.</span><span class="s2">"text/conf"</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="nx">suffixes</span> <span class="p">=</span> <span class="p">[</span><span class="s2">"conf"</span><span class="p">]</span>
</span></span></code></pre></div><p>Wie bei Apache auch wollen wir diese Datei ja nur in der Sektion <code>goto</code>
haben, daher tragen wir auch nur im <a href="https://gohugo.io/content-management/front-matter/">Front matter <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> der
<code>content/goto/_index.md</code> folgendes ein:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-md"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: "goto"
</span></span><span class="line"><span class="cl"><span class="gh"># no rss here please, but html, htaccess and nginx
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>outputs:
</span></span><span class="line"><span class="cl"><span class="k">-</span> html
</span></span><span class="line"><span class="cl"><span class="k">-</span> htaccess
</span></span><span class="line"><span class="cl"><span class="k">-</span> nginx
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></div><p>Und definieren zu guter Letzt noch eine nginx.conf
(<a href="https://nginx.org/en/docs/http/ngx_http_rewrite_module.html">Doku <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>):</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/goto/section.nginx.conf</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f947104773c3382b8063c137382185cfcfb752-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#4773c3382b8063c137382185cfcfb752-1">1</a>
</span><span class="lnt" id="entry-text-65f947104773c3382b8063c137382185cfcfb752-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#4773c3382b8063c137382185cfcfb752-2">2</a>
</span><span class="lnt" id="entry-text-65f947104773c3382b8063c137382185cfcfb752-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#4773c3382b8063c137382185cfcfb752-3">3</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="k">range</span> <span class="p">.</span><span class="nx">Pages</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="nx">rewrite</span> <span class="p">.</span><span class="o">/</span><span class="p">{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">File</span> <span class="p">}}{{</span> <span class="p">.</span><span class="nx">BaseFileName</span> <span class="p">}}{{</span> <span class="nx">end</span> <span class="p">}}(</span><span class="err">\</span><span class="o">/</span><span class="err">?</span><span class="p">)</span><span class="err">$</span> <span class="p">{{</span> <span class="p">.</span><span class="nx">Params</span><span class="p">.</span><span class="nx">target</span> <span class="p">}}</span> <span class="nx">redirect</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>So, jetzt wird es spannend. Wie bekommt <code>nginx</code> jetzt diese Regeln mit?
Eine <code>.htaccess</code> koennen wir ja nicht einsetzen.<br />
Aber wir koennen
<a href="https://serverfault.com/a/950861"><code>include</code> nutzen <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>! Das geht auch, wenn die Datei leer
ist, allerdings leider nicht, wenn die Datei nicht vorhanden
ist.</p>
<p>Entweder wird also der Ordner <code>goto</code> und eine leere <code>nginx.conf</code>
angelegt, oder wir passen die <code>nginx</code> Config erst an, wenn die Website mit
<a href="https://uxg.ch/block/2022/02/18/v12.0.0/">hugo gebaut wurde</a>.</p>
<p>Jedenfalls sieht meine <code>nginx</code> Config in etwa so aus:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-nginx"><span class="line"><span class="cl"><span class="k">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># [...]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kn">server_name</span> <span class="s">uxg.ch</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kn">include</span> <span class="s">/path/to/goto/nginx.conf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Nice!</p>
<h2 id="entry-text-65f94710weiteres">Weiteres <a href="https://uxg.ch/block/2024/02/25/goto/#weiteres">#</a></h2>
<p>Hier noch ein paar weitere Anpassungsmoeglichkeiten bzw. Ideen.</p>
<h3 id="entry-text-65f94710public-vs-private">Public vs. private <a href="https://uxg.ch/block/2024/02/25/goto/#public-vs-private">#</a></h3>
<p>Im Prinzip koennen auch alle Weiterleitungen oeffentlich sein, dann kann
sich der Aufwand mit dem Parameter “public” auch gespart werden.</p>
<p>Allerdings verwende ich den nun und muss sich daher auch drum kuemmern,
dass nicht aus Versehen was in den <a href="https://uxg.ch/feeds/">RSS Feeds</a>, der <a href="https://uxg.ch/sitemap/">Sitemap</a>
oder sonst wo auftaucht.</p>
<h4 id="entry-text-65f94710rss">RSS <a href="https://uxg.ch/block/2024/02/25/goto/#rss">#</a></h4>
<p>Fuer die Sektion <code>goto</code> habe ich ja im Front matter schon keine
RSS-Feeds erlaubt (und damit <a href="https://gohugo.io/templates/output-formats/#output-formats-for-pages">den Default
ueberschrieben <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>), siehe
<a href="https://uxg.ch/tags/linux/rss.xml#apache">Apache-Variante</a> bzw <a href="https://uxg.ch/tags/linux/rss.xml#nginx">nginx-Variante</a>.</p>
<h4 id="entry-text-65f94710sitemap">Sitemap <a href="https://uxg.ch/block/2024/02/25/goto/#sitemap">#</a></h4>
<p>Die <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/sitemap.xml">Standard <code>sitemap.xml</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> habe ich sowieso schon
angepasst, falls ich Seiten habe, die ich mit dem Parameter “exclude”
eben nicht in der Sitemap haben will (siehe
<a href="https://github.com/gohugoio/hugo/issues/653">GitHub Issue #653 <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> dazu). Fuer die Sektion <code>goto</code> kam
dann noch ein Zusatz dazu.</p>
<p>Komplett sieht das dann so aus:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/_default/sitemap.xml</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-1"> 1</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-2"> 2</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-3"> 3</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-4"> 4</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-5"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-5"> 5</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-6"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-6"> 6</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-7"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-7"> 7</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-8"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-8"> 8</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-9"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-9"> 9</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-10"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-10">10</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-11"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-11">11</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-12"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-12">12</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-13"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-13">13</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-14"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-14">14</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-15"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-15">15</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-16"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-16">16</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-17"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-17">17</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-18"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-18">18</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-19"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-19">19</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-20"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-20">20</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-21"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-21">21</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-22"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-22">22</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-23"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-23">23</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-24"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-24">24</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-25"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-25">25</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-26"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-26">26</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-27"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-27">27</a>
</span><span class="lnt" id="entry-text-65f94710ba9282e0a5c0d9d8c50131b9af33d08e-28"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#ba9282e0a5c0d9d8c50131b9af33d08e-28">28</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="cm">/* https://github.com/gohugoio/hugo/issues/653 */</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="cm">/* https://gohugo.io/templates/sitemap-template/#hugos-sitemapxml */</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span><span class="o">-</span> <span class="cm">/* https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/sitemap.xml */</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p">{{</span> <span class="nx">printf</span> <span class="s">"<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>"</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="nx">urlset</span> <span class="nx">xmlns</span><span class="p">=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">xmlns</span><span class="p">:</span><span class="nx">xhtml</span><span class="p">=</span><span class="s">"http://www.w3.org/1999/xhtml"</span><span class="p">></span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="err">$</span><span class="nx">excluded</span> <span class="o">:=</span> <span class="nx">where</span> <span class="p">.</span><span class="nx">Data</span><span class="p">.</span><span class="nx">Pages</span> <span class="s">".Params.exclude"</span> <span class="s">"!="</span> <span class="kc">true</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="k">range</span> <span class="nx">where</span> <span class="err">$</span><span class="nx">excluded</span> <span class="s">"Section"</span> <span class="s">"ne"</span> <span class="s">"goto"</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span><span class="o">-</span> <span class="k">if</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">url</span><span class="p">></span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">loc</span><span class="p">>{{</span> <span class="p">.</span><span class="nx">Permalink</span> <span class="p">}}<</span><span class="o">/</span><span class="nx">loc</span><span class="p">>{{</span> <span class="k">if</span> <span class="nx">not</span> <span class="p">.</span><span class="nx">Lastmod</span><span class="p">.</span><span class="nx">IsZero</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">lastmod</span><span class="p">>{{</span> <span class="nf">safeHTML</span> <span class="p">(</span> <span class="p">.</span><span class="nx">Lastmod</span><span class="p">.</span><span class="nx">Format</span> <span class="s">"2006-01-02T15:04:05-07:00"</span> <span class="p">)</span> <span class="p">}}<</span><span class="o">/</span><span class="nx">lastmod</span><span class="p">>{{</span> <span class="nx">end</span> <span class="p">}}{{</span> <span class="nx">with</span> <span class="p">.</span><span class="nx">Sitemap</span><span class="p">.</span><span class="nx">ChangeFreq</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">changefreq</span><span class="p">>{{</span> <span class="p">.</span> <span class="p">}}<</span><span class="o">/</span><span class="nx">changefreq</span><span class="p">>{{</span> <span class="nx">end</span> <span class="p">}}{{</span> <span class="k">if</span> <span class="nx">ge</span> <span class="p">.</span><span class="nx">Sitemap</span><span class="p">.</span><span class="nx">Priority</span> <span class="mf">0.0</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">priority</span><span class="p">>{{</span> <span class="p">.</span><span class="nx">Sitemap</span><span class="p">.</span><span class="nx">Priority</span> <span class="p">}}<</span><span class="o">/</span><span class="nx">priority</span><span class="p">>{{</span> <span class="nx">end</span> <span class="p">}}{{</span> <span class="k">if</span> <span class="p">.</span><span class="nx">IsTranslated</span> <span class="p">}}{{</span> <span class="k">range</span> <span class="p">.</span><span class="nx">Translations</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">xhtml</span><span class="p">:</span><span class="nx">link</span>
</span></span><span class="line"><span class="cl"> <span class="nx">rel</span><span class="p">=</span><span class="s">"alternate"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hreflang</span><span class="p">=</span><span class="s">"{{ .Language.LanguageCode }}"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">href</span><span class="p">=</span><span class="s">"{{ .Permalink }}"</span>
</span></span><span class="line"><span class="cl"> <span class="o">/</span><span class="p">>{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="nx">xhtml</span><span class="p">:</span><span class="nx">link</span>
</span></span><span class="line"><span class="cl"> <span class="nx">rel</span><span class="p">=</span><span class="s">"alternate"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hreflang</span><span class="p">=</span><span class="s">"{{ .Language.LanguageCode }}"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">href</span><span class="p">=</span><span class="s">"{{ .Permalink }}"</span>
</span></span><span class="line"><span class="cl"> <span class="o">/</span><span class="p">>{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p"><</span><span class="o">/</span><span class="nx">url</span><span class="p">></span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span><span class="o">-</span> <span class="nx">end</span> <span class="o">-</span><span class="p">}}</span>
</span></span><span class="line"><span class="cl"> <span class="p">{{</span> <span class="nx">end</span> <span class="p">}}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="o">/</span><span class="nx">urlset</span><span class="p">></span>
</span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<h3 id="entry-text-65f94710cleanup">Cleanup <a href="https://uxg.ch/block/2024/02/25/goto/#cleanup">#</a></h3>
<p>Theoretisch brauchen wir mit Einsatz von Apache oder nginx die
Alias-Dateien nicht mehr, also koennte die Datei
<code>layouts/goto/single.html</code> auch geloescht werden.</p>
<h3 id="entry-text-65f94710anonym-weiterleiten">“Anonym” weiterleiten <a href="https://uxg.ch/block/2024/02/25/goto/#anonym-weiterleiten">#</a></h3>
<p>Um “anonym”, also ohne <a href="https://de.wikipedia.org/wiki/Referrer">Referrer <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> auf andere Websites weiterzuleiten
(auch <a href="https://de.wikipedia.org/wiki/Referrer#Dereferrer">Dereferrer <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> genannt), kann das <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#integration_with_html"><code><meta> name</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
Attribut genutzt werden.</p>
<p>Fuer ein Codebeispiel siehe <a href="https://github.com/AdguardTeam/AnonymousRedirect/blob/master/redirect.html#L9">redirect.html#L9 <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> oder
diesen <code>curl</code>-Aufruf:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">$ curl -L <span class="s2">"https://url.scriptsez.net?https://uxg.ch"</span>
</span></span><span class="line"><span class="cl"><html><head><meta <span class="nv">name</span><span class="o">=</span><span class="s2">"referrer"</span> <span class="nv">content</span><span class="o">=</span><span class="s2">"no-referrer"</span> /><meta http-equiv<span class="o">=</span>refresh <span class="nv">content</span><span class="o">=</span><span class="s2">"0;url='https://uxg.ch'"</span>></head></html>
</span></span></code></pre></div><p>Entweder kann also im Prinzip das <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/alias.html">Alias-Template <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> um
diese Zeile erweitert werden oder im Webserver der <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#no-referrer">entsprechende
Parameter <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> gesetzt werden.</p>
<h3 id="entry-text-65f94710qr-code">QR-Code <a href="https://uxg.ch/block/2024/02/25/goto/#qr-code">#</a></h3>
<p>Als kleine™ Spielerei koennte jetzt noch an jeden “goto” ein <a href="https://de.wikipedia.org/wiki/QR-Code">QR-Code <i class="fa-solid fa-up-right-from-square fa-sm"></i></a>
dran geklebt werden. Z.B. koennte neben der nginx Datei auch noch fuer
jeden Link eine Textdatei erstellt werden, die den Link enthaelt. Ein
Script koennte dann vor dem Bauen der Website mit <code>hugo</code> via <code>find</code>
ueber all diese Textdateien drueberlaufen und mit einem Text-QR-Code
ersetzen, die dann z.B. mit <a href="https://gohugo.io/functions/os/readfile/"><code>readfile</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> eingebunden
werden.</p>
<p>Ja, richtig gelesen, QR-Codes muessen nicht unbedingt Bilder sein,
sondern koennen auch aus Text bestehen. <a href="https://fukuchi.org/works/qrencode/"><code>qrencode</code> <i class="fa-solid fa-up-right-from-square fa-sm"></i></a> bringt
sowas auch schon mit:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">qrencode -t UTF8i <span class="s2">"https://uxg.ch"</span> <span class="p">|</span> sed <span class="s1">'s/[ \t]*$//;/^$/d'</span>
</span></span></code></pre></div><p>Ein kleiner Shortcode dazu:</p>
<div class="gist"><p><i class="fa-solid fa-file-lines"></i> layouts/shortcodes/qr-code.html</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tbody><tr><td class="lntd">
<pre class="chroma" tabindex="0"><code><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-1"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-1">1</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-2"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-2">2</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-3"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-3">3</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-4"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-4">4</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-5"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-5">5</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-6"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-6">6</a>
</span><span class="lnt" id="entry-text-65f9471013472d7b1a54dcfca52326bce7450d48-7"><a class="lnlinks" href="https://uxg.ch/tags/linux/rss.xml#13472d7b1a54dcfca52326bce7450d48-7">7</a>
</span></code></pre></td>
<td class="lntd">
<pre class="chroma" tabindex="0"><code class="language-go"><span class="line"><span class="cl"><span class="p"><</span><span class="nx">style</span><span class="p">></span>
</span></span><span class="line"><span class="cl"> <span class="p">.</span><span class="nx">qr</span><span class="o">-</span><span class="nx">code</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">font</span><span class="o">-</span><span class="nx">family</span><span class="p">:</span> <span class="nx">monospace</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">line</span><span class="o">-</span><span class="nx">height</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="o">/</span><span class="nx">style</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="p"><</span><span class="nx">pre</span> <span class="nx">class</span><span class="p">=</span><span class="s">"qr-code"</span><span class="p">>{{</span><span class="o">-</span> <span class="p">.</span><span class="nx">Inner</span> <span class="p">|</span> <span class="nx">safeHTML</span> <span class="o">-</span><span class="p">}}<</span><span class="o">/</span><span class="nx">pre</span><span class="p">></span></span></span></code></pre></td></tr></tbody></table>
</div>
</div></div>
<p>Und damit sieht das ganze dann so aus:</p>
<pre class="qr-code"> █▀▀▀▀▀█ █▀█▀ █▀▀▀▀▀█
█ ███ █ ▄█▄▄ █ ███ █
█ ▀▀▀ █ ▀ █ █ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀▄█ █ ▀▀▀▀▀▀▀
▀█▄▄ ▀▀▀ ▀ ▄ ▀█▄▄
▀█▄▄▀ ▀▀█▄██▀█▀█▄▄█▀
▀ ▀ ▀▀▄▀ ▀▀▄ ▄▄▄▀▄
█▀▀▀▀▀█ ██▀▀▀█▄▀ ▄█▀
█ ███ █ █▀▀ ▀███▀▄▀▀
█ ▀▀▀ █ ▄▀▄█▀█▀████▀▀
▀▀▀▀▀▀▀ ▀ ▀▀ ▀▀ ▀ ▀
</pre>
<p>Geil! Ausgelesen werden koennen diese z.B. mit einer meiner
Lieblings-Android-Apps: <a href="https://github.com/markusfisch/BinaryEye">Binary Eye <i class="fa-solid fa-up-right-from-square fa-sm"></i></a></p></div>Zeichen setzen – auf den Chemnitzer Linux-Tagen 20242024-02-24T06:00:00+01:002024-02-24T06:00:00+01:00Jörg Kastninghttps://www.my-it-brain.de/wordpress/zeichen-setzen-auf-den-chemnitzer-linux-tagen-2024/https://www.my-it-brain.de/wordpress/?p=3797<div><p>In drei Wochen beginnen die <a href="https://chemnitzer.linux-tage.de/2024/de/">Chemnitzer Linux-Tage 2024</a> mit dem diesjährigen Motto „Zeichen setzen“. Am 16. und 17. März erwartet euch im Hörsaalgebäude an der Richenhainer Straße 90 ein vielfältiges Programm an <a href="https://chemnitzer.linux-tage.de/2024/de/programm/vortraege">Vorträgen</a> und <a href="https://chemnitzer.linux-tage.de/2024/de/programm/workshops">Workshops</a>. Hier finden sich Vorträge für interessierte Neueinsteiger wie für alte Hasen.</p>
<p>So geht es am Samstag im Einsteigerforum beispielsweise um die Digitalisierung analoger Fotos, das Erstellen von Urlaubsvideos mit der Software OpenShot oder die Verschlüsselung von E-Mails. In der Rubrik „Schule“ gibt Arto Teräs einen Einblick in den Einsatz der Open-Source-Lösung Puavo an finnischen und deutschen Schulen. Zusätzlich stehen Vorträge aus den Bereichen Finanzen, Medien, Datensicherheit, KI oder Netzwerk auf dem Programm. Am Sonntag gibt das Organisationsteam der Chemnitzer Linux-Tage mit „make CLT“ Einblicke in die Planung und Strukturen der Veranstaltung selbst. In der Rubrik „Soft Skills” wird es um die Schätzung von Aufwänden oder notwendige Fähigkeiten von Software-Entwicklern gehen.</p>
<p>Eintrittskarten können <a href="https://tickets2024.linux-tage.de/">online im Vorverkauf</a> und an der <a href="https://chemnitzer.linux-tage.de/2024/de/info/eintritt">Tageskasse</a> erworben werden. Kinder bis 12 Jahren haben freien Eintritt.</p>
<p>Während viele Besucher bereits Stammgäste sind, werden auch neue Gesichter herzlich willkommen. Lasst euch gern von der hier herrschenden Atmosphäre voller Begeisterung für <a href="https://www.my-it-brain.de/wordpress/freie-software-und-open-source/">freie Software</a> und Technik anstecken und begeistern.</p>
<p>Ich selbst freue mich, am Samstag um 10:00 Uhr in V6 den Vortrag mit dem obskuren Namen <a href="https://chemnitzer.linux-tage.de/2024/de/programm/beitrag/243">::1</a> beisteuern zu dürfen. <em>Update:</em> Unverhofft kommt oft. Uns so freue ich mich am Sonntag um 10:00 Uhr in Raum V7 noch in einem zweiten Vortrag vertreten zu sein. Zusammen mit Michael Decker von der <a href="https://www.aspicon.de/">ASPICON GmbH</a> erfahrt ihr, wie man „<a href="https://chemnitzer.linux-tage.de/2024/de/programm/beitrag/178">Mit Ansible Collections & Workflows gegen das Playbook-Chaos</a>“ angehen kann.</p>
<p>Darüber hinaus beteilige ich mich als Sessionleiter für die folgenden drei Vorträge an der Veranstaltung:</p>
<ul>
<li><a href="https://chemnitzer.linux-tage.de/2024/de/programm/beitrag/252">Never ever break userspace – was das in der Praxis bedeutet</a></li>
<li><a href="https://chemnitzer.linux-tage.de/2024/de/programm/beitrag/288">DIY Verified Boot in 2024</a></li>
<li><a href="https://chemnitzer.linux-tage.de/2024/de/programm/beitrag/148">VirtualBox Meets KVM</a></li>
</ul>
<p>So habe ich auf jeden Fall einen Platz im Raum sicher. ;-)</p>
<p>Wer ebenfalls helfen möchte, kann sich unter <a href="https://chemnitzer.linux-tage.de/2024/de/info/mitmachen">Mitmachen!</a> informieren und melden.</p>
<p>Für mich ist dieses Jahr einiges im Programm dabei. Doch freue ich mich ebenso sehr auf ein Wiedersehen mit alten Bekannten aus der Gemeinschaft und darauf, neue Gesichter (Namen kann ich mir meist erst Jahre später merken) kennenzulernen.</p>
<p>Also bis bald in der <a href="https://de.wikipedia.org/wiki/Chemnitz">Karl-Marx-Stadt</a>.</p>
<figure class="wp-block-image size-large"><img alt="Chemnitzer Linux-Tage Banner" src="https://chemnitzer.linux-tage.de/2024/media/presse/banner/468x120.png" /></figure></div>