– Da PC-en min begynte å tegne linjer til Kina
– Word koblet seg til Microsofts servere i Hongkong, skriver Ola Lie. Slik gikk han fram for å lage et verktøy som overvåker trafikken via PC-en hans.
Er det noen, bortsett fra meg, som er inne på min datamaskin akkurat nå?
Mange programmer kommuniserer med tjenester på internett i bakgrunnen. Verktøy som netstat, TCPView og Wireshark viser IP-adressene til disse forbindelsene.
netstat er teknisk, TCPView mer tilgjengelig, og Wireshark har høyere terskel. Deretter kan man bruke tjenester som whois.com og ipinfo.io for å finne mer informasjon om adressene, for eksempel hvor de går og hvem som eier dem.
Dette er tungvint.
Tegnet linje til Kina
Tenk om det fantes et program som viste forbindelsene direkte i et kart, og hvor informasjonen kom fram når man peker på dem.
Dette var idéen bak programmet TapMap.
Jeg husker at jeg ble spent da den første prototypen tegnet en linje til Kina i kartet. Det viste seg å være Word som koblet seg til Microsofts servere i Hongkong.
Noen år tidligere hadde jeg hjulpet en venn med å fjerne skadevare som sendte ut store mengder e-post, slik at internettforbindelsen ble sperret. Den gangen måtte jeg lete i TCP-tabellene og fant til slutt forbindelsen som gikk til Florida. Prosessnavnet så først ut som en vanlig systemprosess.
Da jeg for en stund siden tok fram igjen programmet, virket det ikke lenger fordi kartbiblioteket var utdatert. Hvilket språk og hvilke biblioteker skulle jeg bruke nå?
Go og Rust kunne vært brukt til backend, men da måtte jeg hatt en separat frontend i et annet språk. Det ville gjort løsningen mer komplisert.
JavaScript kunne brukes til begge deler, med Node.js i backend og eksempelvis React og MapLibre i frontend. Python kunne også brukes til begge deler.
psutil kunne hente ut nettverksinformasjon og prosessdata på flere plattformer, mens Dash og Plotly gjorde det mulig å bygge et interaktivt grensesnitt direkte i nettleseren.
Denne løsningen virket mer fristende fordi den gjorde utvikling og bygging enklere.
Kjører bare lokalt
Publiseringen i midten av mars fikk god respons på Reddit, med rundt 190 000 visninger, over 1000 upvotes og mange kommentarer. Første versjon var for Windows, men mange etterspurte støtte for Linux, macOS og Docker. Dette la jeg til i ukene etter publiseringen.
Det kom også ønsker om integrasjon med pfSense og historikk over tilkoblinger.
Innlegget ble plukket opp og publisert flere steder, ikke bare i vesten, men også i Russland, Kina og Japan. Der ble det særlig lagt vekt på at alt kjører lokalt, uten at data sendes ut fra maskinen. Det førte også til økende interesse for prosjektet på GitHub.
Da jeg først skulle skrive om prototypen, tenkte jeg at andre kanskje også kunne ha nytte av programmet. TapMap er skrevet i Python, med litt JavaScript og CSS.
Jeg lagde kjørbare versjoner som kunne lastes ned fra GitHub, og satte opp automatisk testing og bygging før nye versjoner publiseres. Samtidig gikk jeg over til Dash og Plotly. Dermed ble flere oppgaver håndtert i nettleseren, og de kjørbare filene ble betydelig mindre.
Som utgangspunkt for arkitekturen valgte jeg et MVC-mønster med en felles fasade for backend. Det gjorde det enklere å støtte flere plattformer. På Windows og Linux bruker TapMap psutil til å hente nettverksdata, mens macOS bruker lsof.
Programmet kobler IP-adresser til geografisk informasjon og nettverkene de tilhører ved hjelp av lokale GeoIP-databaser.
Fikk testehjelp
Da det kom ønsker om en macOS-versjon, viste backend-fasaden seg å ha vært et godt valg. Den gjorde det enkelt å bruke lsof på macOS, samtidig som Windows og Linux fortsatt kunne bruke psutil.
Jeg visste fra før at operativsystemene håndterer tilgang til datafiler, nettverksinformasjon og prosesser forskjellig, men måtte sette meg inn i mange detaljer underveis.
Docker-versjonen fungerer for eksempel bare på Linux, fordi containere på Windows og macOS ikke får direkte tilgang til vertens nettverksforbindelser på samme måte som på Linux.
Jeg har også fått nyttig hjelp fra brukere til å teste på plattformer jeg ikke har selv, som Linux på ARM og macOS på Intel.
Tilbakemeldinger fra brukere har også ført til bedre Docker-støtte og mer fleksible konfigurasjonsmuligheter.
Forstå forbindelser
Et naturlig neste steg var å redusere støy.
Det er nyttig å se hvor forbindelsene går, men det er også verdifullt å vite hva som er vanlig og hva som skiller seg ut. Derfor har jeg lagt inn historikk som viser hva som er nytt og hva som forekommer oftest.
Jeg arbeider også med et sammendrag som viser mønstre i forbindelsene med tekst og enkle grafer.
Målet har ikke vært å lage et sikkerhetsverktøy eller analysere innholdet i trafikken, men å gjøre det enklere å forstå hvilke forbindelser maskinen faktisk oppretter.
Dette er forbindelser man normalt ikke ser uten spesialiserte verktøy. Jeg ser også på løsninger for mer sømløs installasjon og oppdatering av GeoLite2-databasene, slik at brukerne slipper manuelle steg utenfor programmet.