Hur man använder netstat på Linux

Linuxkommandot `netstat` är en ovärderlig resurs för att granska information om dina nätverksanslutningar, de portar som används och vilka processer som nyttjar dem. Låt oss utforska hur man använder detta kraftfulla verktyg.

Portar, processer och protokoll

Nätverksuttag kan vara i antingen anslutet läge eller i vänteläge för en anslutning. Dessa anslutningar använder nätverksprotokoll såsom Transmission Control Protocol (TCP) eller User Datagram Protocol (UDP). För att upprätta en kommunikationskanal används Internet Protocol (IP)-adresser och nätverksportar.

Uttrycket ”sockets” kan ge associationer till fysiska anslutningspunkter, men här refererar det till en mjukvarukonstruktion som hanterar en ände av en nätverksdataförbindelse.

Sockets har två grundläggande tillstånd: antingen är de anslutna och underlättar pågående nätverkskommunikation, eller så väntar de på att en inkommande anslutning ska ansluta till dem. Det finns även andra temporära tillstånd, som när en socket är mitt i processen att etablera en anslutning med en fjärrenhet. Men bortsett från dessa tillfälliga faser kan vi förenkla och se en socket antingen som ansluten eller i väntläge (ofta kallat ”lyssnande”).

Den socket som lyssnar kallas server, medan den socket som initierar anslutningen kallas klient. Dessa benämningar är inte relaterade till hårdvara eller datorns roll, utan definierar bara respektive sockets funktion i varje ände av förbindelsen.

Med kommandot `netstat` kan du se vilka sockets som är anslutna och vilka som är i lyssningsläge. Du får information om vilka portar som används och av vilka processer. Du kan också se routingtabeller och statistik om dina nätverksgränssnitt samt multicast-anslutningar.

Många funktioner i `netstat` har integrerats i andra Linux-verktyg som `ip` och `ss`. Trots detta är det fortfarande användbart att känna till grunderna i detta analysverktyg, eftersom det är tillgängligt på alla Linux- och Unix-liknande operativsystem, men även på Windows och macOS.

Här nedan följer en genomgång av hur du använder `netstat`, komplett med exempelkommandon.

Visa alla sockets

Med flaggan `-a` (alla) kan `netstat` visa både anslutna och väntande sockets. Kommandot kan generera en lång lista, så vi tar hjälp av `less` för att kunna navigera:

netstat -a | less

Listan innehåller TCP (IP), TCP6 (IPv6) och UDP sockets.

Det kan vara lite svårt att tolka listan direkt i terminalfönstret. Här är ett par avsnitt ur den:

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

Avsnittet ”Aktivt Internet” listar de anslutna externa förbindelserna samt de lokala sockets som lyssnar på inkommande fjärranslutningsförfrågningar. Det visar alltså nätverksanslutningar som är eller kommer att etableras med externa enheter.

Avsnittet ”UNIX domain” listar de anslutna och lyssnande interna förbindelserna. Det visar anslutningar som har etablerats inom datorn mellan olika applikationer, processer och delar av operativsystemet.

Kolumnerna under ”Aktivt Internet” betyder följande:

Proto: Det protokoll som används av socketen (exempelvis TCP eller UDP).
Recv-Q: Mottagningskön. Inkommande byte som tagits emot, buffrats och som väntar på att den lokala processen ska läsa och konsumera dem.
Send-Q: Sändkön. Byte som är redo att skickas från sändningskön.
Lokal adress: Adressinformation för den lokala änden av anslutningen. Som standard visar `netstat` det lokala värdnamnet för adressen och namnet på tjänsten för porten.
Utländsk adress: Adressen och portnumret för den anslutningens fjärrände.
State: Status för den lokala socketen. För UDP-sockets är detta vanligtvis tomt. Se tabellen med tillstånd nedan.

För TCP-anslutningar kan statusvärdet vara ett av följande:

LYSSNA: Endast serversidan. Socketen väntar på en anslutningsförfrågan.
SYN-SENT: Endast klientsidan. Socketen har skickat en anslutningsförfrågan och väntar på att få veta om den kommer att accepteras.
SYN-RECEIVED: Endast serversidan. Socketen väntar på en anslutningsbekräftelse efter att ha accepterat en anslutningsförfrågan.
ESTABLISHED: Server och klient. En fungerande anslutning har etablerats mellan server och klient, vilket gör dataöverföring möjlig.
FIN-WAIT-1: Server och klient. Socketen väntar på en begäran om anslutningsavslutning från fjärrsocketen, eller på en bekräftelse på en tidigare skickad begäran om anslutningsavslutning.
FIN-WAIT-2: Server och klient. Socketen väntar på en begäran om anslutningsavslutning från fjärrsocketen.
CLOSE-WAIT: Server och klient. Socketen väntar på en begäran om anslutningsavslutning från den lokala användaren.
CLOSING: Server och klient. Socketen väntar på en bekräftelse på en begäran om anslutningsavslutning från fjärrsocketen.
LAST-ACK: Server och klient. Socketen väntar på en bekräftelse på begäran om anslutningsavslutning som skickats till fjärrsocketen.
TIME-WAIT: Server och klient. Socketen skickade en bekräftelse till fjärrsocketen om att den mottagit fjärrsocketens begäran om avslutning. Den väntar nu för att säkerställa att bekräftelsen mottogs.
CLOSED: Ingen anslutning finns, och socketen är avslutad.

Kolumnerna under ”Unix domain” betyder följande:

Proto: Protokollet som används av socketen. Det kommer vara ”unix”.
RefCnt: Referensantal. Antalet processer anslutna till socketen.
Flags: Vanligtvis satt till ”ACC”, vilket representerar SO_ACCEPTON, vilket innebär att socketen väntar på en anslutningsförfrågan. SO_WAITDATA, visat som ”W”, indikerar att data väntar på att läsas. SO_NOSPACE, visat som ”N”, betyder att det inte finns plats att skriva data till socketen (sändningsbufferten är full).
Type: Sockettypen. Se tabellen för typer nedan.
State: Socketens status. Se tabellen för tillstånd nedan.
I-Node: Filsystemets inode som är associerad med socketen.
Path: Filsystemets sökväg till socketen.

Unix-domänens sockettyp kan vara en av följande:

DGRAM: Socketen används i datagramläge med meddelanden av fast längd. Datagram garanteras varken tillförlitliga, sekvenserade eller odubblerade.
STREAM: En stream-socket. Detta är den vanligaste ”normala” typen. Dessa sockets är gjorda för att ge pålitlig, sekvenserad (i ordning) leverans av paket.
RAW: Används som en rå-socket. Rå-sockets fungerar på nätverksnivå i OSI-modellen och tar inte hänsyn till TCP- och UDP-rubriker från transportnivån.
RDM: Socketen finns i ena änden av en tillförlitligt levererad meddelandeanslutning.
SEQPACKET: Socketen fungerar som en sekventiell paket-socket, vilket är ett annat sätt att tillhandahålla pålitlig, sekvenserad och odubblerad paketleverans.
PACKET: Rå-gränssnittaccess-socket. Används för att ta emot eller skicka råpaket på enhetsdrivrutinsnivå (datalänklager) i OSI-modellen.

Unix-domänsocketens status kan vara ett av följande:

FREE: Socketen är inte tilldelad.
LISTENING: Socketen lyssnar på inkommande anslutningsförfrågningar.
CONNECTING: Socketen är i färd med att ansluta.
CONNECTED: En anslutning har upprättats och socketen kan ta emot och överföra data.
DISCONNECTING: Anslutningen håller på att avslutas.

Oj, det var mycket information! Många `netstat`-alternativ ger förfinade resultat, men ändrar inte innehållet i grunden. Låt oss titta närmare.

Visa sockets efter typ

Kommandot `netstat -a` kan generera mer information än du behöver. Om du bara vill se TCP-sockets kan du använda flaggan `-t` (TCP) för att begränsa visningen till enbart dessa:

netstat -at | less

Utmatningen är kraftigt reducerad. De få sockets som visas är alla TCP-sockets.

Alternativen `-u` (UDP) och `-x` (UNIX) fungerar på liknande sätt och begränsar resultatet till den sockettyp som anges. Här visas hur det ser ut när man använder flaggan `-u` (UDP):

netstat -au | less

Endast UDP-sockets visas.

Visa sockets efter status

För att visa sockets som är i lyssnings- eller vänteläge används flaggan `-l` (lyssnar):

netstat -l | less

De sockets som visas är de som befinner sig i lyssningsläge.

Detta kan kombineras med flaggorna `-t` (TCP), `-u` (UDP) och `-x` (UNIX) för att hitta de specifika sockets du söker. Låt oss leta efter TCP-sockets i lyssningsläge:

netstat -lt | less

Nu visas endast TCP-sockets som är i lyssningsläge.

Nätverksstatistik per protokoll

För att se statistik för ett protokoll används flaggan `-s` (statistik) tillsammans med `-t` (TCP), `-u` (UDP) eller `-x` (UNIX). Om du endast använder `-s` (statistik) ser du statistik för alla protokoll. Låt oss kolla statistiken för TCP-protokollet:

netstat -st | less

En sammanfattning av statistik för TCP-anslutningar visas nu i `less`.

Visa processnamn och PID

Det kan vara användbart att se process-ID (PID) för den process som använder en socket, tillsammans med processens namn. Flaggan `-p` (program) gör just det. Låt oss se PID:en och processnamnen för de processer som använder TCP-sockets i lyssningsläge. Vi använder `sudo` för att säkerställa att vi får tillgång till all information, inklusive sådan som kräver root-behörighet.

sudo netstat -p -at

Här är resultatet i tabellform:

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 fått en extra kolumn kallad ”PID/programnamn”. Den visar PID och processnamn för processerna som använder varje socket.

Visa numeriska adresser

Ett sätt att minska oklarheten är att visa de lokala och fjärranslutna adresserna som IP-adresser istället för lösta domäner och värdnamn. Med flaggan `-n` (numerisk) visas IPv4-adresser i punkt-decimalform:

sudo netstat -an | less

IP-adresserna visas nu som numeriska värden. Portnumren visas också, separerade från IP-adresserna med ett kolon ”:”.

IP-adressen 127.0.0.1 indikerar att socketen är bunden till loopback-adressen för den lokala datorn. Du kan tolka IP-adressen 0.0.0.0 som ”standardvägen” för lokala adresser och som ”valfri IP-adress” för utländska adresser. IPv6-adresser som visas som ”::” är också nolladresser.

De portar som listas kan man enkelt kontrollera för att se vad deras vanliga syfte är:

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

Visa routingtabellen

Flaggan `-r` (route) visar kärnans routingtabell:

sudo netstat -r

Här är resultatet i en 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

Kolumnerna betyder följande:

Destination: Destinationsnätverket eller destinationsvärdenheten (om destinationen inte är ett nätverk).
Gateway: Gatewayadressen. En asterisk ”*” visas om ingen gateway är inställd.
Genmask: Subnätmasken för rutten.
Flags: Se tabellen för flaggor nedan.
MSS: Standardvärdet för maximal segmentstorlek för TCP-anslutningar över denna rutt – detta är den största mängden data som kan tas emot i ett TCP-segment.
Window: Standardfönsterstorlek för TCP-anslutningar över denna rutt, som anger antalet paket som kan överföras och tas emot innan mottagningsbufferten är full. I praktiken konsumeras paketen av den mottagande applikationen.
irtt: Inledande Round-Trip Time (RTT). Detta värde används av kärnan för att göra dynamiska justeringar av TCP-parametrar för fjärranslutningar som svarar långsamt.
Iface: Nätverksgränssnittet från vilket paketen som skickas över denna rutt sänds.

Flaggans värde kan vara ett av följande:

U: Rutten är aktiv.
H: Målet är en värd och den enda möjliga destinationen på den här rutten.
G: Använd gatewayen.
R: Återställ rutten för dynamisk routing.
D: Dynamiskt installerad av routingdemonen.
M: Modifierad av routingdemonen när den tog emot ett Internet Control Message Protocol (ICMP)-paket.
S: Installerats av addrconf, en automatiserad DNS- och DHCP-konfigurationsfilgenerator.
C: Cachepost.
!: Avvisa rutt.

Hitta porten som används av en process

Om vi leder utdata från `netstat` genom `grep` kan vi söka efter en process med namn och identifiera den port som den använder. Vi använder flaggorna `-a` (alla), `-n` (numeriska) och `-p` (program) som tidigare, och söker efter ”sshd”:

sudo netstat -anp | grep "sshd"

`grep` hittar målsträngen, och vi ser att sshd-demonen använder port 22.

Vi kan även göra det omvänt. Om vi söker efter ”:22” kan vi ta reda på vilken process som använder den porten, om någon:

sudo netstat -anp | grep ":22"

Denna gång hittar `grep` målsträngen ”:22”, och vi ser att processen som använder den porten är sshd-demonen, process-ID 751.

Visa nätverksgränssnitten

Flaggan `-i` (interface) visar en tabell över de nätverksgränssnitt som `netstat` kan upptäcka:

sudo netstat -i

Här är resultatet på ett mer läsbart sätt:

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

Kolumnerna betyder följande:

Iface: Namnet på gränssnittet. `enp0s3` är nätverksgränssnittet mot omvärlden, och `lo` är loopback-gränssnittet. Loopback-gränssnittet gör det möjligt för processer att kommunicera inuti datorn med hjälp av nätverksprotokoll, även om datorn inte är ansluten till ett nätverk.
MTU: Maximal överföringsenhet (MTU). Det är det största ”paketet” som kan skickas. Det består av en rubrik som innehåller routing- och protokollflaggor och annan metadata, plus den faktiska datan som transporteras.
RX-OK: Antalet mottagna paket utan fel.
RX-ERR: Antalet mottagna paket med fel. Vi vill att detta ska vara så lågt som möjligt.
RX-DRP: Antalet paket som har tappats (förlorats). Vi vill också att detta ska vara så lågt som möjligt.
RX-OVR: Antal paket som förlorats på grund av överflöd vid mottagning. Det innebär oftast att mottagningsbufferten var full och inte kunde acceptera mer data, men mer data togs emot och därmed förlorades. Ju lägre siffra desto bättre, och noll är perfekt.
TX-OK: Antalet paket som överförts utan fel.
TX-ERR: Antalet överförda paket med fel. Vi vill att detta ska vara noll.
TX-DRP: Antalet paket som tappats under sändning. Helst ska detta vara noll.
TX-OVR: Antalet paket som förlorats på grund av spill under sändning. Det innebär oftast att sändningsbufferten var full och inte kunde acceptera mer data, men mer data var redo att skickas och därmed förlorades.
Flg: Flaggor. Se tabellen för flaggor nedan.

Flaggorna representerar följande:

B: En broadcast-adress används.
L: Gränssnittet är en loopback-enhet.
M: Alla paket tas emot (promiskuöst läge). Ingenting filtreras eller kasseras.
O: Address Resolution Protocol (ARP) är avstängt för gränssnittet.
P: Det är en Point-to-Point (PPP) anslutning.
R: Gränssnittet är igång.
U: Gränssnittet är uppe.

Visa multicast-gruppmedlemskap

Kort sagt möjliggör en multicast-överföring att ett paket bara behöver skickas en gång, oavsett antalet mottagare. Detta ökar effektiviteten avsevärt för exempelvis videostreamingtjänster.

Flaggan `-g` (grupper) listar multicast-gruppmedlemskapet för sockets på varje gränssnitt:

sudo netstat -g

<img loading=”lazy” decoding=”async” src=”https://adminvista.com/wp-content/uploads/2022/02/1645228151_820_Hur