Iperf(at)Work er et nettleserbasert grensesnitt for nettverksytelsestester med iperf3. Dokumentet beskriver arkitekturen, komponentene, API-et, sikkerhetsmekanismene, pakke- og installasjonsmodellen og driften, og er skrevet for drift, sikkerhetsgjennomgang og videreutvikling.
1. Formål og omfang
Produkt |
Iperf(at)Work 2.1.0 |
Komponenter |
Caddy 2.11.4 (web-server og omvendt proxy), |
Bruksområde |
Måling av båndbredde, retransmisjoner, jitter og pakketap mellom to maskiner; feilsøking og akseptansetest av nett, VPN, WAN og virtuelle svitsjer |
Ikke formål |
Kontinuerlig overvåking, måling fra mange agenter, lagring av måleserier over lang tid |
Målplattformer |
Rocky Linux 9 / RHEL 9 / AlmaLinux 9 og VMware Photon OS 4/5, på fysisk server, VMware-VM/appliance og Proxmox VE-VM (x86_64) |
Kjøremodell |
Vanlige Linux-prosesser styrt av systemd, installert fra tre RPM-pakker uten pakkebrønner eller internett |
Språk |
Engelsk og norsk (bokmål) i web-GUI, API-meldinger, manualer, lisenssider og skript |
2. Arkitektur
2.1. Oversikt
Nettleser │ HTTP :80 (valgfritt HTTP Basic-passord) ▼ ┌────────────────────────── caddy.service (bruker caddy) ───────────────────────────┐ │ /api/* ──► reverse_proxy 127.0.0.1:9000 (flush_interval -1 for SSE) │ │ /* ──► file_server /usr/share/iperf-by-web/html │ │ index.html, ui.css, i18n.js, app.js, manual(.no).html, licenses(.no) │ │ sikkerhetshoder (CSP, X-Frame-Options, nosniff, Referrer-Policy) │ └────────────────────────────────────────────────────────────────────────────────────┘ │ ▼ 127.0.0.1:9000 ┌────────────────────────── iperf-api.service (bruker iperf-by-web) ─────────────────┐ │ ThreadingHTTPServer ─► /api/start ─► subprocess iperf3 -c … (ny prosessgruppe) │ │ watcher-tråd ─► tests/test-<id>.log + .meta.json │ │ /api/output ─► Server-Sent Events (følger loggfilen) │ │ /api/server/status ─► systemctl is-active, ss, server-logg │ └────────────────────────────────────────────────────────────────────────────────────┘ iperf3-server@5201.service, iperf3-server@5202.service (bruker iperf-by-web, server/both) iperf3 --server --port N --forceflush --timestamps --logfile /var/lib/iperf-by-web/server-N.log
2.2. Komponenter
| Komponent | Språk | Ansvar |
|---|---|---|
Caddy 2.11.4 ( |
Go |
Lytter på port 80, leverer de statiske sidene, proxyer |
|
Python 3 |
JSON-API: validerer testparametere, starter og stopper iperf3 uten skall, lagrer logg og metadata per test, tolker sammendraget, strømmer utdata med Server-Sent Events, leser serverstatus |
iperf3 3.21 ( |
C |
Selve målingen, som klient (startet av API-et) og som server ( |
Web-GUI ( |
HTML/CSS/JS |
Skjema, sanntidsgraf (canvas), resultatfliser, sammendrag, historikk med CSV-eksport, serverstatus, EN/NO |
|
bash |
Tar konfigurasjonen i bruk (tjenester, brannmur), status, rollebytte, språk, passord, selvtest |
|
bash |
Offline-installasjon, kontroll av forutsetninger, avinstallering – på engelsk og norsk |
2.3. Prosess- og trådmodell
API-et bruker ThreadingHTTPServer med én tråd per forespørsel. Hver test startes som en egen prosess i en ny prosessgruppe (start_new_session=True), med stdout og stderr til loggfilen. En watcher-tråd venter på prosessen, skriver sluttstatus og tolket resultat til metadatafilen og frigir «pågående test». Bare én klienttest kan kjøre om gangen (lås + sjekk av prosessen). SSE-forespørsler holder en tråd hver mens testen pågår og sender en keep-alive-kommentar hvert ~10. sekund.
Ved stopp sendes SIGINT til prosessgruppen, slik at iperf3 skriver sammendrag; etter 3 sekunder sendes SIGKILL. Når API-et startes, merkes tester som fortsatt står som running (avbrutt av omstart) som failed med en merknad.
3. Måling
3.1. Kommandoen
API-et bygger argumentlisten (aldri en skallstreng):
iperf3 -c <server> -p <port> -t <varighet> -i <intervall> -P <strømmer> --forceflush -f m
[-O <hopp over>] [-u -b <båndbredde|1G>] [-b <båndbredde>] [-w <vindu>] [-l <lengde>]
[-R | --bidir] [-B <kildeadresse>] [-4 | -6]
--forceflush gjør at hver intervall-linje skrives med en gang (sanntidsvisning), og -f m gir alle hastigheter i Mbit/s.
3.2. Validering
| Felt | Regel | iperf3 |
|---|---|---|
server |
|
|
port |
1–65535 |
|
duration |
1– |
|
parallel |
1–128 |
|
interval |
1–60 |
|
omit |
0–60 og mindre enn varigheten |
|
protocol |
|
|
direction |
|
|
bandwidth |
|
|
window, length |
|
|
bind |
|
|
ipversion |
|
|
3.3. Tolking av resultatet
Sammendragslinjene (som slutter med sender eller receiver) tolkes med et regulært uttrykk som håndterer [ 5], [SUM], [ 5][TX-C] og [SUM][RX-C]. Finnes [SUM]-linjer (flere strømmer), brukes bare de. For hver linje lagres retning (up = TX-C, down = RX-C, ellers ingen), målested, hastighet omregnet til Mbit/s, overført mengde og enten retransmisjoner (TCP, sender) eller jitter, tapte/totale datagrammer og tap i prosent (UDP). Feilmeldingen iperf3: error - … lagres for feilede tester.
Web-GUI-et tolker intervall-linjene fortløpende på samme måte for grafen og flisene; linjer merket (omitted) hoppes over.
3.4. Lagring
Fil |
Innhold |
|
Kommando og fullstendig utdata fra iperf3 |
|
Parametere, status ( |
|
Serverens logg med tidsstempel (logrotate: ukentlig, 8 uker, komprimert) |
ID-en er starttidspunktet ÅÅÅÅMMDD-TTMMSS (med -n ved kollisjon). Metadata skrives atomisk (midlertidig fil + os.replace). Når antallet passerer KEEP_TESTS, slettes de eldste.
4. Web-grensesnitt
4.1. Oppbygning
Siden følger stilen i SYSLOG-Tools(at)Work og SNMP-Trap-Tools(at)Work: mørkegrønn topplinje med ikon, navn, statusmerke og vertsnavn; ? Brukermanual og EN | NO til høyre; faner; Bootstrap-lignende skjemaelementer; bunnlinje med Lisenser · Tredjepartsmerknader · Brukermanual. Alt er skrevet for prosjektet – ingen eksterne skript, stilark, skrifttyper eller bilder – så sidene virker uten internett.
Fane |
Innhold |
Kjør test |
Nettverksoppsett, testparametere, avanserte valg, start/stopp, kommandolinje, fire fliser (siste intervall, snitt, maks, fremdrift), graf (to linjer ved |
Historikk |
Filtrerbar tabell over de 50 nyeste testene, utvidbare rader med kommando og sammendrag, nedlasting av logg, CSV-eksport (UTF-8 med BOM) |
Server |
Status per port (systemd + lyttende socket), antall forbindelser og motparter ( |
Fanene vises ut fra rollen (client: Kjør test og Historikk, server: Server, both: alle). Valgt fane huskes i adressen (#tab=). Lukkes nettleseren under en test, kobler siden seg til den pågående testen igjen ved neste besøk.
4.2. Språk (i18n)
Engelsk er kildespråket. i18n.js inneholder ordlisten engelsk → norsk og en motor som ved oppstart registrerer alle tekstnoder, placeholder, title og aria-label som finnes i ordlisten, og bytter dem når brukeren trykker EN eller NO. Tekster som lages av skript, bruker t('English text', {var}). Valget lagres i localStorage og en informasjonskapsel (iperf_by_web_lang). Uten lagret valg brukes UI_LANG fra konfigurasjonen (via /api/status).
API-et velger språk for feilmeldinger fra hodet X-UI-Lang (sendt av siden), ellers UI_LANG. Manualene og lisenssidene finnes som egne filer per språk (manual.html / manual.no.html, licenses.html / licenses.no.html); knappen ? Brukermanual åpner riktig språk og kapitlet for fanen (#s3, #s4, #s5). Utdata fra iperf3 oversettes ikke.
4.3. HTTP-API
Metode |
Sti |
Beskrivelse |
GET |
|
Modus, vertsnavn, IP, versjoner (API, iperf3, Caddy), pågående test, standardverdier, |
POST |
|
Starter en test (JSON, se validering). 200 |
POST |
|
Stopper pågående test (SIGINT, deretter SIGKILL) |
GET |
|
SSE: |
GET |
|
De 50 siste testene (uten PID) |
GET |
|
Loggen som |
GET |
|
Porter, systemd-status, lytter, forbindelser, motparter, loggutdrag (80 linjer) |
5. Sikkerhet
5.1. Trusselbilde
Iperf(at)Work er et administrasjonsverktøy for et lukket nett. Den viktigste risikoen er at noen uten tillatelse bruker web-GUI-et til å sende store mengder trafikk (fylle linjer) mot vilkårlige mål. Tiltakene under begrenser dette; web-GUI-et bør likevel bare være tilgjengelig fra et betrodd administrasjonsnett.
5.2. Tiltak i web-laget
Tiltak |
Beskrivelse |
Tilgang |
Valgfritt HTTP Basic-passord (bcrypt, kostnad 14) for hele nettstedet inkludert API-et ( |
CSRF |
Alle POST-forespørsler må ha |
Injeksjon |
iperf3 startes med argumentliste (ingen skall); alle felt valideres med hvitelister (se 3.2). Test-ID-er valideres ( |
XSS |
All tekst fra serveren settes inn med |
Hoder |
|
Ressurser |
Én test om gangen, varighet maks |
API-binding |
API-et lytter bare på 127.0.0.1:9000 og nås bare gjennom Caddy. Caddys admin-API lytter bare på localhost:2019. |
5.3. Prosessisolasjon (systemd)
Tjeneste |
Herding |
|
Bruker |
|
Bruker |
|
Bruker |
SELinux: tjenestene kjører som unconfined_service_t; installasjonen setter merking med restorecon.
5.4. Kjente begrensninger
-
Web-GUI-et bruker vanlig HTTP. Passordet (hvis brukt) sendes base64-kodet. Bruk et betrodd nett og
ADMIN_NET. HTTPS kan settes opp i Caddyfile med egne sertifikater (tls /sti/cert.pem /sti/key.pem). -
iperf3 er bygget uten OpenSSL, så iperf3s egen autentisering (
--username,--rsa-public-key-path) finnes ikke. iperf3-serveren tar imot tester fra alle som når portene; begrens med brannmuren. -
Én iperf3-server kan bare kjøre én test om gangen per port.
-
Med
-Bover loopback-aliaser feiler UDP-tester i iperf3 (gjelder bare testmiljøer, ikke ekte nettkort). -
Ingen brukerroller: alle som slipper inn, kan starte og stoppe tester.
6. Pakking og installasjon
6.1. RPM-pakkene
Pakke |
Arkitektur |
Innhold og avhengigheter |
|
x86_64 |
|
|
x86_64 |
|
|
noarch |
API, web-GUI, manualer, lisenssider, Caddyfile, konfigurasjon, systemd-enheter, |
Avhengighetene er skrevet slik at de løses både på Rocky/RHEL 9 og på Photon OS (boolske avhengigheter, rpm ≥ 4.13). Konfigurasjonsfiler er %config(noreplace).
6.2. Installert struktur
/etc/caddy/Caddyfile %config(noreplace)
/etc/caddy/iperf-by-web.d/ 0750 root:caddy (auth.caddy når passord er satt)
/etc/iperf-by-web/iperf-by-web.conf %config(noreplace)
/etc/logrotate.d/iperf-by-web
/usr/bin/caddy, /usr/bin/iperf3
/usr/libexec/iperf-by-web/iperf-api
/usr/sbin/iperf-by-web-ctl
/usr/share/iperf-by-web/html/ web-GUI, manual(.no).html, licenses(.no).html
/usr/share/iperf-by-web/uninstall.sh, lib/common.sh
/usr/share/doc/iperf-by-web/ dokumenter (no + en/ + img/)
/usr/share/licenses/{iperf-by-web,caddy,iperf3}/
/usr/lib/systemd/system/{caddy,iperf-api,iperf3-server@}.service
/var/lib/iperf-by-web/ 0750 iperf-by-web (tests/, server-<port>.log)
/var/lib/caddy, /var/log/caddy 0750 caddy
6.3. Installasjonsprogrammet
install.sh går gjennom sju steg: forutsetninger (arkitektur, plattform, systemd, rpm, Python ≥ 3.7, ss, useradd, runuser, sjekksummer, ledige porter), pakker (dnf --disablerepo='*' install eller rpm -Uvh; pakker med riktig versjon hoppes over), konfigurasjon (nye nøkler legges til i en eldre fil), passord, SELinux, iperf-by-web-ctl apply og verifisering (tjenester, selvtest, nåbarhet til standardserveren). Alle meldinger finnes på engelsk og norsk (--lang).
iperf-by-web-ctl apply validerer Caddyfile som brukeren caddy, stopper alle iperf3-server@-instanser og starter bare dem rollen krever, starter/laster API-et og Caddy på nytt og oppdaterer firewalld (fjerner gamle iperf-porter 5200–5299, åpner web-porten – eventuelt som rich rule for ADMIN_NET – og serverportene for tcp og udp).
7. Konfigurasjon
/etc/iperf-by-web/iperf-by-web.conf leses av API-et (systemd EnvironmentFile) og av iperf-by-web-ctl.
Nøkkel |
Standard |
Betydning |
|
|
|
|
|
Porter for |
|
|
Forhåndsutfylt i GUI-et |
|
|
Standardspråk for GUI, API-meldinger og |
|
tom |
Vist IP-adresse (tom: adressen som brukes mot |
|
|
Lengste test |
|
|
Tester i historikken |
|
|
API-adresse (også i Caddyfile) |
|
|
Web-port (brannmur; også i Caddyfile) |
|
|
firewalld styres av |
|
tom |
Web-porten åpnes bare for dette nettet |
|
|
Stier |
8. Drift
Oppgave |
Kommando |
Status |
|
Logg |
|
Rollebytte |
|
Passord |
|
Selvtest |
|
Omstart |
|
Avinstallering |
|
Diskbruk: én test tar typisk 2–20 KB (logg + metadata); 200 tester under 5 MB. Serverloggene rulleres ukentlig.
9. Bygging og kvalitetssikring
9.1. Bygging
Verktøy |
Gjør |
|
Bygger iperf3 fra |
|
Leser modullisten i caddy ( |
|
Lager |
|
Lager |
|
Starter hele stakken lokalt, kjører ekte tester og tar skjermbilder på begge språk (Playwright) |
|
Bygger de tre RPM-ene (reproduserbart tidsstempel) |
|
Alt over + selvtest + |
9.2. Selvtest
python3 tools/selftest.py kjører statiske kontroller (Python- og bash-syntaks, ShellCheck, versjonsnumre, oversettelsesdekning, ingen eksterne ressurser, dokumenter), enhetstester av sammendragstolkingen, integrasjonstester mot et ekte API og en ekte iperf3-server (TCP, UDP, --bidir, SSE, stopp, feilet test, validering, CSRF, keep-alive, språk, historikk) og pakketester (navn, versjoner, avhengigheter, filer). Se Revisjonsrapport.md for resultatene.