ss-commando: poorten en processen controleren in Linux, vergeleken met netstat
Welke poorten op een Linux-server open staan en wie er verbonden is, controleer je met het ss-commando. ss is de socket-opvraagtool van iproute2 die netstat vervangt. Bij het opvragen van luisterende (LISTEN) poorten en verbindingen met ss op een Debian 12-server bleek dat vanaf een gewoon account de namen van programma's die andere accounts hebben gestart niet in de kolom Process verschijnen, ook niet met -p.
De uitvoer hieronder is gemaakt met een Engelse locale. De adressen van de server en van de andere kant zijn als voorbeeldadressen weergegeven.
1️⃣ Basisgebruik van het ss-commando en kolommen in de uitvoer
Als je ss zonder opties uitvoert, vallen de luisterende poorten weg en zie je alleen sockets met een opgebouwde verbinding. Op de testserver waren de eerste regels allemaal Unix-sockets (u_str, u_dgr) waarmee programma's binnen de server met elkaar praten.
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199Wil je alleen TCP-verbindingen zien, voeg dan -t toe. De Unix-sockets vallen weg en op de plek van de poort staan servicenamen zoals ssh en https in plaats van nummers.
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:httpsVoeg je ook -n toe, dan blijven de poortnummers staan en worden ze niet omgezet in servicenamen.
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Recv-Q en Send-Q betekenen iets anders afhankelijk van de status van de socket. Bij een verbonden socket is Recv-Q het aantal ontvangen bytes dat het programma nog niet heeft gelezen, en Send-Q het aantal verzonden bytes waarvan de andere kant de ontvangst nog niet heeft bevestigd.
Bij een luisterende socket is Recv-Q het aantal verbindingen in de wachtrij en Send-Q de maximale grootte van de wachtrij. Deze betekenissen komen uit de man-pagina netstat(8) van net-tools.
2️⃣ Poorten controleren in Linux (-tln, -uln, -tulpn)
De uitvoer zonder opties toont geen poorten die op verbindingen wachten. Om open poorten te controleren voeg je daarom -l toe, dat alleen luisterende sockets selecteert. [ss -tln] toont de luisterende TCP-poorten als nummers.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Staat bij Local Address 0.0.0.0, dan accepteert de socket verbindingen op alle IPv4-adressen van de server; bij 127.0.0.1 kun je alleen vanaf de server zelf verbinden. [::] staat voor alle IPv6-adressen, dus de poorten 22, 80 en 443 staan zowel via IPv4 als via IPv6 open.
Zonder -n worden de poortnummers servicenamen. Poort 8080 verschijnt als http-alt.
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP bouwt geen verbindingen op, dus ook luisterende sockets hebben geen LISTEN-status. In de statuskolom van de uitvoer van [ss -uln] stond overal UNCONN. Poort 68 (bootpc) is de DHCP-client en poort 123 (ntp) is de poort voor tijdsynchronisatie.
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*Om TCP en UDP in één keer te zien, voeg je de opties samen, zoals in [ss -tulpn]. Zodra er meer dan één soort wordt getoond, komt er vooraan een kolom Netid bij.
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ Processen controleren met het ss-commando (-p)
-p is de optie die het programma dat een socket gebruikt in de kolom Process toont. Toen [ss -tlnp] echter vanaf een gewoon account op de testserver werd uitgevoerd, bleef de kolom Process leeg zoals hieronder, alsof de optie niet werkte.
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss zoekt het proces achter een socket door voor elk proces de map fd onder /proc te lezen. Een gewoon account kan de fd-map van een proces dat een ander account heeft gestart niet openen, dus de naam van dat programma komt niet in de kolom. Als je vanaf een gewoon account de map van proces 1 opent, dat door root is gestart, krijg je een fout over rechten.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedProgramma's die je met je eigen account hebt gestart, verschijnen ook vanaf een gewoon account in de kolom Process. Dat is gecontroleerd door de eenvoudige webserver van python3 op poort 8000 van 127.0.0.1 te starten.
python3 -m http.server 8000 --bind 127.0.0.1 &Voeg na het starten [sport = :8000] toe om alleen de regel van poort 8000 op te vragen.
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))Tussen de haakjes na users staan achter elkaar de programmanaam, de pid en het nummer van de bestandsdescriptor (fd).
Ben je klaar met controleren, stop de eenvoudige webserver dan met [kill %1]. Voer je daarna [ss -tln sport = :8000] opnieuw uit, dan blijft alleen de kopregel over en verschijnt de regel van poort 8000 niet meer.
Vanaf het root-account kan ss de gegevens van alle processen lezen, dus wordt de kolom Process gevuld. Luisteren meerdere processen samen op één poort, dan staat er tussen de haakjes van users voor elk proces een vermelding. De programmanamen en pid's in de root-uitvoer hieronder zijn voorbeeldwaarden.
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))Om een programma te vinden aan de hand van het poortnummer, kun je ook het lsof-commando gebruiken in de vorm [lsof -i :443].
Hoe de kolom Process per account verandert, kun je in het diagram hieronder vergelijken door van account te wisselen.
4️⃣ ss-filteropties voor status en poort
Ook nadat je de open poorten hebt gecontroleerd, moet je apart uitzoeken wie er op dit moment met die poorten verbonden is. ss houdt alleen de gewenste regels over als je na de opties filtervoorwaarden toevoegt.
Zet je na state de naam van een status, dan blijven alleen de sockets met die status over. De uitvoer van [ss -tn state established] heeft geen kolom State en begint bij de kolom Recv-Q.
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443Poorten filter je met dport (poort van de andere kant) en sport (eigen poort). Verbindingen die van de server naar externe https-servers gaan, selecteer je met [dport = :443].
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Gebruik je sport samen met -l, dan controleer je alleen of die poort luistert.
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*Meerdere voorwaarden combineer je met haakjes en or, en je zet ze tussen enkele aanhalingstekens zodat de shell de haakjes niet eerst leest. Hieronder zie je het resultaat waarbij volgens het voorbeeld uit de man-pagina alleen ssh-verbindingen zijn geselecteerd.
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT is de status waarin een verbinding nog even blijft nadat ze is verbroken. Die verschijnt niet in de standaarduitvoer, dus je ziet hem alleen als je hem apart selecteert met [state time-wait].
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80Typ je een statusnaam verkeerd, dan stopt het commando meteen met één foutregel [wrong state name]. Hieronder zie je het resultaat met opzettelijk ingevoerde foo. De bruikbare namen staan op de regel TCP-STATES in de uitvoer van [ss -h].
ss -tn state fooss: wrong state name: foo📌 Belangrijkste opties: resultaten uit dit artikel
| Optie | Taak | Resultaat in dit artikel | |
|---|---|---|---|
| -t | Toont alleen TCP-sockets | Unix-sockets vallen weg en op de plek van de poort staan servicenamen zoals ssh en https | |
| -n | Toont poortnummers in plaats van servicenamen | In ss -tn verschijnt ssh als 22 en https als 443 | |
| -l | Toont alleen luisterende (LISTEN) sockets | ss -tln toont luisterende poorten zoals 22, 80 en 443 | |
| -u | Toont alleen UDP-sockets | In de statuskolom van ss -uln staat overal UNCONN | |
| -p | Toont het programma achter elke socket in de kolom Process | Vanaf een gewoon account toont alleen de door mijn account gestarte python3 een naam en pid; programma's van andere accounts blijven leeg | |
| -s | Vat het aantal per soort samen in plaats van sockets op te sommen | estab 9 op de TCP-regel komt overeen met de 9 regels van de uitvoer van state established zonder kopregel | |
| -4 | Toont alleen IPv4-sockets | In ss -t4ln vallen de regels weg die met [::] beginnen | |
| -6 | Toont alleen IPv6-sockets | In ss -t6ln vallen de regels weg die met 0.0.0.0 en 127.0.0.1 beginnen | |
| -H | Toont alleen socketregels, zonder kopregel | Het aantal regels van ss -H -tln | wc -l telt de kopregel niet mee | |
| state STATUS | Houdt alleen sockets met die status over | De uitvoer van state established begint zonder kolom State bij Recv-Q; een onbekende naam geeft [wrong state name: foo] | |
| dport = :POORT | Filtert op de poort van de andere kant | dport = :443 toont twee regels met verbindingen naar externe https-servers | |
| sport = :POORT | Filtert op de eigen poort | sport = :22 samen met -l toont twee luisterende regels voor poort 22, IPv4 en IPv6 | |
| src ADRES | Houdt alleen sockets op dat adres over | ss -tln src 127.0.0.1 toont alleen de poorten op 127.0.0.1, die alleen verbindingen vanaf de server zelf accepteren |
📎 Andere opties: volgens de officiële handleiding
| Optie | Taak | |
|---|---|---|
| -a, --all | Toont luisterende en verbonden sockets samen | |
| -r, --resolve | Zet adressen en poortnummers om in namen | |
| -e, --extended | Toont per socket uitgebreide gegevens zoals uid en inode | |
| -o, --options | Toont timergegevens zoals TCP-hertransmissie en keepalive | |
| -m, --memory | Toont het geheugen dat elke socket gebruikt | |
| -i, --info | Toont interne TCP-gegevens (rtt, cwnd enzovoort) | |
| -x, --unix | Toont alleen Unix-domeinsockets | |
| -w, --raw | Toont alleen RAW-sockets | |
| -f FAMILIE | Selecteert op socketfamilie, zoals unix, inet, inet6, link of netlink | |
| -Q, --no-queues | Toont de uitvoer zonder de kolommen Recv-Q en Send-Q | |
| -K, --kill | Sluit sockets die aan het filter voldoen geforceerd; sockets die de kernel niet ondersteunt worden overgeslagen | |
| -E, --events | Toont doorlopend sockets die worden gesloten | |
| -V, --version | Toont versie-informatie |
🔲 ss-commando-simulator
In de simulator hieronder kun je de tot nu toe behandelde opties en filters zelf invoeren en de uitvoer vergelijken met [netstat -tln].
5️⃣ ss-socketoverzicht (-s)
-s toont in plaats van de socketlijst een overzicht van het aantal per soort. Volgens de man-pagina telt het de lijst niet één voor één, maar verzamelt het de getallen uit verschillende statistieken.
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0estab op de TCP-regel is het aantal verbindingen dat nu is opgebouwd. Daarom kun je het vergelijken met het aantal regels dat [state established] op hetzelfde moment toont.
ss -tn state established | wc -l10Haal je de ene kopregel van de 10 uitvoerregels af, dan blijven er 9 over, gelijk aan estab 9 van -s. timewait 13 is het aantal TIME-WAIT-sockets, die alleen zichtbaar waren als je ze selecteerde met [state time-wait].
6️⃣ ss-commando vergeleken met netstat
netstat zit in het pakket net-tools, waarvan de man-pagina netstat een nauwelijks nog gebruikt programma (mostly obsolete) noemt en aanraadt om ss te gebruiken. Scripts die zijn geschreven voor de uitvoervorm van netstat kunnen de uitvoer van ss echter niet zomaar lezen, omdat de kolomvolgorde en de schrijfwijze van adressen verschillen.
Toen de luisterende TCP-poorten van dezelfde server met beide commando's werden getoond, zette netstat de status helemaal achteraan en schreef het IPv6-adressen als :::22.
netstat -tlnActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENBij ss staat de status vooraan en worden IPv6-adressen tussen vierkante haken gezet, zoals [::]:22.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Veelgebruikte netstat-opties komen overeen met de volgende ss- en ip-commando's.
| netstat | Vervangend commando / wat het toont |
|---|---|
| netstat -tln | ss -tlnLuisterende TCP-poorten als nummers |
| netstat -tulpn | ss -tulpnLuisterende TCP- en UDP-poorten met programma's |
| netstat -tan | ss -tanAlle TCP-sockets als nummers |
| netstat -r | ip routeRouteringstabel |
| netstat -i | ip -s linkStatistieken van netwerkinterfaces |
🔢 FAQ & aanbevolen content











ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.