Gå til hovedindhold

Ni porte, jeg ikke længere skal huske

Indsendt af Lennart den

Jeg har ni små webservere kørende på min Mac. Indtil for nylig kendte jeg dem kun på deres portnumre. Nu har de navne, og jeg kan åbne dem fra telefonen, uanset hvor jeg er.

Det sker, når man bygger sine egne værktøjer. Morgenbriefingen kører på port 3095. Mit CRM på 3070. LinkedIn-maskinrummet på 9377, ugehjulet på 3050, gøremålene på 3060. Hver gang jeg byggede et nyt værktøj, fik det en ny port, og hver gang skulle jeg huske den.

Det gjorde jeg ikke. Jeg ledte i bogmærker, i launchd-filer og i min egen historik. Tallene betyder ingenting, og listen over dem fandtes ingen steder. Den lå spredt ud over ni konfigurationsfiler.

Ét register, ét navn pr. server

Løsningen er et lille Nushell-modul, der hedder hub. Det består af to dele: en fil med listen over servere og et sæt kommandoer, der læser den.

Listen er den eneste sandhed. Hver linje har et navn, en port, en beskrivelse, hvor loggen ligger, og om serveren skal kunne nås udefra:

[navn,     port, label,                         tls,  lan,   wg ];
[brief,    3095, "brief — morgenbriefingen",    true, false, true],
[crm,      3070, "CRM — relationer",            true, false, true],
[linkedin, 9377, "LinkedIn maskinrum",          true, true,  true],

hub apply læser listen og skriver en konfiguration til Caddy, en lille webserver, der sidder på port 80 og 443 og sender trafikken videre. Når jeg skriver https://crm.localhost i browseren, ser Caddy navnet og sender forespørgslen til port 3070. Jeg skal aldrig se tallet igen.

Det daglige ser sådan ud:

hub                 # alle servere: navn, adresse, og om de svarer
hub goto crm        # åbn den i browseren
hub logs brief      # de sidste linjer af loggen
hub restart rut     # genstart den via launchd
hub add red 3110    # en ny server i registret

Den første kommando er den, jeg bruger mest. Den viser to statuskoder for hver server: én gennem navnet og én direkte på porten. Svarer porten, men ikke navnet, er det navnelaget, der mangler. Svarer ingen af dem, er det serveren selv, der er nede. Den forskel tog før ti minutter at finde ud af.

Bemærk, hvad hub ikke gør: Den starter ikke serverne. Det gør launchd stadig, som macOS's indbyggede jobstyring. hub er kun navnelaget ovenpå og stedet, hvor listen endelig står samlet.

Hvorfor .localhost og ikke .test

Den første udgave brugte navne som crm.test. Det virkede i Chrome og Firefox, men ikke i Safari. Safari svarede «kan ikke finde serveren».

Årsagen var sjov at finde. .test kræver, at navnene står i /etc/hosts. Chrome og Firefox slår navne op på en måde, der læser den fil. Safari spørger macOS's navnetjeneste direkte, og den vej ser ikke filen.

.localhost løser sig selv. Det er reserveret til formålet, og både macOS og browserne svarer 127.0.0.1 for ethvert navn under det. Der er intet at skrive i nogen fil, og der kræves ingen administratoradgang. Den slags valg tager fem minutter at træffe og en eftermiddag at forstå.

Hele mit private netværk

Navne på min egen maskine er rart. Men flere af værktøjerne er mest nyttige på telefonen: morgenbriefingen i toget, ugehjulet i køkkenet, CRM'et lige før et møde.

Her kommer WireGuard ind. WireGuard er en VPN, der laver en krypteret tunnel mellem mine egne enheder. Telefonen og Mac'en får hver sin adresse i et lille privat netværk, og de kan nå hinanden, uanset om telefonen er på hjemmets wifi, på 5G eller på et hotel. Hver enhed har sin egen nøgle. Uden nøglen er der ingen adgang.

Hver server i registret har feltet wg. Står det til true, svarer Caddy også på navnet crm.wg, brief.wg og så videre. Telefonen skal så bare vide, at .wg-navnene betyder Mac'ens adresse i tunnelen. Det klarer en Pi-hole, som er sat som DNS i WireGuard-opsætningen på telefonen.

hub wg viser, om det virker:

navn      url                  peger_på       svar
brief     https://brief.wg     10.196.144.3   200
crm       https://crm.wg       10.196.144.3   200
linkedin  https://linkedin.wg  10.196.144.3   200
…

Ni ud af ni svarer. DeepSeek-værktøjet svarer 401, fordi det kræver login, og det er også et svar.

Hvorfor tunnelen har sit eget navn

Der er også et tredje navn: .local. Det deler en server med alle på mit wifi, annonceret over Bonjour, som når en printer dukker op af sig selv. Det virker hjemme, men det kan principielt ikke virke gennem WireGuard.

Bonjour sender sine forespørgsler ud til alle på netværket på én gang. En WireGuard-tunnel er en linje mellem to punkter, og den slags rundsendelser krydser den aldrig. Så .local er for gæsterne på mit wifi, og .wg er for mine egne enheder. To navne, to formål, og intet af det er noget, man gætter sig til.

Certifikatet er den svære del

Alle navnene kører over https, med certifikater Caddy selv udsteder. For at browseren stoler på dem, skal Caddys eget rodcertifikat installeres på hver enhed. Det er nemt på Mac'en. På telefonen er det en lille hønen og ægget-situation: Telefonen skal have certifikatet, før den kan stole på noget som helst.

hub løser det ved at servere certifikatet på én bestemt adresse uden kryptering, http://ca.wg. Det lyder forkert, men det er forsvarligt. Et rodcertifikat er offentligt; det er den private nøgle, der er hemmelig, og den forlader aldrig Mac'en. Trafikken løber i forvejen inde i en krypteret tunnel. hub trust ios og hub trust android fortæller trin for trin, hvad der skal ske på telefonen. På iPhone er der to trin, og det er det andet, alle glemmer.

Det er værd at sige højt, hvad man siger ja til: En enhed, der stoler på det rodcertifikat, vil acceptere ethvert certifikat, nøglen udsteder. Nøglen ligger kun på min Mac, men det er en reel udvidelse af, hvad telefonen stoler på. Derfor står advarslen i kommandoens eget output og ikke kun i en dokumentation, ingen læser.

Hvad det har med SMV'er at gøre

Mere end man skulle tro. Mange mindre virksomheder har efterhånden små interne værktøjer: et dashboard, en lagerliste, et script, en kollega byggede. De kører på en bærbar eller en server i et skab, på en port, kun én person kender.

Det er tavs viden i sin reneste form. Værktøjet findes, men kun for den, der husker adressen. Den dag personen er syg, findes det ikke.

Et register, hvor hver tjeneste har et navn og en linje, er ikke avanceret teknik. Det er bare at skrive ned, hvad der kører. Og en VPN som WireGuard gør det muligt at bruge værktøjerne ude af huset uden at lægge dem på internettet. Det er gratis, og det tager en eftermiddag.

Jeg byggede hub, fordi jeg var træt af at lede efter port 9377. Det, jeg fik, var en liste over, hvad der faktisk kører på min maskine. Den havde jeg ikke før.