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