<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vitalii Yulieff</title>
    <description>The latest articles on DEV Community by Vitalii Yulieff (@yulieff).</description>
    <link>https://dev.to/yulieff</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1759757%2Fd02af7fe-6847-489c-9a5a-f2d98bd79024.jpg</url>
      <title>DEV Community: Vitalii Yulieff</title>
      <link>https://dev.to/yulieff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yulieff"/>
    <language>en</language>
    <item>
      <title>How to run Tailscale and Mullvad together on Manjaro Linux</title>
      <dc:creator>Vitalii Yulieff</dc:creator>
      <pubDate>Fri, 29 May 2026 13:17:58 +0000</pubDate>
      <link>https://dev.to/yulieff/how-to-run-tailscale-and-mullvad-together-on-manjaro-linux-25ke</link>
      <guid>https://dev.to/yulieff/how-to-run-tailscale-and-mullvad-together-on-manjaro-linux-25ke</guid>
      <description>&lt;p&gt;You want Mullvad privacy and Tailscale remote access on one Linux machine. By default they conflict. This guide makes them run together.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem 🤔
&lt;/h2&gt;

&lt;p&gt;Both tools change how your machine routes traffic.&lt;/p&gt;

&lt;p&gt;Mullvad sends all traffic through a VPN and adds a kill switch. Tailscale builds a private network between your devices. Run both on one machine and they conflict.&lt;/p&gt;

&lt;p&gt;The first symptom: &lt;code&gt;tailscale up&lt;/code&gt; hangs. No error. No login link. No output.&lt;/p&gt;

&lt;p&gt;The kill switch causes this. Mullvad's firewall drops any packet without the Mullvad mark (&lt;code&gt;0x6d6f6c65&lt;/code&gt;). The Tailscale daemon sends first packets without the mark, so the firewall drops them. The daemon never reaches the Tailscale control server, so login never starts.&lt;/p&gt;

&lt;p&gt;A second problem hits IPv6. Mullvad removes the IPv6 default route. IPv6 attempts fail with &lt;code&gt;network is unreachable&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: mullvad-exclude 🔧
&lt;/h2&gt;

&lt;p&gt;You do not disable the kill switch. You add an exception.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mullvad-exclude&lt;/code&gt; is Mullvad's split-tunnel tool. Run a program under &lt;code&gt;mullvad-exclude&lt;/code&gt; and Mullvad tags the traffic with the mark. The traffic leaves the machine. Everything else stays inside the VPN.&lt;/p&gt;

&lt;p&gt;Run the Tailscale daemon under &lt;code&gt;mullvad-exclude&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mullvad-exclude tailscaled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Make the Fix Survive Reboots ♻️
&lt;/h2&gt;

&lt;p&gt;A typed command dies on reboot. systemd restarts &lt;code&gt;tailscaled&lt;/code&gt; from the unit file and drops your wrapper.&lt;/p&gt;

&lt;p&gt;Add a systemd drop-in at &lt;code&gt;/etc/systemd/system/tailscaled.service.d/override.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight systemd"&gt;&lt;code&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="nt"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;mullvad-daemon.service
&lt;span class="nt"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;mullvad-daemon.service

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="nt"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;/usr/bin/mullvad-exclude /usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload and restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tailscaled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two lines do the work.&lt;/p&gt;

&lt;p&gt;First, the empty &lt;code&gt;ExecStart=&lt;/code&gt; line. A service holds one &lt;code&gt;ExecStart&lt;/code&gt;. To replace the original, clear the original with an empty line, then set your own. Skip the empty line and the service fails to start.&lt;/p&gt;

&lt;p&gt;Second, &lt;code&gt;After=&lt;/code&gt; and &lt;code&gt;Wants=mullvad-daemon.service&lt;/code&gt;. These set boot order. If &lt;code&gt;tailscaled&lt;/code&gt; starts before the Mullvad daemon, &lt;code&gt;mullvad-exclude&lt;/code&gt; finds no daemon and Tailscale fails again. The failure shows only after a reboot. These two lines start Mullvad first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DNS Gotcha 🌐
&lt;/h2&gt;

&lt;p&gt;After &lt;code&gt;tailscale up&lt;/code&gt;, your internet looks dead. Pages do not load.&lt;/p&gt;

&lt;p&gt;The firewall is not the cause here. DNS is. Tailscale MagicDNS took over the system resolver. Normal lookups break with &lt;code&gt;Temporary failure in name resolution&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Refuse MagicDNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up &lt;span class="nt"&gt;--accept-dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sets &lt;code&gt;CorpDNS=false&lt;/code&gt; in your saved preferences. The setting holds across reboots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote Login with Tailscale SSH 🔑
&lt;/h2&gt;

&lt;p&gt;Now add remote login.&lt;/p&gt;

&lt;p&gt;Skip OpenSSH. Tailscale ships SSH built in. No open port 22. No password file. Access uses your Tailscale identity and ACLs.&lt;/p&gt;

&lt;p&gt;Enable Tailscale SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tailscale &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--ssh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This saves &lt;code&gt;RunSSH=true&lt;/code&gt; and holds across reboots.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;tailscale set&lt;/code&gt; for changes, not &lt;code&gt;tailscale up&lt;/code&gt;. &lt;code&gt;tailscale up&lt;/code&gt; resets any flag you omit. &lt;code&gt;tailscale set&lt;/code&gt; changes only the flags you name. So &lt;code&gt;tailscale set&lt;/code&gt; keeps &lt;code&gt;--ssh&lt;/code&gt; and &lt;code&gt;--accept-dns=false&lt;/code&gt; safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Self-SSH Limit 🕵️
&lt;/h2&gt;

&lt;p&gt;Tailscale SSH from a host to the same host fails.&lt;/p&gt;

&lt;p&gt;The traffic crosses the WireGuard tunnel. A node does not route to the same node. Test from a different device. A &lt;code&gt;connection refused&lt;/code&gt; from the same machine is expected, not a fault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify After Reboot ✅
&lt;/h2&gt;

&lt;p&gt;Confirm the setup survives a restart.&lt;/p&gt;

&lt;p&gt;Six checks pass when the setup works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tailscaled&lt;/code&gt; is active&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tailscaled&lt;/code&gt; runs under &lt;code&gt;mullvad-exclude&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the tailnet is up&lt;/li&gt;
&lt;li&gt;SSH is enabled&lt;/li&gt;
&lt;li&gt;normal DNS resolves&lt;/li&gt;
&lt;li&gt;normal traffic exits through Mullvad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One script runs all six:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env sh&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"== tailscale + mullvad coexistence check =="&lt;/span&gt;

systemctl is-active &lt;span class="nt"&gt;--quiet&lt;/span&gt; tailscaled &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  tailscaled active"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  tailscaled not active"&lt;/span&gt;

systemctl show tailscaled &lt;span class="nt"&gt;-p&lt;/span&gt; ExecStart | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; mullvad-exclude &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  running under mullvad-exclude"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  not under mullvad-exclude"&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;tailscale status &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; tailscale status 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qi&lt;/span&gt; &lt;span class="s2"&gt;"logged out"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  tailnet up (logged in)"&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  tailnet down / logged out"&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;tailscale debug prefs 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'"RunSSH": true'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  tailscale SSH enabled"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  SSH pref off"&lt;/span&gt;

getent hosts google.com &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  normal DNS works"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  DNS broken"&lt;/span&gt;

curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; &lt;span class="nt"&gt;--max-time&lt;/span&gt; 8 https://am.i.mullvad.net/connected 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qi&lt;/span&gt; &lt;span class="s2"&gt;"connected to Mullvad"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PASS  normal traffic via Mullvad"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAIL  not protected by Mullvad"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot. Run the script. Six PASS lines confirm the setup.&lt;/p&gt;

&lt;p&gt;🏆 Done. Mullvad protects your normal traffic. Tailscale reaches your devices and serves SSH. The setup holds across restarts.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>vpn</category>
      <category>networking</category>
      <category>tailscale</category>
    </item>
    <item>
      <title>Fixing Ollama Installation on Manjaro + NVIDIA</title>
      <dc:creator>Vitalii Yulieff</dc:creator>
      <pubDate>Thu, 11 Jul 2024 11:54:12 +0000</pubDate>
      <link>https://dev.to/yulieff/fixing-ollama-installation-on-manjaro-nvidia-2hdk</link>
      <guid>https://dev.to/yulieff/fixing-ollama-installation-on-manjaro-nvidia-2hdk</guid>
      <description>&lt;p&gt;The current Ollama version in Arch is outdated (&lt;code&gt;0.1.44&lt;/code&gt; vs &lt;code&gt;0.2.1&lt;/code&gt; latest). The official install script doesn't support some Manjaro configurations, but don't worry—I've got the fix!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem 🤔
&lt;/h2&gt;

&lt;p&gt;When I tried running the install script, I got hit with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;span class="c"&gt;# sh: line 252: VERSION_ID: unbound variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This cryptic error just means you're missing those NVIDIA drivers, and Ollama can't sort that out for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Fix 🏌️
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;step 1&lt;/strong&gt;: find your linux kernel verion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;span class="c"&gt;# 6.9.5-1-MANJARO&lt;/span&gt;
pamac search &lt;span class="s2"&gt;"linux.*header"&lt;/span&gt;
&lt;span class="c"&gt;# linux69-headers  6.9.5-1 [Installed]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;step 2&lt;/strong&gt; install everything you need&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pamac &lt;span class="nb"&gt;install &lt;/span&gt;nvidia nvidia-utils cuda linux69-headers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;step 3&lt;/strong&gt; you might want to restart your Linux just to be on the safe side&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 4&lt;/strong&gt;  Now, run the install script again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;span class="c"&gt;# ollama successfully installs on your Manjaro system!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🏆 Boom! Done!&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting  🕵️‍♂️
&lt;/h2&gt;

&lt;p&gt;Here's how you can check the successful installation:&lt;/p&gt;

&lt;p&gt;1) Run &lt;code&gt;nvidia-smi&lt;/code&gt; and your video card should show up.&lt;br&gt;
2) Make sure that your video card and its device ID are in the OLLAMA's logs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ollama | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"id=.*NVIDIA"&lt;/span&gt;
&lt;span class="c"&gt;# ollama[2174]: [...] id=GPU-3a31a7cb-e46b-458c-9a92-ea9708b0c7fa library=cuda compute=8.9 driver=12.4 name="NVIDIA GeForce RTX 4090 Laptop GPU" total="15.7 GiB" available="15.5 GiB"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Note for Wayland + GNOME Users
&lt;/h2&gt;

&lt;p&gt;Even after I installed drivers, my Wayland still uses integrated video graphics.&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>manjaro</category>
      <category>nvidia</category>
    </item>
  </channel>
</rss>
