Hackigt hemmanät

Vi har bråkat lite med vår bredbandsleverantör (haha, Comhem!) på sistone och beslutat att vi inte vill vara kund hos dem mer. Tyvärr finns ingen annan leverantör i huset (Telia har haft huset ”under installation” sedan 2007), så vi föll tillbaka på 4G då vi har rätt bra förutsättningar för det.

Problemet är bara att någon bestämde sig för att inte använda ett vanligt 4G-modem, utan ville Göra Det Själv.

Så en minidator (Asus Tinkerboard S) fanns redan hemma, ett modem och en trådlös basstation behövde inhandlas. Modemet blev ett Huawei E3372 (se tidigare post här om modemet) och routern blev en Netgear R7500 mest p.g.a. fanns begagnad och relativt billig. udev-reglerna från föregående inlägg gick dock att återanvända.

Då jag inte använt iptables för att dirigera paket på ett tag (nftables-hacket förra året räknas inte!) blev det nästan som en pinsam kalldusch att genomföra projektet – hur gjorde en ens? Dessutom var det hejdlöst drygt att ladda ner paketberoenden på min laptop, skicka till enkortsdatorn och installera, upptäcka att fler paket behövdes och så vidare.

När alla paket och paketberoenden väl var på plats konfigurerade jag upp modemet med en network-manager-profil (nmtui var hjälpsamt här, sedan behövde jag komplettera konfigurationsfilen med en pin-kod) och upptäckte att network-manager har dispatcher-skript en kan använda. Nedan är ett skript jag stal från techytalk.info:

#!/bin/bash
 
IF=$1
STATUS=$2

# ppp0 var aktuellt för mig, ändra annars här
if [ "$IF" == "ppp0" ]
then
    case "$2" in
        up)
        logger -s "ppp0 up, create a masquerade party!"
        echo 1 > /proc/sys/net/ipv4/ip_forward
        /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
        /sbin/iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
        /sbin/iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
        ;;
        down)
        logger -s "ppp0, too lazy to remove iptables rules"
        echo 0 > /proc/sys/net/ipv4/ip_forward
        ;;
        pre-up)
        logger -s "NM Script pre-up triggered"
        ;;
        post-down)
        logger -s "NM Script post-down triggered"
        ;;
        *)
        ;;
    esac
fi

Sparade ett liknande skript i /etc/NetworkManager/dispatcher.d/ och gjorde det exekverbart. Att jag inte inkluderat några fler regler än NAT-översättningen är för att modemet just nu agerar brandvägg och gör sin egen NAT-översättning. Det ska gå att byta firmware på modemet men jag har inte haft möjlighet än.

Avslutade med att lägga in en dnsmasq som delar ut IP-adresser samt hanterar DNS-frågor. Kastade även in en pihole-liknande reklam- och spårningsblockering redan i brandväggen.

Pythonhack och NixOS

Jag hackade nyligen ihop ett program som läser in ett API och presenterar detta som en ATOM/RSS-feed. Det blev inte snyggt, men nu kan jag följa en blogg som normalt saknar ett RSS-flöde i min RSS-läsare.

Det trixigaste var att lyckas förstå hur en kör ett program som detta i NixOS, men utan att behöva stöka allt för mycket. Jag ville att skriptet ska köras varje timme och jag ville använda några förpaketerade paketberoenden. I korthet, Nix-Writers fixade biffen!

{ pkgs, ... }:
let
  python-hack = pkgs.writers.writePython3 "pythonhack" {
    libraries = [ pkgs.python3Packages.feedgen pkgs.python3Packages.requests ];
  } (builtins.readFile "/path/to/script.py");
in {
  systemd.services.python-hack = {
    description = "hack hack hack";
    serviceConfig = {
      Type = "oneshot";
      User = "foobar";
      ExecStart = python-hack; # samma namn som i let-blocket
    };
  };
  systemd.timers.python-hack = {
    wantedBy = [ "timers.target" ];
    partOf = [ "python-hack.service" ];
    timerConfig.OnCalendar = "hourly";
  };
}

Det är nog lite hackigt att använda writers-funktionaliteten såhär, det är nog tänkt att användas för att skriva programkod direkt i nix-filen, istället för att bara läsa in källkoden från en fil som här ovan. Men det fungerade, och det var relativt enkelt att sätta ihop.

Huawei E3372 & Linux

Det här är mest en anteckning till den framtida Oscar, och eventuella andra intresserade.

Jag har ett USB-modem jag använder med mina datorer hemma, ett Huawei E3372. Det startar först upp som en CD-enhet för att dela med sig av sina drivrutiner, och behöver sedan instrueras att byta läge till ett vanligt modem.

För detta skapade jag en udev-regel som gör det jobbet åt mig, ersätt sökvägar med vad som är korrekt för din Linux:

ATTR{idVendor}=="12d1", ATTR{idProduct}=="14fe", RUN+="${pkgs.usb_modeswitch}/bin/usb_modeswitch -v 12d1 -p 14fe -V 12d1 -P 1506 -J"

Du kommer behöva programmet usb_modeswitch, som verkar finnas paketerad för de flesta distros.

Alla ID:n och liknande fås av att köra en lsusb. Innan modemet bytt läge:

Bus 002 Device 016: ID 12d1:14dc Huawei Technologies Co., Ltd.

Efter att den bytt läge:

Bus 001 Device 006: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard

För mig startade inte modem-manager (som krävs, och är en del av network-manager) automagiskt, så jag lade till en extra udev-regel för att fixa detta när modemet (i rätt läge) ansluts:

ATTR{idVendor}=="12d1", ATTR{idProduct}=="1506", RUN+="${pkgs.systemd}/bin/systemctl restart modem-manager.service"

Nu behöver jag bara be network-manager att koppla upp sig på 4G. Klart!

Ringtestning

Jag gissar att samma problem lär uppkomma under polarnatten. Det är inte konstigt att folk inte är bekanta med polarnätter och midnattssolen, men åtminstone någon som inte är en junior testare borde veta något om att dagslängd förändras under året och att löjliga edge cases borde testas här.