Netstat på Linux: Komplett guide med eksempler

Linux-kommandoen `netstat` gir deg en mengde verdifull informasjon om nettverkstilkoblinger, aktive porter og prosessene som benytter seg av dem. La oss utforske hvordan du kan bruke dette kraftige verktøyet.

Porter, Prosesser og Protokoller

Nettverkskontakter kan være etablert eller vente på en innkommende tilkobling. Disse tilkoblingene benytter nettverksprotokoller som Transmission Control Protocol (TCP) eller User Datagram Protocol (UDP). For å opprette forbindelser, brukes Internet Protocol-adresser og nettverksporter.

Begrepet «socket» kan bringe tankene til et fysisk koblingspunkt, men i denne sammenhengen er en socket en programvarekomponent som håndterer en av endene i en nettverksdatatilkobling.

Sockets har to hovedtilstander: enten er de tilkoblet og muliggjør aktiv nettverkskommunikasjon, eller de venter på en innkommende tilkobling. Det finnes andre, mer midlertidige tilstander under etableringen av en forbindelse, men i hovedsak kan du tenke på en socket som enten koblet til eller lyttende.

En lyttende socket er kjent som en server, mens en socket som ber om en forbindelse, kalles en klient. Disse begrepene refererer ikke til maskinvare eller datamaskinens rolle, men definerer funksjonen til hver socket i den aktuelle forbindelsen.

Med `netstat`-kommandoen kan du finne ut hvilke sockets som er tilkoblet og hvilke som lytter. Dette gir innsikt i hvilke porter som er i bruk og hvilke prosesser som benytter dem. Den kan også vise rutingstabeller og statistikk knyttet til ditt nettverksgrensesnitt og multicast-tilkoblinger.

Over tid har flere Linux-verktøy replikert funksjonaliteten til `netstat`, som for eksempel ip og ss. Likevel er `netstat` fortsatt et verdifullt verktøy å kjenne til, ettersom det er tilgjengelig på alle Linux- og Unix-baserte systemer, samt på Windows og Mac.

La oss utforske hvordan du bruker `netstat`, komplett med eksempler.

Vis Alle Sockets

Med `-a`-alternativet (alle), viser `netstat` både tilkoblede og lyttende sockets. Resultatet vil ofte være en lang liste, så det er vanlig å benytte `less` for å bla gjennom utdataene.

netstat -a | less

Denne listen omfatter TCP (IP), TCP6 (IPv6) og UDP-kontakter.

Skjermens formatering kan gjøre det litt vanskelig å tolke informasjonen. Her er et utdrag fra listen:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address State
tcp        0      0 localhost:domain  0.0.0.0:*       LISTEN
tcp        0      0 0.0.0.0:ssh       0.0.0.0:*       LISTEN
tcp        0      0 localhost:ipp     0.0.0.0:*       LISTEN
tcp        0      0 localhost:smtp    0.0.0.0:*       LISTEN
tcp6       0      0 [::]:ssh          [::]:*          LISTEN
tcp6       0      0 ip6-localhost:ipp [::]:*          LISTEN
.
.
.
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags   Type     State       I-Node  Path
unix  24     [ ]     DGRAM                12831   /run/systemd/journal/dev-log
unix  2      [ ACC ] STREAM    LISTENING  24747   @/tmp/dbus-zH6clYmvw8
unix  2      [ ]     DGRAM                26372   /run/user/1000/systemd/notify
unix  2      [ ]     DGRAM                23382   /run/user/121/systemd/notify
unix  2      [ ACC ] SEQPACKET LISTENING  12839   /run/udev/control

«Active Internet»-seksjonen viser aktive eksterne tilkoblinger og lokale sockets som venter på tilkoblingsforespørsler fra eksterne enheter. Det vil si, den viser nettverkstilkoblingene som er etablert (eller i ferd med å bli det) med eksterne enheter.

«UNIX domain»-delen viser interne tilkoblinger mellom applikasjoner, prosesser og elementer i operativsystemet.

Kolonnene i «Active Internet»-seksjonen betyr følgende:

Proto: Protokollen som brukes (f.eks. TCP eller UDP).
Recv-Q: Mottakskøen. Dette er innkommende bytes som er mottatt og bufret, men venter på at den lokale prosessen skal lese dem.
Send-Q: Sendekøen. Viser bytes som er klare til å sendes.
Local Address: Lokal adresseinformasjon for den lokale enden av tilkoblingen. Som standard viser `netstat` vertsnavn og tjenestenavn for porten.
Foreign Address: Adresse og portnummer for den eksterne enden av forbindelsen.
State: Tilstanden til den lokale socket. For UDP-sockets vil dette ofte være blankt. (Se tilstandstabellen nedenfor).

For TCP-tilkoblinger kan tilstanden være en av følgende:

LISTEN: Kun serversiden. Socketen venter på en tilkoblingsforespørsel.
SYN-SENT: Kun klientsiden. Socketen har sendt en tilkoblingsforespørsel og venter på bekreftelse.
SYN-RECEIVED: Kun serversiden. Socketen har akseptert en tilkoblingsforespørsel og venter på bekreftelse.
ESTABLISHED: Server og klienter. En fungerende forbindelse er etablert, og data kan overføres.
FIN-WAIT-1: Server og klienter. Socketen venter på en forespørsel om tilkoblingsavslutning fra den andre siden, eller på en bekreftelse på en avslutningsforespørsel sendt tidligere.
FIN-WAIT-2: Server og klienter. Socketen venter på en forespørsel om tilkoblingsavslutning fra den andre siden.
CLOSE-WAIT: Server og klient. Socketen venter på at den lokale brukeren skal lukke tilkoblingen.
CLOSING: Server og klienter. Socketen venter på en bekreftelse på en tilkoblingsavslutningsforespørsel fra den andre enden.
LAST-ACK: Server og klient. Socketen venter på en bekreftelse på forespørselen om tilkoblingsavslutning som den sendte til den andre siden.
TIME-WAIT: Server og klienter. Socketen sendte en bekreftelse på at den mottok en forespørsel om tilkoblingsavslutning, og venter på bekreftelse på at den er mottatt.
CLOSED: Ingen tilkobling, socketen er terminert.

Kolonnene i «Unix domain»-seksjonen betyr følgende:

Proto: Protokollen som brukes. Dette vil alltid være «unix».
RefCnt: Antall tilkoblede prosesser som bruker denne socketen.
Flagg: Ofte satt til «ACC», som indikerer at socketen venter på en tilkoblingsforespørsel. «W» indikerer at data venter på å bli lest, og «N» at det ikke er plass til å skrive data til socketen.
Type: Sokkeltypen. (Se typetabellen nedenfor).
State: Tilstanden til socketen. (Se tilstandstabellen nedenfor).
I-Node: Filsystemets inode for socketen.
Path: Filsystembanen til socketen.

Mulige Unix-domenesokkeltyper:

DGRAM: Socketen bruker datagrammodus med meldinger av fast lengde. Datagrammer er ikke garantert pålitelige, sekvenserte eller udupliserte.
STREAM: En vanlig «normal» type socket. Disse er designet for pålitelig, sekvensert levering av pakker.
RAW: Brukes som en rå socket. Disse opererer på nettverksnivået til OSI-modellen og omgår TCP- og UDP-hoder.
RDM: Plassert i den ene enden av en pålitelig meldingsforbindelse.
SEQPACKET: En annen måte å sikre pålitelig, sekvensert og uduplisert pakkelevering.
PAKKE: Raw interface access socket. Brukes for å motta og sende råpakker på enhetsdrivernivået (datalinklaget) av OSI-modellen.

Mulige tilstander for Unix-domenesockets:

FREE: Socketen er ikke tildelt.
LISTENING: Socketen venter på innkommende tilkoblingsforespørsler.
CONNECTING: Socketen er i ferd med å koble til.
CONNECTED: En forbindelse er opprettet, og socketen kan motta og sende data.
DISCONNECTING: Forbindelsen er i ferd med å avsluttes.

Det er mye informasjon å fordøye! Mange av `netstat`s alternativer avgrenser resultatene, men endrer ikke selve innholdet. La oss se nærmere.

Filtrere Sockets etter Type

Ofte gir `-a` for mye informasjon. Om du kun vil se TCP-sockets, kan du bruke `-t`-alternativet (TCP). Dette begrenser utdataene til kun TCP-sockets.

netstat -at | less

Resultatet er betydelig redusert. De få socketene som vises, er alle TCP-sockets.

Alternativene `-u` (UDP) og `-x` (UNIX) fungerer på samme måte, og begrenser resultatene til den spesifiserte sokkeltypen. Her er `-u`-alternativet i bruk:

netstat -au | less

Kun UDP-sockets vises.

Filtrere Sockets etter Tilstand

For å se sockets som er i lytte- eller ventemodus, brukes `-l`-alternativet (lytting).

netstat -l | less

Resultatet viser kun sockets som er i lyttemodus.

Dette kan kombineres med `-t` (TCP), `-u` (UDP) og `-x` (UNIX) for å begrense resultatene ytterligere. La oss se etter TCP-sockets i lyttemodus:

netstat -lt | less

Nå ser vi kun TCP-sockets som lytter.

Nettverksstatistikk etter Protokoll

For å se statistikk for en bestemt protokoll, bruk `-s`-alternativet (statistikk) i kombinasjon med `-t` (TCP), `-u` (UDP) eller `-x` (UNIX). Hvis du bruker `-s` alene, vises statistikk for alle protokoller. La oss undersøke statistikken for TCP-protokollen.

netstat -st | less

En samling statistikk for TCP-forbindelser vises.

Vis Prossesnavn og PID-er

Det kan være nyttig å se prosess-ID (PID) og navnet på prosessene som benytter en socket. `-p`-alternativet (program) viser akkurat det. La oss se hvilke PID-er og prosessnavn som gjelder for prosessene som bruker en TCP-socket i lyttemodus. Vi benytter `sudo` for å sikre at vi får tilgang til all tilgjengelig informasjon, inkludert den som krever root-rettigheter.

sudo netstat -p -at

Her er utdataene i en tabell:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address       Foreign Address   State    PID/Program name
tcp      0        0 localhost:domain    0.0.0.0:*         LISTEN   6927/systemd-resolv
tcp      0        0 0.0.0.0:ssh         0.0.0.0:*         LISTEN   751/sshd
tcp      0        0 localhost:ipp       0.0.0.0:*         LISTEN   7687/cupsd
tcp      0        0 localhost:smtp      0.0.0.0:*         LISTEN   1176/master
tcp6     0        0 [::]:ssh            [::]:*            LISTEN   751/sshd
tcp6     0        0 ip6-localhost:ipp   [::]:*            LISTEN   7687/cupsd
tcp6     0        0 ip6-localhost:smtp  [::]:*            LISTEN   1176/master

Vi har nå en ekstra kolonne kalt «PID/Program name». Denne kolonnen viser PID-en og navnet på prosessen som benytter hver av socketene.

Vis Numeriske Adresser

For å fjerne tvetydighet, kan vi vise lokale og eksterne adresser som IP-adresser i stedet for deres løste domenenavn og vertsnavn. Med `-n`-alternativet (numerisk), vises IPv4-adresser i desimalformat:

sudo netstat -an | less

IP-adressene vises nå som numeriske verdier. Portnumre vises også, separert med et kolon «:» fra IP-adressen.

En IP-adresse på `127.0.0.1` indikerer at socketen er bundet til loopback-adressen til den lokale datamaskinen. IP-adressen `0.0.0.0` kan tolkes som standardruten for lokale adresser, og «en hvilken som helst IP-adresse» for eksterne adresser. IPv6-adresser vist som `::` er også null-adresser.

Portene som vises, kan enkelt sjekkes for å se hva de normalt brukes til:

22: Secure Shell (SSH) lyttport.
25: Simple Mail Transfer Protocol (SMTP) lyttport.
53: Domain Name System (DNS) lyttport.
68: Dynamic Host Configuration Protocol (DHCP) lyttport.
631: Common UNIX Printing System (CUPS) lyttport.

Viser Rutingstabellen

`-r`-alternativet (rute) viser kjernens rutingstabell.

sudo netstat -r

Her er utdataene i en mer oversiktlig tabell:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS  Window   irtt   Iface
default         Vigor.router    0.0.0.0         UG      0   0        0    enp0s3
link-local      0.0.0.0         255.255.0.0     U       0   0        0    enp0s3
192.168.4.0     0.0.0.0         255.255.255.0   U       0   0        0    enp0s3

Kolonnene betyr følgende:

Destination: Destinasjonsnettverk eller destinasjonsvert (om destinasjonen ikke er et nettverk).
Gateway: Gateway-adressen. En stjerne «*» vises hvis ingen gateway er definert.
Genmask: Subnettmasken for ruten.
Flagg: (Se flaggtabellen nedenfor).
MSS: Standard maksimal segmentstørrelse for TCP-forbindelser over denne ruten. Dette er den største mengden data som kan overføres i ett TCP-segment.
Window: Standard vindusstørrelse for TCP-forbindelser over denne ruten, som indikerer antall pakker som kan overføres og mottas før mottaksbufferen er full.
irtt: Initial Round Trip Time. Denne verdien brukes av kjernen for dynamisk å justere TCP-parametere for langsomme forbindelser.
Iface: Nettverksgrensesnittet som pakker overføres fra.

Flaggverdien kan være en av disse:

U: Ruten er oppe.
H: Målet er en vert og den eneste mulige destinasjonen for denne ruten.
G: Bruk gatewayen.
R: Gjenopprett ruten for dynamisk ruting.
D: Dynamisk installert av rutingsdemonen.
M: Modifisert av rutingsdemonen etter mottak av en Internet Control Message Protocol (ICMP) pakke.
A: Installert av addrconf, den automatiske DNS- og DHCP-konfigurasjonsfilgeneratoren.
C: Cache-oppføring.
!: Avvis rute.

Finne Porten Brukt av en Prosses

Ved å sende utdataene fra `netstat` gjennom `grep`, kan vi søke etter en bestemt prosess og identifisere porten den bruker. Vi bruker `-a` (alle), `-n` (numerisk) og `-p` (program), som tidligere, og søker etter «sshd».

sudo netstat -anp | grep "sshd"

`grep` finner målstrengen, og vi ser at `sshd`-demonen bruker port 22.

Vi kan også gjøre dette omvendt. Om vi søker etter `:22`, kan vi finne ut hvilken prosess som bruker denne porten.

sudo netstat -anp | grep ":22"

`grep` finner målstrengen, og vi ser at prosessen som bruker port 22, er `sshd`-demonen med prosess-ID 751.

List Opp Nettverksgrensesnitt

Alternativet `-i` (grensesnitt) viser en tabell over nettverksgrensesnitt som `netstat` kan oppdage.

sudo netstat -i

Her er utdataene i en tabell:

Kernel Interface table
Iface    MTU   RX-OK   RX-ERR  RX-DRP  RX-OVR    TX-OK   TX-ERR  TX-DRP  TX-OVR Flg
enp0s3  1500  4520671  0      0      0     4779773  0      0      0   BMRU
lo      65536  30175  0      0      0     30175  0      0      0   LRU

Kolonnene betyr følgende:

Iface: Navnet på grensesnittet. `enp0s3`-grensesnittet er nettverksgrensesnittet mot omverdenen, mens `lo`-grensesnittet er loopback-grensesnittet. Loopback-grensesnittet gjør det mulig for prosesser å kommunisere med hverandre på samme datamaskin via nettverksprotokoller, selv om datamaskinen ikke er koblet til et nettverk.
MTU: Maksimal overføringsenhet (MTU). Dette er den største «pakken» som kan sendes. Den består av et hode med rute- og protokollflagg samt annen metadata, og selve dataene.
RX-OK: Antall mottatte pakker uten feil.
RX-ERR: Antall mottatte pakker med feil. Vi ønsker at dette skal være så lavt som mulig.
RX-DRP: Antall pakker som er droppet (dvs. tapt). Dette tallet bør også være så lavt som mulig.
RX-OVR: Antall pakker som er tapt på grunn av overløp ved mottak. Dette betyr at mottaksbufferen var full, og mer data måtte forkastes. Lavest mulig verdi er best.
TX-OK: Antall pakker som er overført uten feil.
TX-ERR: Antall pakker overført med feil. Ideelt sett bør dette være null.
TX-DRP: Antall pakker som ble droppet under overføring. Ideelt sett bør dette også være null.
TX-OVR: Antall pakker tapt på grunn av overløp under overføring. Dette betyr at sendebufferen var full og ikke kunne akseptere mer data.
Flg: Flagg (se flaggtabellen nedenfor).

Flaggenes betydning er som følger:

B: En kringkastingsadresse er i bruk.
L: Dette grensesnittet er en loopback-enhet.
M: Alle pakker mottas (dvs. i promiskuøs modus). Ingenting filtreres eller forkastes.
O: Address Resolution Protocol (ARP) er slått av for dette grensesnittet.
P: Dette er en Point-to-Point (PPP) tilkobling.
R: Grensesnittet kjører.
U: Grensesnittet er oppe.

Liste Multicast-gruppemedlemskap

Enkelt forklart, multicast-overføring gjør det mulig å sende én pakke til flere mottakere samtidig. Dette er en effektiv metode for tjenester som videostrømming.

Med `-g`-alternativet (grupper) lister `netstat` multicast-gruppemedlemskapet til sockets på hvert grensesnitt.

sudo netstat -g

Kolonnene har følgende betydning:

Interface: Navnet på grensesnittet socketen sender over.
RefCnt: Referansetall, antall prosesser knyttet til socketen.
Group: Navn eller ID for multicast-gruppen.

Nye Verktøy

Kommandoene `route`, `ip`, `ifconfig` og <a