Ga naar hoofdinhoud

Poorten

Een IP-adres brengt een pakket tot bij het juiste toestel. Maar op dat toestel draaien tientallen programma's tegelijk: een browser, een dev server, een databank, een mailclient. Wie krijgt dat pakket?

Daarvoor dient het poortnummer. Het IP-adres wijst het gebouw aan, de poort de juiste deur.

193.190.253.10 : 443
└─── welk toestel ──┘ └─ welk programma ─┘

Een poort is een getal van 16 bits​

Poortnummers lopen van 0 tot 65535. Dat is geen willekeurige grens: het veld in de TCP- en UDP-header is 16 bits groot, en 2¹⁶ geeft precies 65 536 mogelijkheden.

Ze zijn opgedeeld in drie zones:

BereikNaamWaarvoor
0 – 1023Well-known portsVaste diensten: HTTP, HTTPS, SSH, DNS. Op Linux en macOS heb je beheerdersrechten nodig om er een te gebruiken
1024 – 49151Registered portsToegekend aan software: databanken, dev servers, applicaties
49152 – 65535Dynamische poortenTijdelijk toegekend aan uitgaande verbindingen

Die laatste groep zie je zelden bewust, maar je gebruikt ze constant. Als je browser een pagina opvraagt, krijgt hij zelf een willekeurige poort toegewezen om het antwoord op te ontvangen:

jouw laptop 192.168.0.14:53412 ──► 193.190.253.10:443
▲ ▲
tijdelijke bronpoort vaste doelpoort (HTTPS)
Een verbinding bestaat uit vier gegevens

Bron-IP, bronpoort, doel-IP en doelpoort. Die combinatie heet een socket, en ze is uniek. Daarom kan je tien tabbladen naar dezelfde site open hebben: het doel is telkens hetzelfde, maar elke verbinding heeft een eigen bronpoort.

Veelgebruikte poorten​

PoortProtocolWaarvoor
20 / 21FTPBestandsoverdracht (verouderd, onversleuteld)
22SSH / SFTPBeveiligd inloggen op een server, git push via SSH
25SMTPMail tussen servers
53DNSDomeinnamen opzoeken
80HTTPOnversleuteld web
143 / 993IMAPMail ophalen (993 = versleuteld)
443HTTPSVersleuteld web
587SMTPMail versturen vanuit je mailclient
3306MySQL / MariaDBDatabank
5432PostgreSQLDatabank
6379RedisCache
27017MongoDBDatabank
3000 / 5173 / 8000 / 8080–Dev servers (Node, Vite, Python, Java)

De eerste vier rijen en 443 ken je best uit het hoofd. De rest zoek je op wanneer je ze nodig hebt.

Daarom hoef je de poort zelden te typen

Het scheme in een URL bepaalt de standaardpoort: http:// gaat naar 80, https:// naar 443. https://ap.be en https://ap.be:443 zijn identiek. Zie ook URI's en URL's.

De poort van je eigen dev server​

http://localhost:5173 bevat alle informatie die je nodig hebt om te begrijpen wat er gebeurt:

OnderdeelBetekenis
httpOnversleuteld, dus standaard poort 80 …
localhost… maar het verkeer blijft op je eigen toestel
5173… en gaat naar het programma dat op poort 5173 luistert: je dev server

De poort staat er expliciet bij omdat 5173 niet de standaard is. Zou je server op poort 80 luisteren, dan volstond http://localhost.

Een dev server claimt die poort zodra hij start. Vanaf dat moment is ze bezet voor elk ander programma:

npm run dev -- --port 3001 # Vite op een andere poort
python -m http.server 8001 # Python op 8001 in plaats van 8000
Port already in use
Error: listen EADDRINUSE: address already in use :::5173

Dit betekent altijd hetzelfde: een ander proces houdt die poort al vast. Meestal is dat een dev server uit een vorige sessie die nog draait. Twee oplossingen: kies een andere poort, of zoek het proces op en sluit het af. Hoe je dat proces vindt, staat hieronder.

Kijken welke poorten actief zijn​

BesturingssysteemCommando
Windowsnetstat -ano
Linuxss -tulpn (ouder: netstat -tulpn)
macOSlsof -i -P -n

Beperk je tot wat luistert, dan is de uitvoer meteen leesbaar:

netstat -ano | findstr LISTENING # Windows
ss -tulpn | grep LISTEN # Linux
Proto Lokaal adres Extern adres Status PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1064
TCP 127.0.0.1:5173 0.0.0.0:0 LISTENING 6724
TCP 192.168.0.14:53412 93.184.216.34:443 ESTABLISHED 9120

Elke kolom vertelt iets:

KolomWat je eruit leest
ProtoTCP of UDP
Lokaal adresOp welk adres én welke poort dit proces luistert. 127.0.0.1 betekent enkel bereikbaar op dit toestel, 0.0.0.0 betekent op alle interfaces
Extern adresBij een lopende verbinding: met wie. Bij een luisterende poort staat hier niets zinvols
StatusLISTENING: wacht op verbindingen. ESTABLISHED: er loopt er een
PIDHet procesnummer, waarmee je uitzoekt welk programma het is

Van PID naar programmanaam:

Get-Process -Id 6724 # Windows (PowerShell)
tasklist | findstr 6724 # Windows (cmd)

# Output:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
1346 940 108504 140204 6724 0 nordvpn-service
ps -p 6724 # macOS en Linux

En zo sluit je een vergeten dev server af:

Stop-Process -Id 6724 # Windows
kill 6724 # macOS en Linux
Twee dingen die je nu meteen kan verklaren
  • Je dev server luistert op 127.0.0.1:5173 en je klasgenoot geraakt er niet aan. Logisch: hij luistert enkel op loopback. Start hem met --host en het lokale adres verschijnt in de lijst. Zie ook IP-adressering.
  • Je krijgt EADDRINUSE. In de lijst zie je welk PID de poort vasthoudt, en met Get-Process welk programma dat is.

Gesloten poorten en firewalls​

Een firewall beslist welk verkeer een poort mag bereiken. Dat verklaart het verschil tussen twee foutmeldingen die je vaak ziet:

Wat je merktWat er waarschijnlijk gebeurt
Meteen connection refusedHet toestel is bereikbaar, maar niets luistert op die poort
Lange stilte, dan een time-outEen firewall laat het verkeer stilletjes vallen

Servers laten daarom bewust maar enkele poorten open: 443 voor het web, 22 voor beheer. Een databank op 3306 die van het hele internet bereikbaar is, is een klassieke inbraakroute.

Test jezelf​

1. Welke rol speelt het getal 5173 in `http://localhost:5173`?

2. In de uitvoer van netstat zie je `TCP 127.0.0.1:5173 ... LISTENING`. Wat betekent dat?

3. Je start je dev server en krijgt `EADDRINUSE`. Wat is er aan de hand?

4. Waarom heeft je browser bij elke verbinding een andere bronpoort?

Onthoud
  • Een poort is een getal van 0 tot 65535 dat zegt welk programma op een toestel het verkeer krijgt.
  • 0–1023 zijn de well-known poorten (80 HTTP, 443 HTTPS, 22 SSH, 53 DNS); hogere nummers zijn voor toepassingen en tijdelijke verbindingen.
  • Een verbinding wordt bepaald door vier gegevens: bron-IP, bronpoort, doel-IP, doelpoort.
  • Met netstat -ano, ss -tulpn of lsof -i zie je welke poorten luisteren, en met welk PID.
  • LISTENING op 127.0.0.1 betekent enkel lokaal bereikbaar; op 0.0.0.0 ook voor andere toestellen.
  • EADDRINUSE betekent dat een ander proces de poort al vasthoudt.