💾 Archived View for perso.pw › blog › rss.xml captured on 2022-01-08 at 14:09:39.

View Raw

More Information

⬅️ Previous capture (2021-12-17)

➡️ Next capture (2022-03-01)

🚧 View Differences

-=-=-=-=-=-=-

<?xml version="1.0" encoding="UTF-8"?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Solene'%</title>
    <description></description>
    <link>gemini://perso.pw/blog/</link>
    <atom:link href="gemini://perso.pw/blog/rss.xml" rel="self" type="application/rss+xml" />
    <item>
  <title>My plans for 2022</title>
  <description>
    <![CDATA[
<pre>Greetings dear readers, I wish you a happy new year and all the best.  Like I did previously at the new year time, although it's not a yearly exercise, I would like to talk about the blog and my plan for the next twelve months.

# About me

Let's talk about me first, it will make sense for the blog part after.  I plan to find a new job, maybe switch into the cybersecurity field or work in some position allowing me to contribute to an open source project, it's not that easy to find, but I have hope.

This year, I will work at getting new skills, this should help me find jobs, but I also think I've been a resting  a bit about learning over the last two years.  My plan is to dedicate 45 minutes every day to learn about a topic.  I already started doing so with some security and D language readings.

# About the blog

With regular learning time, I'm not sure yet if I will have much desire to write here as often as I did in 2021.  I'm absolutely sure the publication rate will drop, but I will try to maintain a minimum, because I'm learning I will want to share some ideas, experiences or knowledge hopefuly.

I'm thanksful to readers community I have, I often get feedback by email or IRC or mastodon about my posts, so I can fix them, extend them or rework them if I was wrong.  This is invaluable to me, it helps me to make connections to other people, and it's what make life interesting.

# Podcast

In December 2021, I had the chance to be interviewed by the people of the BSDNow podcast, I'm talking about how I got into open source, about my blog but also about the old laptop challenge I made last year.

=> https://www.bsdnow.tv/435 Access to the podcast link on BSDNow


Thanks everyone! Let's have fun with computers!</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/2022-new-year.gmi</guid>
  <link>gemini://perso.pw/blog//articles/2022-new-year.gmi</link>
  <pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate>
</item>
<item>
  <title>My NixOS configuration</title>
  <description>
    <![CDATA[
<pre># Introduction

Let me share my NixOS configuration file, the one in /etc/nixos/configuration.nix that describe what is installed on my Lenovo T470 laptop.

The base of NixOS is that you declare every user, services, network and system settings in a file, and finally it configures itself to match your expectations.  You can also install global packages and per-user packages.  It makes a system environment reproducible and reliable.

# The file

{ config, pkgs, ... }:

{

imports =

[ # Include the results of the hardware scan.

./hardware-configuration.nix

];

# run garbage collector at 19h00 everyday

# and remove stuff older than 60 days

nix.gc.automatic = true;

nix.gc.dates = "19:00";

nix.gc.persistent = true;

nix.gc.options = "--delete-older-than 60d";

# clean /tmp at boot

boot.cleanTmpDir = true;

# allow non free stuff

nixpkgs.config.allowUnfree = true;

# Use the systemd-boot EFI boot loader.

boot.loader.systemd-boot.enable = true;

boot.loader.efi.canTouchEfiVariables = true;

networking.hostName = "t470";

time.timeZone = "Europe/Paris";

networking.networkmanager.enable = true;

# wireguard VPN

networking.wireguard.interfaces = {

wg0 = {

ips = [ "192.168.5.1/24" ];

listenPort = 1234;

privateKeyFile = "/root/wg-private";

peers = [

{ # server

publicKey = "MY PUB KEY";

endpoint = "SERVER:PORT";

allowedIPs = [ "192.168.5.0/24" ];

}];

};

};

# azerty keyboard <3

i18n.defaultLocale = "fr_FR.UTF-8";

console = {

# font = "Lat2-Terminus16";

keyMap = "fr";

};

# nvidia prime offload rendering for eGPU

hardware.nvidia.modesetting.enable = true;

hardware.nvidia.prime.sync.allowExternalGpu = true;

hardware.nvidia.prime.offload.enable = true;

hardware.nvidia.prime.nvidiaBusId = "PCI:10:0:0";

hardware.nvidia.prime.intelBusId = "PCI:0:2:0";

services.xserver.videoDrivers = ["nvidia" ];

# programs

programs.steam.enable = true;

programs.firejail.enable = true;

programs.fish.enable = true;

programs.gamemode.enable = true;

programs.ssh.startAgent = true;

# services

services.acpid.enable = true;

services.thermald.enable = true;

services.fwupd.enable = true;

services.vnstat.enable = true;

# Enable the X11 windowing system.

services.xserver.enable = true;

services.xserver.displayManager.sddm.enable = true;

services.xserver.desktopManager.plasma5.enable = true;

services.xserver.desktopManager.xfce.enable = false;

services.xserver.desktopManager.gnome.enable = false;

# Configure keymap in X11

services.xserver.layout = "fr";

services.xserver.xkbOptions = "eurosign:e";

# Enable sound.

sound.enable = true;

hardware.pulseaudio.enable = true;

# Enable touchpad support

services.xserver.libinput.enable = true;

users.users.solene = {

isNormalUser = true;

shell = pkgs.fish;

packages = with pkgs; [

firefox gajim audacity chromium dmd dtools

kate kdeltachat pavucontrol rclone rclone-browser

zim claws-mail mpv musikcube git-annex

];

extraGroups = [ "wheel" "sudo" "networkmanager" ];

};

# my gaming users running steam/lutris/emulators

users.users.gaming = {

isNormalUser = true;

shell = pkgs.fish;

extraGroups = [ "networkmanager" "video" ];

packages = with pkgs; [ lutris firefox ];

};

users.users.aria = {

isNormalUser = true;

shell = pkgs.fish;

packages = with pkgs; [ aria2 ];

};

# global packages

environment.systemPackages = with pkgs; [

ncdu kakoune git rsync restic tmux fzf

];

# Enable the OpenSSH daemon.

services.openssh.enable = true;

# Open ports in the firewall.

networking.firewall.enable = true;

networking.firewall.allowedTCPPorts = [ 22 ];

networking.firewall.allowedUDPPorts = [ ];

# user aria can only use tun0

networking.firewall.extraCommands = "

iptables -A OUTPUT -o lo -m owner --uid-owner 1002 -j ACCEPT

iptables -A OUTPUT -o tun0 -m owner --uid-owner 1002 -j ACCEPT

iptables -A OUTPUT -m owner --uid-owner 1002 -j REJECT

";

# This value determines the NixOS release from which the default

# settings for stateful data, like file locations and database versions

# on your system were taken. It‘s perfectly fine and recommended to leave

# this value at the release version of the first install of this system.

# Before changing this value read the documentation for this option

# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).

system.stateVersion = "21.11"; # Did you read the comment?

}

</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/my-nixos.gmi</guid>
  <link>gemini://perso.pw/blog//articles/my-nixos.gmi</link>
  <pubDate>Tue, 21 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Restrict users to a network interface on Linux</title>
  <description>
    <![CDATA[
<pre># Introduction

If for some reasons you want to prevent a system user to use network interfaces except one, it's doable with a couple of iptables commands.

The use case would be to force your user to go through a VPN and make sure it can't reach the Internet if the VPN is not available.

=> https://linux.die.net/man/8/iptables iptables man page

# Iptables

We can use simple rules using the "owner" module, basically, we will allow traffic through tun0 interface (the VPN) for the user, and reject traffic for any other interface.

Iptables is applying first matching rule, so if traffic is going through tun0, it's allowed and otherwise rejected.  This is quite simple and reliable.

We will need the user id (uid) of the user we want to restrict, this can be found as third field of /etc/passwd or by running "id the_user".

iptables -A OUTPUT -o lo -m owner --uid-owner 1002 -j ACCEPT

iptables -A OUTPUT -o tun0 -m owner --uid-owner 1002 -j ACCEPT

iptables -A OUTPUT -m owner --uid-owner 1002 -j REJECT


Note that instead of --uid-owner it's possible to use --gid-owner with a group ID if you want to make this rule for a whole group.

To make the rules persistent across reboots, please check your Linux distribution documentation.

# Going further

I trust firewall rules to do what we expect from them.  Some userland programs may be able to restrict the traffic, but we can't know for sure if it's truly blocking or not.  With iptables, once you made sure the rules are persistent, you have a guarantee that the traffic will be blocked.

There may be better ways to achieve the same restrictions, if you know one that is NOT complex, please share!
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/linux-forbid-user-except-vpn.gmi</guid>
  <link>gemini://perso.pw/blog//articles/linux-forbid-user-except-vpn.gmi</link>
  <pubDate>Mon, 20 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Playing video games on Linux</title>
  <description>
    <![CDATA[
<pre># Introduction

While I mostly make posts about playing on OpenBSD, I also do play video games on Linux.  There is a lot more choice, but it comes with the price that the choice comes from various sources with pros and cons.

# Commercial stores

There are a few websites where you can get games:

## itch.io

Itch.io is dedicated to indie games, you can find many games running on Linux, most games there are free.  Most games could be considered "amateurish" but it's a nice pool from which some gems get out like Celeste, Among Us or Noita.

=> https://itch.io/ itch.io website

## Steam

It is certainly the biggest commercial platform, it requires the steam desktop Client and an account to be useful.  You can find many free-to-play video games, (including some open source games like OpenTTD or Wesnoth who are now available on Steam for free) but also paid games.  Steam is working hard on their tool to make Windows games running on Linux (based on Wine + many improvements on the graphic stack).  The library manager allows Linux games filtering if you want to search native games.  Steam is really a big DRM platform, but it also works well.

=> https://store.steampowered.com/ Steam website

## GOG

GOG is a webstore selling video games (many old games from people's childhood but not only), they only require you to have an account.  When you buy a game in their store, you have to download the installer, so you can keep/save it, without any DRM beyond the account registration on their website to buy games.

=> https://www.gog.com/ GOG website

## Your packager manager / flatpak

There are many open source video games around, they may be available in your package manager, allowing a painless installation and maintenance.

Flatpak package manager also provides video games, some are recent and complex games that are not found in many package managers because of the huge work required.

=> https://flathub.org/apps/collection/editors-choice-games flathub flatpak repository, games page

## Developer's website

Sometimes, when you want to buy a game, you can buy it directly on the developer's website, it usually comes without any DRM and doesn't rely on a third party vendor.  I know I did it for Rimworld, but some other developers offer this "service", it's quite rare though.

## Epic game store

They do not care about Linux.

# Streaming services

It's now possible to play remotely through "cloud computing", using a company's computer with a good graphic card.  There are solutions like Nvidia with Geforce Now or Stadia from Google, both should work in a web browser like Chromium.

They require a very decent Internet access with at least 15 MB/s of download speed for a 1080p stream but will work almost anywhere.

# How to manage games

Let me describe a few programs that can be used to manage games libraries.

## Steam

As said earlier, Steam has its own mandatory desktop client to buy/install/manage games.

## Lutris

Lutris is an ambitious open source project, it aims to be a game library manager allowing to mix any kind of game: emulation / Steam / GOG / Itch.io / Epic game Store (through Wine) / Native linux games etc...

Its website is a place where people can send recipes for installing some games that could be complicated, allowing to automate and distribute in the community ways to install some games.  But it makes very easy to install games from GOG.  There is a recent feature to handle the Epic game store, but it's currently not really enjoyable and the launcher itself running through wine draw for CPU like madness.

It has nice features such as activating a HUD for displaying FPS, automatically run "gamemode" (disabling screen effects, doing some optimization), easy offloading rendering to graphic card, set locale or switch to qwerty per game etc...

It's really a nice project that I follow closely, it's very useful as a Linux gamer.

=> https://lutris.net/ lutris project website

## Minigalaxy

Minigalaxy is a GUI to manage GOG games, installing them locally with one click, keeping them updated or installing DLC with one click too.  It's really simplistic compared to Lutris, but it's made as a simple client to manage GOG games which is perfectly fine.

Minigalaxy can update games while Lutris can't, both can be used on the same installed video games.  I find these two are complementary.

=> https://sharkwouter.github.io/minigalaxy/ Minigalaxy project website

## play.it

This tool is a set of script to help you install native Linux video games in your system, depending on their running method (open source engine, installer, emulator etc...).

=> https://www.dotslashplay.it/en/start play.it official website

# Conclusion

It has never been so easy to play video games on Linux.  Of course, you have to decide if you want to run closed sources programs or not.  Even if some games are closed sources, some fans may have developed a compatible open source engine from scratch to play it again natively given you have access to the "assets" (sets of files required for the game which are not part of the engine, like textures, sounds, databases).

=> https://en.wikipedia.org/wiki/List_of_game_engine_recreations List of game engine recreation (Wikipedia EN)
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/playing-on-linux.gmi</guid>
  <link>gemini://perso.pw/blog//articles/playing-on-linux.gmi</link>
  <pubDate>Sun, 19 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>OpenVPN on OpenBSD in its own rdomain to prevent data leak</title>
  <description>
    <![CDATA[
<pre># Introduction

Today I will explain how to establish an OpenVPN tunnel through a dedicated rdomain to only expose the VPN tunnel as an available interface, preventing data leak outside the VPN (and may induce privacy issues).  I did the same recently for WireGuard tunnels, but it had an integrated mechanism for this.

Let's reuse the network diagram from the WireGuard text to explain:

+-------------+

| server | tun0 remote peer

| |---------------+

+-------------+ |

| public IP |

| 1.2.3.4 |

| |

| |

/\/\/\/\/\/\/\ |OpenVPN

| internet | |VPN

\/\/\/\/\/\/\/ |

| |

| |

|rdomain 1 |

+-------------+ |

| computer |---------------+

+-------------+ tun0

rdomain 0 (default)


We have our computer and have been provided an OpenVPN configuration file, we want to establish the OpenVPN toward the server 1.2.3.4 using rdomain 1.  We will set our network interfaces into rdomain 1 so when the VPN is NOT up, we won't be able to connect to the Internet (without the VPN).

# Network configuration

Add "rdomain 1" to your network interfaces configuration file like "/etc/hostname.trunk0" if you use a trunk interface to aggregate Ethernet/Wi-Fi interfaces into an automatic fail over trunk, or in each interface you are supposed to use regularly.  I suppose this setup is mostly interesting for wireless users.

Create a "/etc/hostname.tun0" file that will be used to prepare the tun0 interface for OpenVPN, add "rdomain 0" to the file, this will be enough to create the tun0 interface at startup. (Note that the keyword "up" would work too, but if you edit your files I find it easier to understand the rdomains of each interface).

Run "sh /etc/netstart" as root to apply changes done to the files, you should have your network interfaces in rdomain 1 now.

# OpenVPN configuration

From here, I assume your OpenVPN configuration works.  The OpenVPN client/server setup is out of the scope of this text.

We will use rcctl to ensure openvpn service is enabled (if it's already enabled this is not an issue), then we will configure it to use rtable 1 to run, this mean it will connect through the interfaces in the rdomain 1.

If your OpenVPN configuration runs a script to set up the route(s) (through "up /etc/something..." directive in the configuration file), you will have to by add parameter -T0 to the command route in the script.  This is important because openvpn will run in rdomain 1 so calls to "route" will apply to routing table 1, so you must change the route command to apply the changes in routing table 0.

rcctl enable openvpn

rcctl set openvpn rtable 1

rcctl restart openvpn


Now, you should have your tun0 interface in rdomain 0, being the default route and the other interfaces in rdomain 1.

If you run any network program it will go through the VPN, if the VPN is down, the programs won't connect to the Internet (which is the wanted behavior here).

# Conclusion

The rdomain and routing tables concepts are powerful tools, but they are not always easy to grasp, especially in a context of a VPN mixing both (one for connectivity and one for the tunnel).  People using VPN certainly want to prevent their programs to not go through the VPN and this setup is absolutely effective in that task.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-openvpn-exit.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-openvpn-exit.gmi</link>
  <pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Persistency management of memory based filesystem on OpenBSD</title>
  <description>
    <![CDATA[
<pre># Introduction

For saving my SSD and also speeding up my system, I store some cache files into memory using the mfs filesystem on OpenBSD.  But that would be nice to save the content upon shutdown and restore it at start, wouldn't it?

I found that storing the web browser cache in a memory filesystem drastically improve its responsiveness, but it's hard to make measurements of it.

Let's do that with a simple rc.d script.

# Configuration

First, I use a mfs filesystem for my Firefox cache, here is the line in /etc/fstab

/dev/sd3b /home/solene/.cache/mozilla mfs rw,-s400M,noatime,nosuid,nodev 1 0


This mean I have a 400 MB partition using system memory, it's super fast but limited.  tmpfs is disabled in the default kernel because it may have issues and is not well enough maintained, so I stick with mfs which is available out of the box. (tmpfs is faster and only use memory when storing file, while mfs reserves the memory chunk at first).

# The script

We will write /etc/rc.d/persistency with the following content, this is a simple script that will store as a tgz file under /var/persistency every mfs mountpoint found in /etc/fstab when it receives the "stop" command.  It will also restore the files at the right place when receiving the "start" command.


!/bin/ksh

STORAGE=/var/persistency/

if [[ "$1" == "start" ]]

then

install -d -m 700 $STORAGE

for mountpoint in $(awk '/ mfs / { print $2 }' /etc/fstab)

do

tar_name="$(echo ${mountpoint#/} | sed 's,/,_,g').tgz"

tar_path="${STORAGE}/${tar_name}"

test -f ${tar_path}

if [ $? -eq 0 ]

then

cd $mountpoint

if [ $? -eq 0 ]

then

tar xzfp ${tar_path} && rm ${tar_path}

fi

fi

done

fi

if [[ "$1" == "stop" ]]

then

install -d -m 700 $STORAGE

for mountpoint in $(awk '/ mfs / { print $2 }' /etc/fstab)

do

tar_name="$(echo ${mountpoint#/} | sed 's,/,_,g').tgz"

cd $mountpoint

if [ $? -eq 0 ]

then

tar czf ${STORAGE}/${tar_name} .

fi

done

fi


All we need to do now is to use "rcctl enable persistency" so it will be run with start/stop at boot/shutdown times.

# Conclusion

Now I'll be able to carry my Firefox cache across reboots while keeping it in mfs.


</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-mfs-persistency.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-mfs-persistency.gmi</link>
  <pubDate>Wed, 15 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>What are the VPN available on OpenBSD</title>
  <description>
    <![CDATA[
<pre># Introduction

I wanted to write this text for some time, a list of VPN with encryption that can be used on OpenBSD.  I really don't plan to write about all of them but I thought it was important to show the choices available when you want to create a VPN between two peers/sites.

# VPN

VPN is an acronym for Virtual Private Network, is the concept of creating a network relying on a virtual layer like IP to connect computers, while regular network use physical network layer like Ethernet cable, wifi or light.

There are different VPN implementation existing, some are old, some are new.  They have pros and cons because they were done for various purpose.  This is a list of VPN protocols supported by OpenBSD (using base or packages).

## OpenVPN

Certainly the most known, it's free and open source and is widespread.

Pros:


Cons:


## WireGuard

A recent VPN protocol joined the party with an interesting approach.  It's supported by OpenBSD base system using ifconfig.

Pros:


Cons:


=> https://man.openbsd.org/ifconfig#WIREGUARD OpenBSD ifconfig man page anchored to WireGuard section
=> https://man.openbsd.org/wg#EXAMPLES Examples of wg interfaces setup

## SSH

SSH is known for being a secure way to access a remote shell but it can also be used to create a VPN with a tun interface.  This is not the best VPN solution available but at least it doesn't require much software and could be enough for some users.

Pros:


Cons:


## mlvpn

mlvpn is a software to aggregate links through VPN technology

Pros:


Cons:


## IPsec

IPSec is handled with iked in base system or using strongswan from ports.  This is the most used VPN protocol, it's reliable.

Pros:


Cons:


=> https://www.openbsd.org/faq/faq17.html OpenBSD FAQ about VPN

## Tinc

Meshed VPN that works without a central server, this is meant to be robust and reliable even if some peers are down.

Pros:


Cons:


Note that Tailscale is a solution to create something similar using WireGuard.

## Dsvpn

Pros:


Cons:


## Openconnect

I never heard of it before, I found it in the ports tree while writing this text.  There is openconnect package to act as a client and ocserv to act as a server.

Pros:


Cons:


## gre

gre is a special device on OpenBSD to create VPN without encryption, it's recommended to use it over IPSec.  I don't cover it more because I was emphasing on VPN with encryption.

=> https://man.openbsd.org/gre gre interface man page

# Conclusion

If you never used a VPN, I'd say OpenVPN is a good choice, it's versatile and it can easily bypass restrictions if you run it on port TCP/443.

I personnaly use WireGuard on my phone to reach my emails, because of WireGuard stateless protocol the VPN doesn't draw battery to maintain the connection and doesn't have to renogicate every time the phone gets Internet access.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-vpn.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-vpn.gmi</link>
  <pubDate>Sat, 11 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Port of the week: cozy</title>
  <description>
    <![CDATA[
<pre># Introduction

The Port of the week of this end of 2021 is Cozy a GTK audio book player.  There are currently not much alternative outside of audio players if you want to listen to audio books.

=> https://cozy.sh/ Cozy project website

# How to install

On OpenBSD I imported cozy in December 2021 so it will be available from OpenBSD 7.1 or now in -current, a simple "pkg_add cozy" is required to install.

On Linux, there is a flatpak package if your distribution doesn't provide a package.

# Features

Cozy provides a few features making it more interesting than a regular music player:



=> static/potw-cozy.png Screenshot of Cozy ready to play an audio book
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/potw-cozy.gmi</guid>
  <link>gemini://perso.pw/blog//articles/potw-cozy.gmi</link>
  <pubDate>Thu, 09 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Nvidia card in eGPU and NixOS</title>
  <description>
    <![CDATA[
<pre># Updates



# Introduction

I previously wrote about using an eGPU on Gentoo Linux.  It was working when using the eGPU display but I never got it to work for accelerating games using the laptop display.

Now, I'm back on NixOS and I got it to work!

# What is it about?

My laptop has a thunderbolt connector and I'm using a Razer Core X external GPU case that is connected to the laptop using a thunderbolt cable.  This allows to use an external "real" GPU on a laptop but it has performance trade off and on Linux also compatibility issues.

There are three ways to use the nvidia eGPU:

- run the nvidia driver and use it as a normal card with its own display connected to the GPU, not always practical with a laptop
- use optirun / primerun to run programs within a virtual X server on that GPU and then display it on the X server (very clunky, originally created for Nvidia Optimus laptop)
- use Nvidia offloading module (it seems recent and I learned about it very recently)

The first case is easy, just install nvidia driver and use the right card, it should work on any setup.  This is the setup giving best performance.

The most complicated setup is to use the eGPU to render what's displayed on the laptop, meaning the video signal has to come back from the thunderbolt cable, reducing the bandwidth.

# Nvidia offloading

Nvidia made work in their proprietary driver to allow a program to have its OpenGL/Vulkan calls to be done in a GPU that is not the one used for the display.  This allows to throw optirun/primerun for this use case, which is good because they added performance penalty, complicated setup and many problems.

=> https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/primerenderoffload.html Official documentation about offloading with nvidia driver


# NixOS

I really love NixOS and for writing articles it's so awesome, because instead of a set of instructions depending on conditions, I only have to share the piece of config required.

This is the bits to add to your /etc/nixos/configuration.nix file and then rebuild system:

hardware.nvidia.modesetting.enable = true;

hardware.nvidia.prime.sync.allowExternalGpu = true;

hardware.nvidia.prime.offload.enable = true;

hardware.nvidia.prime.nvidiaBusId = "PCI:10:0:0";

hardware.nvidia.prime.intelBusId = "PCI:0:2:0";

services.xserver.videoDrivers = ["nvidia" ];


A few notes about the previous chunk of config:
- only add nvidia to the list of video drivers, at first I was adding modesetting but this was creating troubles
- the PCI bus ID can be found with lspci, it has to be translated in decimal, here my nvidia id is 10:0:0 but in lspci it's 0a:00:00 with 0a being 10 in hexadecimal

=> https://nixos.wiki/wiki/Nvidia#offload_mode NixOS wiki about nvidia offload mode

# How to use it

The use of offloading is controlled by environment variables.  What's pretty cool is that if you didn't connect the eGPU, it will still work (with integrated GPU).

## Running a command

We can use glxinfo to be sure it's working, add the environment as a prefix:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo


## In Steam

Modify the command line of each game you want to run with the eGPU (it's tedious), by:

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%


## In Lutris

Lutris has a per-game or per-runner setting named "Enable Nvidia offloading", you just have to enable it.

# Advanced usage / boot specialisation

Previously I only explained how to use the laptop screen and the eGPU as a discrete GPU (not doing display).  For some reasons, I've struggled a LOT to be able to use the eGPU display (which gives more performance because it's hitting less thunderbolt limitations).

I've discovered NixOS "specialisation" feature, allowing to add an alternative boot entry to start the system with slight changes, in this case, this will create a new "external-display" entry for using the eGPU as the primary display device:

hardware.nvidia.modesetting.enable = true;

hardware.nvidia.prime.sync.allowExternalGpu = true;

hardware.nvidia.prime.offload.enable = true;

hardware.nvidia.prime.nvidiaBusId = "PCI:10:0:0";

hardware.nvidia.prime.intelBusId = "PCI:0:2:0";

services.xserver.videoDrivers = ["nvidia" ];

# external display on the eGPU card

# otherwise it's discrete mode using laptop screen

specialisation = {

external-display.configuration = {

system.nixos.tags = [ "external-display" ];

hardware.nvidia.modesetting.enable = pkgs.lib.mkForce false;

hardware.nvidia.prime.offload.enable = pkgs.lib.mkForce false;

hardware.nvidia.powerManagement.enable = pkgs.lib.mkForce false;

services.xserver.config = pkgs.lib.mkOverride 0

''

Section "Module"

Load "modesetting"

EndSection

Section "Device"

Identifier "Device0"

Driver "nvidia"

BusID "10:0:0"

Option "AllowEmptyInitialConfiguration"

Option "AllowExternalGpus" "True"

EndSection

'';

};

};


With this setup, the default boot is the offloading mode but I can choose "external-display" to use my nvidia card and the screen attached to it, it's very convenient.

I had to force the xserver configuration file because the one built by NixOS was not working for me.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/nixos-egpu.gmi</guid>
  <link>gemini://perso.pw/blog//articles/nixos-egpu.gmi</link>
  <pubDate>Sun, 05 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Using awk to pretty-display OpenBSD packages update changes</title>
  <description>
    <![CDATA[
<pre># Introduction

You use OpenBSD and when you upgrade your packages you often wonder which one is a rebuild and which one is a real version update?  The packages updates are logged in /var/log/messages and using awk it's easy to achieve some kind of report.

# Command line

The typical update line will display the package name, its version, a "->" and the newer version of the installed package.  By verifying if the newer version is different from the original version, we can report updated packages.

awk is already installed in OpenBSD, so you can run this command in your terminal without any other requirement.

awk -F '-' '/Added/ && /->/ { sub(">","",$0) ; if( $(NF-1) != $NF ) { $NF=" => "$NF ; print }}' /var/log/messages


The output should look like this (after a pkg_add -u):

Dec 4 12:27:45 daru pkg_add: Added quirks 4.86 => 4.87

Dec 4 13:01:01 daru pkg_add: Added cataclysm dda 0.F.2v0 => 0.F.3p0v0

Dec 4 13:01:05 daru pkg_add: Added ccache 4.5 => 4.5.1

Dec 4 13:04:47 daru pkg_add: Added nss 3.72 => 3.73

Dec 4 13:07:43 daru pkg_add: Added libexif 0.6.23p0 => 0.6.24

Dec 4 13:40:41 daru pkg_add: Added kakoune 2021.08.28 => 2021.11.08

Dec 4 13:43:27 daru pkg_add: Added kdeconnect kde 1.4.1 => 21.08.3

Dec 4 13:46:16 daru pkg_add: Added libinotify 20180201 => 20211018

Dec 4 13:51:42 daru pkg_add: Added libreoffice 7.2.2.2p0v0 => 7.2.3.2v0

Dec 4 13:52:37 daru pkg_add: Added mousepad 0.5.7 => 0.5.8

Dec 4 13:52:50 daru pkg_add: Added munin node 2.0.68 => 2.0.69

Dec 4 13:53:01 daru pkg_add: Added munin server 2.0.68 => 2.0.69

Dec 4 13:53:14 daru pkg_add: Added neomutt 20211029p0 gpgme sasl 20211029p0 gpgme => sasl

Dec 4 13:53:20 daru pkg_add: Added nethack 3.6.6p0 no_x11 3.6.6p0 => no_x11

Dec 4 13:58:53 daru pkg_add: Added ristretto 0.12.0 => 0.12.1

Dec 4 14:01:07 daru pkg_add: Added rust 1.56.1 => 1.57.0

Dec 4 14:02:33 daru pkg_add: Added sysclean 2.9 => 3.0

Dec 4 14:03:57 daru pkg_add: Added uget 2.0.11p4 => 2.2.2p0

Dec 4 14:04:35 daru pkg_add: Added w3m 0.5.3pl20210102p0 image 0.5.3pl20210102p0 => image

Dec 4 14:05:49 daru pkg_add: Added yt dlp 2021.11.10.1 => 2021.12.01


# Limitations

The command seems to mangle the separators when displaying the result and doesn't work well with flavors packages that will always be shown as updated.

At least it's a good start, it requires a bit more polishing but that's already useful enough for me.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-package-update-report.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-package-update-report.gmi</link>
  <pubDate>Sat, 04 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>The state of Steam on OpenBSD</title>
  <description>
    <![CDATA[
<pre># Introduction

There is a very common question within the OpenBSD community, mostly from newcomers: "How can I install Steam on OpenBSD?".

The answer is: You can't, there is no way, this is impossible, period.


# Why?

Steam is a closed source program, while it's now also available on Linux doesn't mean it run on OpenBSD.  The Linux Steam version is compiled for linux and without the sources we can't port it on OpenBSD.

Even if Steam was able to be installed and could be launched, games are not made for OpenBSD and wouldn't work either.

On FreeBSD it may be possible to install Windows Steam using Wine, but Wine is not available on OpenBSD because it require some specific Kernel memory management we don't want to implement for security reasons (I don't have the whole story), but FreeBSD also has a Linux compatibility mode to run Linux binaries, allowing to use programs compiled for Linux.  This linux emulation layer has been dropped in OpenBSD a few years ago because it was old and unmaintained, bringing more issues than helping.

So, you can't install Steam or use it on OpenBSD.  If you need Steam, use a supported operating system.

I wanted to make an article about this in hope my text will be well referenced within search engines, to help people looking for Steam on OpenBSD by giving them a reliable answer.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-steam.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-steam.gmi</link>
  <pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Nethack: end of Sery the Tourist</title>
  <description>
    <![CDATA[
<pre>Hello, if you remember my previous publications about Nethack and my character "Sery the tourist", I have bad news.  On OpenBSD, nethack saves are stored in /usr/local/lib/nethackdir-3.6.0/logfile and obviously I didn't save this when changing computer a few months ago.

I'm very sad of this data loss because I was enjoying a lot telling the story of the character while playing.  Sery reached 7th floor while being a Tourist, which is incredible given all the nethack plays I've done and this one was going really well.

I don't know if you readers enjoyed that kind of content, if so please tell me so I may start a new game and write about it.

As an end, let's say Sery stayed too long in 7th floor and the Langoliers came to eat the Time of her reality.

=> https://stephenking.fandom.com/wiki/Langoliers Langoliers on Stephen King wiki fandom
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/nethack-end-of-sery.gmi</guid>
  <link>gemini://perso.pw/blog//articles/nethack-end-of-sery.gmi</link>
  <pubDate>Sat, 27 Nov 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Simple network dashboard with vnstat</title>
  <description>
    <![CDATA[
<pre># Introduction

Hi!  If you run a server or a router, you may want to have a nice view of the bandwidth usage and statistics.  This is easy and quick to achieve using vnstat software.  It will gather data regularly from network interfaces and store it in rrd files, it's very efficient and easy to use, and its companion program vnstati can generate pictures, perfect for easy visualization.

=> static/vnstat-dashboard.png My simple router network dashboard with vnstat
=> https://humdi.net/vnstat/ vnstat project homepage

# Setup (on OpenBSD)

Simply install vnstat and vnstati packages with pkg_add.  All the network interfaces will be added to vnstatd databases to be monitored.

pkg_add vnstat vnstati

rcctl enable vnstatd

rcctl start vnstatd

install -d -o _vnstat /var/www/htdocs/dashboard


Create a script in /var/www/htdocs/dashboard and make it executable:

!/bin/sh

cd /var/www/htdocs/dashboard/ || exit 1

last 60 entries of 5 minutes stats

vnstati --fiveminutes 60 -o 5.png

vertical summary of last two days

refresh only after 60 minutes

vnstati -c 60 -vs -o vs.png

daily stats for 14 last days

refresh only after 60 minutes

vnstati -c 60 --days 14 -o d.png

monthly stats for last 5 months

refresh only after 300 minutes

vnstati -c 300 --months 5 -o m.png


and create a simple index.html file to display pictures:

<html>

<body>

<div style="display: inline-block;">

<img src="vs.png" /><br />

<img src="d.png" /><br />

<img src="m.png" /><br />

</div>

<img src="5.png" /><br />

</body>

</html>


Add a cron as root to run the script every 10 minutes using _vnstat user:

add /usr/local/bin to $PATH to avoid issues finding vnstat

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin


My personal crontab runs only from 8h to 23h because I will never look at my dashboard while I'm sleeping so I don't need to keep it updated, just replace * by 8-23 for the hour field.

# Http server

Obviously you need to serve /var/www/htdocs/dashboard/ from your http server, I won't cover this step in the article.

# Conclusion

Vnstat is fast, light and easy to use, but yet it produces nice results.

As an extra, you can run the vnstat commands (without the i) and use the raw text output to build an pure text dashboard if you don't want to use pictures (or http).
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/simple-bandwidth-dashboard.gmi</guid>
  <link>gemini://perso.pw/blog//articles/simple-bandwidth-dashboard.gmi</link>
  <pubDate>Thu, 25 Nov 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>OpenBSD and Linux comparison: data transfer benchmark</title>
  <description>
    <![CDATA[
<pre># Introduction

I had a high suspicion about something but today I made measurements.  My feeling is that downloading data from OpenBSD use more "upload data" than on other OS

I originally thought about this issue when I found that using OpenVPN on OpenBSD was limiting my download speed because I was reaching the upload limit of my DSL line, but it was fine on Linux.  From there, I've been thinking since then that OpenBSD was using more out data but I never measured anything before.

# Testing protocol

Now that I have an OpenBSD router it was easy to make the measures with a match rule and a label.  I'll be downloading a specific file from a specific server a few times with each OS, so I'm adding a rule matching this connection.

match proto tcp from 10.42.42.32 to 145.238.169.11 label benchmark


Then, I've been downloading this file three times per OS and resetting counter after each download and saved the results from "pfctl -s labels" command.

=> http://ftp.fr.openbsd.org/pub/OpenBSD/7.0/amd64/comp70.tgz OpenBSD comp70.tgz file from an OpenBSD mirror

The variance of each result per OS was very low, I used the average of each columns as the final result per OS.

# Raw results

OS total packets total bytes packets OUT bytes OUT packets IN bytes IN

----- ------------- ----------- ----------- --------- ---------- --------

OpenBSD 175348 158731602 72068 3824812 10328 154906790

OpenBSD 175770 158789838 72486 3877048 10328 154912790

OpenBSD 176286 158853778 72994 3928988 10329 154924790

Linux 154382 157607418 51118 2724628 10326 154882790

Linux 154192 157596714 50928 2713924 10326 154882790

Linux 153990 157584882 50728 2705092 10326 154879790


# About the results

A quick look will show that OpenBSD sent +42% OUT packets compared to Linux and also +42% OUT bytes, meanwhile the OpenBSD/Linux IN bytes ratio is nearly identical (100.02%).

=> static/network-usage-packets.png Chart showing the IN and OUT packets of Linux and OpenBSD side by side

# Conclusion

I'm not sure what to conclude except that now, I'm sure there is something here requiring investigation.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-network-usage-mystery.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-network-usage-mystery.gmi</link>
  <pubDate>Sun, 14 Nov 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>How I ended up liking GNOME</title>
  <description>
    <![CDATA[
<pre># Introduction

Hi!  This was a while without much activity on my blog, the reason is that I stabbed through my right index with a knife by accident, the injury was so bad I can barely use my right hand because I couldn't move my index at all without pain.  So I've been stuck with only my left hand for a month now.  Good news, it's finally getting better :)

Which leads me to the topic of this article, why I ended liking GNOME!

# Why I didn't use GNOME

I will first start about why I didn't use it before.  I like to try everything all the time, I like disruption, I like having an hostile (desktop/shell/computer) environment to stay sharp and not being stuck on ideas.

My current setup was using Fvwm or Stumpwm, mostly keyboard driven, with many virtual desktop to spatially regroup different activities.  However, with an injured hand, I've been facing a big issue, most of my key binding were for two hands and it seemed too weird for me to change the bindings to work with one hand.

I tried to adapt using only one hand, but I got poor results and using the cursor was not very efficient because stumpwm is hostile to cursor and fvwm is not really great for this either.

# The road to GNOME

With only one hand to use my computer, I found the awesome program ibus-typing-booster to help me typing by auto completing words (a bit like on touchscreen phones), it worked out of the box with GNOME due to the ibus integration working well.  I used GNOME to debug the package but ended liking it in my current condition.

How do I like it now, while I was pestling about it a few months ago as I found it very confusing?  Because it's easy to use and spared me movements with my hands, absolutely.



This is certainly doing in MATE or Xfce too without much work, but it's out of the box with GNOME.  It's perfectly usable without knowing any keyboard shortcut.

# Mixed feelings

I'm pretty sure I'll return to my previous environment once my finger/hand because I have a better feeling with it and I find it more usable.  But I have to thanks the GNOME project to work on this desktop environment that is easy to use and quite accessible.

It's important to put into perspective when dealing with desktop environment.  GNOME may not be the most performing and ergonomic desktop, but it's accessible, easy to use and forgiving people who doesn't want to learn tons of key bindings or can't do them.

# Conclusion

There is a very recurrent question I see on IRC or forums: what's the best desktop environment/window manager?  What are YOU using?  I stopped having a bold opinion about this topic, I simply reply there are many desktop environments because they are many kind of people and the person asking the question need to find the right one to suiting them.

# Update (2021-11-11)

Using the xfdashboard program and assigning it to Super key allows to mimic the GNOME "activity" view in your favorite window manager: choosing windows, moving them between desktops, running applications.  I think this can easily turn any window manager into something more accessible, or at least "GNOME like".
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/how-I-ended-liking-gnome.gmi</guid>
  <link>gemini://perso.pw/blog//articles/how-I-ended-liking-gnome.gmi</link>
  <pubDate>Wed, 10 Nov 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>What if Internet stops? How to rebuild an offline federated infrastructure using OpenBSD</title>
  <description>
    <![CDATA[
<pre># Introduction

What if we lose Internet tomorrow and we stop building computers?  What would you want on your computer in the eventuality we would still have *some* power available to run it?

I find it to be an interesting exercise in the continuity of my old laptop challenge.

# Bootstrapping

My biggest point would be that my computer could be used to replicate itself to other computer owners, give them the data so they can spread it again.  Data copied over and over will be a lot more resilient than a single copy with a few local backups (local as in same city at best because there is no Internet).  

Because most people's computers relying on the Internet to have data turned into useless bricks, I think everyone would be glad to be part of an useful infrastructure that can replicate and extend.

# Essentials

I think I would have to argue this is very useful to have computers and knowledge they can carry if we are short on electricity for running computers.  We would want science knowledge (medicine, chemistry, physics, mathematics) but also history and other topics in the long run.  We would also require maps of the local region/country to make long term plans and help decisions and planning to build infrastructures (pipes, roads, lines).  We would require software to display but also edit these data.

Here is a list of sources I would keep synced on my computer.



The wikipedia dumps in zim format are very practical to run an offline wikipedia, we would require some OpenBSD programs to make it work but we would like more people to have them, Android tablets and phones are everywhere, small and doesn't draw much battery, I'd distribute the wikipedia dumps along with a kiwix APK file to view them without requiring a computer.  Keeping the sources of the Android programs would be a wise decision too.

As for maps, we can download areas on openstreetmap and rework them with Qgis on OpenBSD and redistribute maps and a compatible viewer for Android devices with the OSMand~ free software app.

It would be important to keep the data set rather small, I think under 100 GB because it would be complicated to have a 500GB requirement for setting up a new machine that can re-propagate the data set.

If I would ever need to do that, the first time would be to make serious backups of the data set using multiples copies on hard drives that I would I hand to different people.  Once the propagation process is done, it matters less because I could still gather the data somewhere.

=> https://wiki.kiwix.org/wiki/Content_in_all_languages Kiwix compatible data sets (including Wikipedia)
=> https://f-droid.org/packages/org.kiwix.kiwixmobile/ Android Kiwix app on F-droid
=> https://f-droid.org/en/packages/net.osmand.plus/ Android OSMand~ app for OSM maps on F-droid

# Why OpenBSD?

I'd choose OpenBSD because it's a system I know well, but also because it's easy to hack on it to make changes on the kernel.  If we ever need to connect a computer to an industrial machine, I'd rather try to port if on OpenBSD.

This is also true for the ports library, with all the distfiles it's possible to rebuild packages for multiple architectures, allowing to use older computers that are not amd64, but also easily patching distfiles to fix issues or add new features.  Carrying packages without their sources would be a huge mistake, you will have a set of binary blobs that can't evolve.

OpenBSD is also easy to install and it works fine most of the time.  I'd imagine automatic installation process from USB or even from PXE, and then share all the data so other people can propagate installation and data again.

This would also work with another system of course, the point is to keep the sources of the system and of its package to be able to rebuild the system for older supported architecture but also be able to enhance and work on the sources for bug fixing and new features.

# Distributing

I think a very nice solution would be to use Git, there are plugins to handle binary data so the repository doesn't grow over time.  Git is decentralized, you can get updates from someone who receives an update from someone else and git can also report if someone messed with the history.

We could imagine some well known places running a local server with a WiFi hotspot that can receive updates from someone allowed to (using ssh+git) push updates to a git repository.  There could be repositories for various topics like: news, system update, culture (music, videos, readings), maybe some kind of social network like twtxt.  Anyone could come and sync their local git repository to get the news and updates, and be able to spread it again.

=> https://github.com/buckket/twtxt twtxt project github page

# Conclusion

This is often a topic I have in mind when I think at why we are using computers and what makes them useful.  In this theoretic future which is not "post-apocalyptic" but just something went wrong and we have a LOT of computers that become useless.  I just want to prove that computers can still be useful without the Internet but you just need to understand their genuine purpose.

I'd be interested into what others would do, please let me know if you want to write on that topic :)
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/huge-disaster-recovery-plan.gmi</guid>
  <link>gemini://perso.pw/blog//articles/huge-disaster-recovery-plan.gmi</link>
  <pubDate>Thu, 21 Oct 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Use fzf for ksh history search</title>
  <description>
    <![CDATA[
<pre># Introduction

fzf is a powerful tool to interactively select a line among data piped to stdin, a simple example is to pick a line in your shell history and it's my main fzf use.

fzf ships with bindings for bash, zsh or fish but doesn't provide anything for ksh, OpenBSD default shell.  I found a way to run it with Ctrl+R but it comes with a limitation!

This setup will run fzf for looking a history line with Ctrl+R and will run it without allowing you to edit the line! /!\

# Configuration

In your interactive shell configuration file (should be the one set in $ENV), add the following function and binding, it will rebind Ctrl+R to fzf-histo function that will look into your shell history.

function fzf-histo {

RES=$(fzf --tac --no-sort -e < $HISTFILE)

test -n "$RES" || exit 0

eval "$RES"

}

bind -m ^R=fzf-histo^J


Reload your file or start a new shell, Ctrl+R should now run fzf for a more powerful history search.  Don't forget to install fzf package.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/ksh-fzf.gmi</guid>
  <link>gemini://perso.pw/blog//articles/ksh-fzf.gmi</link>
  <pubDate>Sun, 17 Oct 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Typing faster with assistive technology</title>
  <description>
    <![CDATA[
<pre># Introduction 

This article is being written only using my left hand with the help of ibus-typing-booster program.

=> https://mike-fabian.github.io/ibus-typing-booster/ ibus-typing-booster project

The purpose of this tool is to assist the user by proposing words while typing, a bit like smartphones do.  It can be trained with a dictionary, a text file but also learn from user inputs over time.

A package for OpenBSD is on the tracks.

# Installation 

This program requires ibus to work, on Gnome it is already enabled but in other environments some configuration are required.  Because this may be subject to change over time and duplicating information is bad, I'll give the links for configuring ibus-typing-booster.

=> https://mike-fabian.github.io/ibus-typing-booster/docs/user/#1 How to enable ibus-typing-booster

# How to use

Once you have setup ibus and ibus-typing-booster you should be able to switch from normal input to assisted input using "super"+space.

When you type with ibus-typing-booster enabled, with default settings, the input should be underlined to show a suggestion can be triggered using TAB key.  Then, from a popup window you can pick a word by using TAB to cycle between the suggestions and pressing space to validate, or use the F key matching your choice number (F1 for first, F2 for second etc...) and that's all.

# Configuration

There are many ways to configure it, suggestions can be done inline while typing which I think is more helpful when you type slowly and you want a quick boost when the suggestion is correct.  The suggestions popup can be vertical or horizontal, I personally prefer horizontal which is not the default.  Colors and key bindings can changed.

# Performance

While I type very fast when I have both my hands, using one hand requires me to look the keyboard and make a lot of moves with my hand.  This work fine and I can type reasonably fast but this is extremely exhausting and painful for my hand.  With ibus-typing-booster I can type full sentences with less efforts but a bit slower.  However this is a lot more comfortable than typing everything using my hand.

# Conclusion

This is an assistive technology easy to setup and that can be a life changer for disabled users who can make use of it.

This is not the first time I'm temporarily disabled in regards to using a keyboard, I previously tried a mirrored keyboard layout reverting keys when pressing caps lock, and also Dasher which allow to make words from simple movements such as moving mouse cursor.  I find this ibus plugin to be easier to integrate for the brain because I just type with my keyboard in the programs, with Dasher I need to cut and paste content, and with mirrored layout I need to focus on the layout change.

I am very happy of it.</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/ibus-typing-booster.gmi</guid>
  <link>gemini://perso.pw/blog//articles/ibus-typing-booster.gmi</link>
  <pubDate>Sat, 16 Oct 2021 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Full WireGuard setup with OpenBSD</title>
  <description>
    <![CDATA[
<pre># Introduction

We want all our network traffic to go through a WireGuard VPN tunnel automatically, both WireGuard client and server are running OpenBSD, how to do that?  While I thought it was simple at first, it soon became clear that the "default" part of the problem was not easy to solve, fortunately there are solutions.

This guide should work from OpenBSD 6.9.

=> https://man.openbsd.org/pf.conf#nat-to pf.conf man page about NAT
=> https://man.openbsd.org/wg WireGuard interface man page
=> https://man.openbsd.org/ifconfig#WIREGUARD ifconfig man page, WireGuard section

# Setup

For this setup I assume we have a server running OpenBSD with a public IP address (1.2.3.4 for the example) and an OpenBSD computer with Internet connectivity.

Because we want to use the WireGuard tunnel as the default route, we can't define a default route through WireGuard as this, that would prevent our interface to reach the WireGuard endpoint to make the tunnel working.  We could play with the routing table by deleting the default route found on the interface, create a new route to reach the WireGuard server and then create a default route through WireGuard, but the whole process is fragile and there is no right place to trigger a script doing this.

Instead, we can assign the network interface used to access the Internet to the rdomain 1, configure WireGuard to reach its remote peer through rdomain 1 and create a default route through WireGuard on the rdomain 0.  Quick explanation about rdomain: they are different routing tables, default is rdomain 0 but we can create new routing tables and run commands using a specific routing table with "route -T 1 exec ping perso.pw" to make a ping through rdomain 1.


+-------------+

| server | wg0: 192.168.10.1

| |---------------+

+-------------+ |

| public IP |

| 1.2.3.4 |

| |

| |

/\/\/\/\/\/\/\ |WireGuard

| internet | |VPN

\/\/\/\/\/\/\/ |

| |

| |

|rdomain 1 |

+-------------+ |

| computer |---------------+

+-------------+ wg0: 192.168.10.2

rdomain 0 (default)


# Configuration

The configuration process will be done in this order:

1. create the WireGuard interface on your computer to get its public key
2. create the WireGuard interface on the server to get its public key
3. configure PF to enable NAT and enable IP forwarding
4. reconfigure computer's WireGuard tunnel using server's public key
5. time to test the tunnel
6. make it default route

Our WireGuard server will accept connections on address 1.2.3.4 at the UDP port 4433, we will use the network 192.168.10.0/24 for the VPN, the server IP on WireGuard will be 192.168.10.1 and this will be our future default route.

## On your computer

We will make a simple script to generate the configuration file, you can easily understand what is being done.  Replace "1.2.3.4 4433" by your IP and UDP port to match your setup.

PRIVKEY=$(openssl rand -base64 32)

cat <<EOF > /etc/hostname.wg0

wgkey $PRIVKEY

wgpeer wgendpoint 1.2.3.4 4433 wgaip 0.0.0.0/0

inet 192.168.10.2/24

up

EOF

start interface so we can get the public key

we should have an error here, this is normal

sh /etc/netstart wg0

PUBKEY=$(ifconfig wg0 | grep 'wgpubkey' | cut -d ' ' -f 2)

echo "You need $PUBKEY to setup the remote peer"


## On the server

### WireGuard

Like we did on the computer, we will use a script to configure the server.  It's important to get the PUBKEY displayed in the previous step.

PUBKEY=PASTE_PUBKEY_HERE

PRIVKEY=$(openssl rand -base64 32)

cat <<EOF > /etc/hostname.wg0

wgkey $PRIVKEY

wgpeer $PUBKEY wgaip 192.168.10.0/24

inet 192.168.10.1/24

wgport 4433

up

EOF

start interface so we can get the public key

we should have an error here, this is normal

sh /etc/netstart wg0

PUBKEY=$(ifconfig wg0 | grep 'wgpubkey' | cut -d ' ' -f 2)

echo "You need $PUBKEY to setup the local peer"


Keep the public key for next step.

## Firewall

We want to enable NAT so we can reach the Internet through the server using WireGuard, edit /etc/pf.conf to add the following line (after the skip lines):

pass out quick on egress from wg0:network to any nat-to (egress)


Reload with "pfctl -f /etc/pf.conf".

NOTE: if you block all incoming traffic by default, you need to open UDP port 4433.  You will also need to either skip firewall on wg0 or configure PF to open what you need.  This is beyond the scope of this guide.

## IP forwarding

We need to enable IP forwarding because we will pass packets from an interface to another, this is done with "sysctl net.inet.ip.forwarding=1" as root.  To make it persistent across reboot, add "net.inet.ip.forwarding=1" to /etc/sysctl.conf (you may have to create the file).

From now, the server should be ready.

## On your computer

Edit /etc/hostname.wg0 and paste the public key between "wgpeer" and "wgaip", the public key is wgpeer's parameter.  Then run "sh /etc/netstart wg0" to reconfigure your wg0 tunnel.

After this step, you should be able to ping 192.168.10.1 from your computer (and 192.168.10.2 from the server).  If not, please double check the WireGuard and PF configurations on both side.

## Default route

This simple setup for the default route will truly make WireGuard your default route.  You have to understand services listening on all interfaces will only attach to WireGuard interface because it's the only address in rdomain 0, if needed you can use a specific routing table for a service as explained in rc.d man page.

Replace the line "up" with the following:

wgrtable 1

up

!route add -net default 192.168.10.1


Your configuration file should look like this:

wgkey YOUR_KEY

wgpeer YOUR_PUBKEY wgendpoint REMOTE_IP 4433 wgaip 0.0.0.0/0

inet 192.168.10.2/24

wgrtable 1

up

!route add -net default 192.168.10.1


Now, add "rdomain 1" to your network interface used to reach the Internet, in my setup it's /etc/hostname.iwn0 and it looks like this.

join network wpakey superprivatekey

join home wpakey notsuperprivatekey

rdomain 1

up

autoconf


Now, you can restart network with "sh /etc/netstart" and all the network should pass through the WireGuard tunnel.

# Handling DNS

Because you may use a nameserver in /etc/resolv.conf that was provided by your local network, it's not reachable anymore.  I highly recommend to use unwind (in every case anyway) to have a local resolver, or modify /etc/resolv.conf to use a public resolver.

unwind can be enabled with "rcctl enable unwind" and "rcctl start unwind", from OpenBSD 7.0 you should have resolvd running by default that will rewrite /etc/resolv.conf if unwind is started, otherwise you need to write "nameserver 127.0.0.1" in /etc/resolv.conf

# Bypass VPN

If you need for some reason to run a program and not route its traffic through the VPN, it is possible.  The following command will run firefox using the routing table 1, however depending on the content of your /etc/resolv.conf you may have issues resolving names (because 127.0.0.1 is only reachable on rdomain 0!).  So a simple fix would be to use a public resolver if you really need to do so often.

route -T 1 exec firefox


=> https://man.openbsd.org/route.8#exec route man page about exec command

# WireGuard behind a NAT

If you are behind a NAT you may need to use the KeepAlive option on your WireGuard tunnel to keep it working.  Just add "wgpka 20" to enable a KeepAlive packet every 20 seconds in /etc/hostname.wg0 like this:

wgpeer YOUR_PUBKEY wgendpoint REMOTE_IP 4433 wgaip 0.0.0.0/0 wgpka 20

[....]


=> https://man.openbsd.org/ifconfig#wgpka ifconfig man page explaining wgpka parameter


# Conclusion

WireGuard is easy to deploy but making it a default network interface adds some complexity.  This is usually simpler for protocols like OpenVPN because the OpenVPN daemon can automatically do the magic to rewrite the routes (and it doesn't do it very well) and won't prevent non-VPN access until the VPN is connected.
</pre>
    ]]>
  </description>
  <guid>gemini://perso.pw/blog//articles/openbsd-wireguard-exit.gmi</guid>
  <link>gemini://perso.pw/blog//articles/openbsd-wireguard-exit.gmi</link>
  <pubDate>Sat, 09 Oct 2021 00:00:00 GMT</pubDate>
</item>

  </channel>
</rss>