<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Subutux</title><link>https://blog.subutux.be/posts/</link><description>Recent content in Posts on Subutux</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>&lt;a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener">CC BY-NC 4.0&lt;/a></copyright><lastBuildDate>Wed, 08 Jun 2022 22:06:32 +0200</lastBuildDate><atom:link href="https://blog.subutux.be/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Dell Xps 15 9510</title><link>https://blog.subutux.be/posts/2022/06/dell-xps-15-9510/</link><pubDate>Wed, 08 Jun 2022 22:06:32 +0200</pubDate><guid>https://blog.subutux.be/posts/2022/06/dell-xps-15-9510/</guid><description>Setup Connect iwctl device list station &amp;lt;device&amp;gt; scan station &amp;lt;device&amp;gt; get-networks station &amp;lt;device connect &amp;lt;SSID&amp;gt; ping google.com Date and Time timedatectl set-ntp true timedatectl status Set timezone
ln -sf /usr/share/zoneinfo/Europe/Brussels /etc/localtime Sync the hardware clock
date hwclock --systohc Disk Format the disk with gdisk, creating 2 partitions:
p1: 1GB / EFI p2: Rest / Linux Crypt Formatting Create the EFI Fs
mkfs.fat -F 32 -n EFI /dev/nvme0n1p1 Crypt cryptsetup luksFormat /dev/nvme0n1p2 cryptsetup open /dev/nvme0n1p2 arch lsblk Btrfs mkfs.</description><content type="html"><![CDATA[<h1 id="setup">Setup</h1>
<h2 id="connect">Connect</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>iwctl
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>device list
</span></span><span style="display:flex;"><span>station &lt;device&gt; scan
</span></span><span style="display:flex;"><span>station &lt;device&gt; get-networks
</span></span><span style="display:flex;"><span>station &lt;device connect &lt;SSID&gt;
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>ping google.com
</span></span></code></pre></div><h2 id="date-and-time">Date and Time</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>timedatectl set-ntp true
</span></span><span style="display:flex;"><span>timedatectl status
</span></span></code></pre></div><p>Set timezone</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>ln -sf /usr/share/zoneinfo/Europe/Brussels /etc/localtime
</span></span></code></pre></div><p>Sync the hardware clock</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>date
</span></span><span style="display:flex;"><span>hwclock --systohc
</span></span></code></pre></div><h2 id="disk">Disk</h2>
<p>Format the disk with gdisk, creating 2 partitions:</p>
<ul>
<li><strong>p1</strong>: 1GB / EFI</li>
<li><strong>p2</strong>: Rest / Linux Crypt</li>
</ul>
<h3 id="formatting">Formatting</h3>
<p>Create the EFI Fs</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>mkfs.fat -F <span style="color:#ae81ff">32</span> -n EFI /dev/nvme0n1p1
</span></span></code></pre></div><h4 id="crypt">Crypt</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>cryptsetup luksFormat /dev/nvme0n1p2
</span></span><span style="display:flex;"><span>cryptsetup open /dev/nvme0n1p2 arch
</span></span><span style="display:flex;"><span>lsblk
</span></span></code></pre></div><h4 id="btrfs">Btrfs</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>mkfs.btrfs /dev/mapper/arch
</span></span><span style="display:flex;"><span>mount /dev/mapper/arch /mnt
</span></span><span style="display:flex;"><span>ls /mnt
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@home
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@var
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@swap
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@pacman
</span></span><span style="display:flex;"><span>btrfs  subvolume create /mnt/@vms
</span></span><span style="display:flex;"><span>umount /mnt
</span></span></code></pre></div><p>Mount the subvolumes to their respective places</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>mount -o noatime,compress<span style="color:#f92672">=</span>zstd,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@ /dev/mapper/arch /mnt
</span></span><span style="display:flex;"><span>mkdir /mnt/<span style="color:#f92672">{</span>boot,home,var,swap,var/cache/pacman/pkg,vms,swap<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>mkdir -p /mnt/<span style="color:#f92672">{</span>boot,home,var,swap,vms,swap<span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>mount -o noatime,compress<span style="color:#f92672">=</span>zstd,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@home /dev/mapper/arch /mnt/home
</span></span><span style="display:flex;"><span>mount -o noatime,compress<span style="color:#f92672">=</span>zstd,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@var /dev/mapper/arch /mnt/var
</span></span><span style="display:flex;"><span>mkdir -p /mnt/var/cache/pacman/pkg
</span></span><span style="display:flex;"><span>mount -o noatime,compress<span style="color:#f92672">=</span>zstd,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@pacman /dev/mapper/arch /mnt/var/cache/pacman/pkg
</span></span><span style="display:flex;"><span>mount -o noatime,nodatacow,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@vms /dev/mapper/arch /mnt/vms
</span></span><span style="display:flex;"><span>mount -o noatime,compress<span style="color:#f92672">=</span>zstd,ssd,discard<span style="color:#f92672">=</span>async,space_cache<span style="color:#f92672">=</span>v2,subvol<span style="color:#f92672">=</span>@swap /dev/mapper/arch /mnt/swap
</span></span><span style="display:flex;"><span>mount /dev/nvme0n1p1 /mnt/boot
</span></span></code></pre></div><h1 id="install-the-base-system">Install the base system</h1>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>pacstrap /mnt base linux linux-firmware git vim btrfs-progs
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>genfstab -U /mnt &gt;&gt; /mnt/etc/fstab
</span></span></code></pre></div><blockquote>
<p><strong>Tip</strong>: Now is a good time to backup your history file back onto the USB you&rsquo;ve booted with. This prevents you form manually re-entering all the mount commands again in case you do need to boot again from the install media. Just copy the <code>history.txt</code> file back to <code>/root/.zsh_history</code> and open a new tty with <!-- raw HTML omitted -->Alt+Left<!-- raw HTML omitted --></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span> mkdir /usb
</span></span><span style="display:flex;"><span> mount /dev/sda1 /usb
</span></span><span style="display:flex;"><span> cp .zsh_history /usb/history.txt
</span></span></code></pre></div></blockquote>
<h1 id="chroot">Chroot!</h1>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>arch-chroot /mnt
</span></span></code></pre></div>]]></content></item><item><title>Mosquitto Bridge With Ssl</title><link>https://blog.subutux.be/posts/2022/01/mosquitto-bridge-with-ssl/</link><pubDate>Sun, 16 Jan 2022 21:34:43 +0100</pubDate><guid>https://blog.subutux.be/posts/2022/01/mosquitto-bridge-with-ssl/</guid><description>Recently one of my homeservers went haywire with a constant load of +- 80 in 1/5/15. Unrelated to this, buit it seems there is an issue with my local vaultwarden instance.
But this got me thinking. What if my local mqtt server goes down..
I am running a local mosquitto server on my OpenWRT router (A Mikrotik 750Gr3) to support my growing love for home automation. Normally this should be quite stable, but I had issues with OpenWRT in the past.</description><content type="html"><![CDATA[<p>Recently one of my homeservers went haywire with a constant load of
+- 80 in 1/5/15.
Unrelated to this, buit it seems there is an issue with my local vaultwarden
instance.</p>
<p>But this got me thinking. What if my local mqtt server goes down..</p>
<p>I am running a local mosquitto server on my OpenWRT router
(A <a href="/buy/network#mikrotik-rb750gr3">Mikrotik 750Gr3</a>) to support my growing love for home
automation. Normally this should be quite stable, but I had issues with
OpenWRT in the past. Won&rsquo;t it be nice to have a bridge as backup, so in the
event that my mqtt server acts up, I can switch to that one, without losing any
data.</p>
<h2 id="setting-up-an-mqtt-server">Setting up an MQTT server</h2>
<p>Using your favourite package manager, you can install mosquitto, an mqtt server.</p>
<p>Because this server will be running on a separate network, SSL is a must.
Setting this up with LetsEncrypt and DNS auth is quite easy.</p>
<h3 id="certificates">Certificates</h3>
<p>I Already have a dns challenge setup for other domains, so reusing this. Maybe I&rsquo;ll document this in the future.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>certbot certonly --preferred-challenges dns --authenticator dns-hetzner --dns-hetzner-credentials /etc/letsencrypt/hetzner.ini -d mqtt.server.domain
</span></span></code></pre></div><h3 id="configuration">Configuration</h3>
<p>I like to keep my configurations quite clean. Luckly, Mosquitto supports splitting up the confgiration files by setting the configuration parameter <code>include_dir</code> and point it to a sensable path, like <code>/etc/mosquitto/conf.d/</code>.</p>
<p>Then, I created 3 files in that directory:</p>
<ul>
<li>0-security.conf</li>
<li>10-listener-localhost.conf</li>
<li>20-listener-public-mqtt.server.domain-ssl.conf</li>
</ul>
<p>Where <code>0-security.conf</code> contains the configured security and authentication
sections, disallowing anonymous access and specifing the password file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#75715e"># =================================================================</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Security</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># =================================================================</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># If set, only clients that have a matching prefix on their</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># clientid will be allowed to connect to the broker. By default,</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># all clients may connect.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># For example, setting &#34;secure-&#34; here would mean a client &#34;secure-</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># client&#34; could connect but another with clientid &#34;mqtt&#34; couldn&#39;t.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#clientid_prefixes</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Boolean value that determines whether clients that connect</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># without providing a username are allowed to connect. If set to</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># false then a password file should be created (see the</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># password_file option) to control authenticated client access.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Defaults to true if no other security options are set. If `password_file` or</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># `psk_file` is set, or if an authentication plugin is loaded which implements</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># username/password or TLS-PSK checks, then `allow_anonymous` defaults to</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># false.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#allow_anonymous true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">allow_anonymous false</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -----------------------------------------------------------------</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Default authentication and topic access control</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># -----------------------------------------------------------------</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Control access to the broker using a password file. This file can be</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># generated using the mosquitto_passwd utility. If TLS support is not compiled</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># into mosquitto (it is recommended that TLS support should be included) then</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># plain text passwords are used, in which case the file should be a text file</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># with lines in the format:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># username:password</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># The password (and colon) may be omitted if desired, although this</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># offers very little in the way of security.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># See the TLS client require_certificate and use_identity_as_username options</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># for alternative authentication options. If an auth_plugin is used as well as</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># password_file, the auth_plugin check will be made first.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#password_file</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">password_file /etc/mosquitto/passwd</span>
</span></span></code></pre></div><p><code>10-listener-localhost.conf</code> contains a localhost listener, handy for debugging:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#a6e22e">listener 1883 localhost</span>
</span></span></code></pre></div><p>and at last <code>20-listener-public-mqtt.server.domain-ssl.conf</code> containting the
public listener, with ssl configured:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#a6e22e">listener 1883</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">protocol mqtt</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">certfile /etc/letsencrypt/live/mqtt.server.domain/cert.pem</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">cafile /etc/letsencrypt/live/mqtt.server.domain/chain.pem</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">keyfile /etc/letsencrypt/live/mqtt.server.domain/privkey.pem</span>
</span></span></code></pre></div><p>So far, so good.</p>
<p>Let&rsquo;s quickly configure the <code>renew_hook</code> for certbot to give mosquitto a kick when the cert is renewed:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;renew_hook = systemctl restart mosquitto&#34;</span> &gt;&gt; /etc/letsencrypt/renewal/mqtt.server.domain.conf
</span></span></code></pre></div><h2 id="bridging">Bridging</h2>
<p>Now, we need to configure the local mosquitto on my router to bridge with the
remote one.</p>
<p>I&rsquo;m using the LuCi configuration page here to setup the bridge which generates
the following configuration file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#75715e"># mosquitto.conf file generated from UCI config.</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">log_dest syslog</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">port 1883</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">listener 1888</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">protocol mqtt</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Bridge connection from UCI section</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">connection mqtt.subutux.be</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">address mqtt.server.domain:1883</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">notifications true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">remote_password long-password-here</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">remote_username username</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">start_type automatic</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">topic # out 2</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">try_private true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">bridge_capath /etc/ssl/certs # This one is important</span>
</span></span></code></pre></div><p>First, I didn&rsquo;t know that <strong>mosquitto only initiates an ssl connection if you specify <code>bridge_cafile</code> or <code>bridge_capath</code></strong> <a href="https://mosquitto.org/man/mosquitto-conf-5.html">man page</a>.</p>
<p>So i point <code>bridge_capath</code> to my router&rsquo;s global certificate store.</p>
<p>But, I kept receiving log messages signalling that there is still something wrong. My lets encrypt certificate doesn&rsquo;t seem to be validated. 😕</p>
<p>Looking into <code>/etc/ssl/certs</code> it only contained one certificate.
After installing the package <code>ca-certificates</code> in OpenWRT, The connection became
active and and all my mqtt topics where (one-way) synchronized!</p>
]]></content></item></channel></rss>