5. december

Netstat

Dagens kommando er netstat. Vi vil se på hvordan netstat kan bruges til at se hvilke porte der er åbne for internetforbindelser på ens Linux system.

Hvorfor er det nyttigt at kunne se, hvilke porte der bliver lyttet på? Hvis din maskine er på Internettet, eller på et lokalnetværk, er det vigtigt at du har styr på, hvilke netværksservices din maskine tilbyder, da du risikerer at din maskine bliver angrebet fra nettet via disse. Med netstat kan du let se de samme oplysninger som man kan se med et udefrakommende "portscan" - og mere til, idét du jo har adgang til maskinen "indefra".

Netstat kan også bruges til at vise noget routing information og noget interface information, men det kommer vi ikke ind på her. Se i stedet "man route" og "man ifconfig".

Relevante options

Netstat uden options viser kun de sockets der er igang med en forbindelse, dvs. ikke dem der bare lyttes på.

$ netstat 

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        1      0 heartofgold.freebs:1880 archimedes.shmoo.co:www CLOSE_WAIT
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  1      [ N ]       STREAM     CONNECTED     353    @0000001d
unix  1      [ ]         STREAM     CONNECTED     1113   @00000081
... 

-a medfører at alle sockets vises incl. server sockets der lyttes på.

-e betyder at user ID og inode nummer kommer med i output.

-l giver kun de sockets, der lyttes på.

-n giver "numerisk information", dvs. ip adresse og port nummer i stedet for host navn og service nummer.

-p giver process ID og program navn.

-t giver tcp sockets.

Eksempel 1

En typisk anvendelse af netstat er

# netstat -ape

Bemærk at kommandoen udføres som root. Hvis den ikke udføres som root, vil man kun få PID/program name med på de sockets den pågældende bruger selv ejer.

Et udsnit af output fra denne kommando:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        1      0 heartofgold.freebs:1880 archimedes.shmoo.co:www CLOSE_WAIT  luke       24212      817/communicator-sm
tcp        0      0 *:printer               *:*                     LISTEN      root       8156       6704/lpd
tcp        0      0 *:ssh                   *:*                     LISTEN      root       267        334/sshd
tcp        0      0 *:smtp                  *:*                     LISTEN      root       199        328/master
tcp        0      0 *:time                  *:*                     LISTEN      root       120        230/
udp        0      0 heartofgold.freebsd:ntp *:*                                 root       288        342/ntpd
udp        0      0 localhost:ntp           *:*                                 root       287        342/ntpd
udp        0      0 *:ntp                   *:*                                 root       286        342/ntpd
raw        0      0 *:icmp                  *:*                     7           root       0          -
raw        0      0 *:tcp                   *:*                     7           root       0          -
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  1      [ N ]       STREAM     CONNECTED     353    414/xosview         @0000001d
unix  0      [ ACC ]     STREAM     LISTENING     240    328/master          private/cyrus
unix  1      [ ]         STREAM     CONNECTED     1113   784/kdeinit: klaunc @00000081
unix  1      [ ]         STREAM     CONNECTED     262    332/qmgr            @0000000d
unix  0      [ ACC ]     STREAM     LISTENING     244    328/master          private/uucp
unix  1      [ ]         STREAM     CONNECTED     357    416/xload           @0000001f
unix  0      [ ACC ]     STREAM     LISTENING     248    328/master          private/ifmail
unix  1      [ ]         STREAM     CONNECTED     355    415/xclock          @0000001e
... mange flere...

Øverst har vi de aktive internet forbindelser, dem kigger vi nærmere på om lidt. Det andet "afsnit" af outputtet er UNIX domain sockets. Dem vil vi ikke komme nærmere ind på.

En kort gennemgang af hvad de forskellige kolonner betyder:
Protokol: Første felt er protokollen: tcp, udp eller raw.
Recv-Q og Send-Q: De næste to felter viser hvor mange pakker der er modtaget som endnu ikke er processeret hhv. hvor mange pakker der er afsendt, som der endnu ikke er modtaget acknowledge for.
Local address: Dette er hostnavnet og service navnet el. portnummeret på den lokale host. * i stedet for en ip adresse betyder at den pågældende service lytter på alle maskinens ip adresser (her localhost - 127.0.0.1 - og maskinens "rigtige" ip nummer).
Foreign address: Adressen på den host og service der er forbindelse til hvis der er en forbindelse i gang.
Den opmærksomme læser vil måske undre sig over hostnavne som "heartofgold.freebs" og "archimedes.shmoo.co", som slutter lidt brat - netstat kan godt klippe slutningen af hostnavnet af hvis der ikke er plads.
State: Hvilket state forbindelsen er i. Dette felt giver ikke mening for RAW og bruges heller ikke så ofte til udp, men det bruges til tcp. States kan være ESTABLISHED, SYN_SENT, SEN_RECV, FIN_WAIT1, FINWAIT2, TIME_WAIT, CLOSED, CLOSE_WAIT, LAST_ACK, LISTEN, CLOSING og UNKNOWN.
Vi ser oftest LISTEN og ESTABLISHED, da mange af de andre kun eksisterer netop imens en forbindelse er ved at blive oprettet eller lukket ned.
User: Ejeren af den pågældende socket.
Inode: Socket'ens inode nummer (det er ikke en oplysning vi vil bruge til noget her).
PID/Program name: Dette er process ID og navn på programmet der er bundet til denne socket.

Lad os se nærmere på en enkelt linie af outputtet ovenfor:

tcp        0      0 *:ssh                   *:*                     LISTEN      root       267        334/sshd

Protokollen er tcp, det er ssh porten der lyttes på, socket'en ejes af root og det er ssh daemon'en med process ID 344 der har denne socket.

Eksempel 2

Hvis vi kun vil se på TCP og vi ikke vil have alle sockets men kun dem der lyttes på, hedder kommandoen

# netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:printer               *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp        0      0 *:time                  *:*                     LISTEN

Her ser vi at der lyttes på printerporten, ssh porten, smtp (mail) samt time servicens port, på alle maskinens ip adresser.

For yderligere information om netstat, se "man netstat", men den er ikke særlig genneført. Manualsiden til FreeBSD er bedre, men desværre passer den ikke helt med Linux. Dog kan man godt få noget ud af at læse den også. (Den findes mange steder på nettet, f.eks. http://noc.cv.ua/cgi-bin/man.cgi?CMD=netstat&SECT=1).
Se desuden afsnittet om netstat i Linux Network Administrators Guide, f.eks. på http://mirrors.sunsite.dk/ldp/LDP/nag2/x-087-2-iface.netstat.html, samt denne korte intro til netstat: http://www.linuxmonth.com/issue3/tips/tip6.html.