Linux command - netstat

sycho·2023년 12월 19일
0

Linux Commands

목록 보기
14/30

netstat

  • man page를 보면 다음과 같이 요약되어 있다.

    netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships

  • 한마디로 현 시스템 상에 있는 모든 네트워크 연결에 대한 정보를 파악하는데 사용되는 command다. 현 시스템에 있는 모든 연결된 TCP, UDP, UNIX socket은 물론 listening 용도로 사용되고 있는 socket들도 파악하는게 가능하다.

  • 네트워크랑 시스템 관리에서 자주 사용되는 명령어다. 현재 시스템에서 무슨 연결이 이루어졌는지, 그리고 listening socket을 기반으로 무슨 서비스를 운영하고 있는지를 파악하는데 유용하기 때문.

basics

  • 생으로 그냥 사용할 경우 모든 open socket들에 대한 정보들을 출력한다.
$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    316      /var/run/chrony/chronyd.sock
unix  3      [ ]         DGRAM      CONNECTED     23564    /run/systemd/notify
unix  2      [ ]         DGRAM                    20641    /run/user/1000/systemd/notify
unix  2      [ ]         DGRAM                    23573    /run/systemd/journal/syslog
unix  12     [ ]         DGRAM      CONNECTED     23581    /run/systemd/journal/dev-log
unix  8      [ ]         DGRAM      CONNECTED     23583    /run/systemd/journal/socket
unix  2      [ ]         DGRAM                    60565    /run/user/0/systemd/notify
unix  3      [ ]         STREAM     CONNECTED     22636    /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     48689    /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     57792
unix  3      [ ]         STREAM     CONNECTED     18414
unix  3      [ ]         STREAM     CONNECTED     19095
...
  • 위 출력물은 처음에 보면, active한 internet connection에 관한 정보를 먼저 출력한다. 하지만 보시다시피 아무것도 없는데, open socket이 연결이 구축된 socket을 보통 말하는거고, 현재 VM상에 인터넷 연결이 된 상대가 존재하지 않기 때문이다. 각 column이 뭘 의미하냐면

    • Proto : 무슨 protocol을 사용하는가
    • Recv-Q : 이 socket과 연결된 program에서 복사하지 못한 byte의 총 개수. 즉 연결상 수신은 되었으나 프로그램이 아직 읽지 않은 byte의 개수다. Q는 Queue를 의미한다.
    • Send-Q : 이 socket과 연결된 타 host에서 아직 읽지 않은 byte의 총 개수. 즉 본인이 보냈는데 아직 타 host에서 acknowledge를 아직 하지 않은 byte의 개수다.
    • Local Address : 해당 socket의 local end의 ip주소와 port 번호다. 기본적으로 숫자를 대응되는 canonical host name 및 service name으로 자동 번역을 한다.
    • Foreign Address : 반대편의 ip주소와 port 번호다.
    • State : Socket 상태다. 대체로 ESTABLISHED, CLOSED, LISTEN이 흔하며 그 외에도 여러 state가 존재한다. man page 참고.
  • 그 밑에는 UNIX domain socket에 관한 내용이다. 사실 이건 네트워크 관리랑은 별로 상관이 없다. 왜냐하면 UNIX domain socket 용도가 OS상의 process들 사이의 통신이랑 관련된 socket이기 때문이다. API는 일반 network 연결에서 사용하는 API랑 똑같이 사용한다. 자세한건 이 링크 참고

    • Proto : 무슨 protocol을 사용하는가 (보통 unix다.)
    • Refcnt : reference count. 해당 socket에 몇개의 process들이 참조하고 있는가.
    • Flags : 3개정도 상태가 있는데 보통 ACCSO_ACCEPTON이 주로 주목할만한 것이다. 해당 socket이 연결이 되어 있는 상태가 아니고, 거기에 대응된 process들이 연결 요청을 기다리고 있는 상태라는 뜻.
    • Type : 여러 상태가 있는데 가장 흔한 것은 UDP 연결처럼 사용되고 있는 datagram mode socket을 나타내는 DGRAM과 TCP 연결처럼 사용되고 있는 stream(connection) socket을 나타내는 STREAM이다.
    • I-node : socket과 연관된 I-node가 뭔지에 관한 정보다.
    • Path : socket이랑 연결된 path를 나타낸다. 이 path를 기준으로 process들이 서로 통신하는 것이다.
  • 네트워크와 관련된 것은 사실 Internet 부분만 참고를 하면 된다.

options

-i

  • 네트워크 인터페이스 출력에 사용된다. 자세한 설명은 생략할건데, 이유는 밑의 -ie option을 보도록.
$ netstat -i
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0      1500   109300      0      0 0         51504      0      0      0 BMRU
lo       65536    27000      0      0 0         27000      0      0      0 LRU

-r

  • 현 시스템의 routing table을 출력한다. 밑은 VM에서 실행한 것이다보니 매우 간단한 편.
$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         DESKTOP-4RPUOID 0.0.0.0         UG        0 0          0 eth0
172.18.208.0    0.0.0.0         255.255.240.0   U         0 0          0 eth0

-c

  • option등으로 지정된 output들을 매 초마다 계속해서 출력을 하는 option이다.
$ netstat -c
(...기본 출력이 매초마다 계속 나온다.)

-a

  • listening/non-listening(connected) socket 전부를 출력한다.
$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN
udp        0      0 127.0.0.53:domain       0.0.0.0:*
udp        0      0 localhost:323           0.0.0.0:*
udp6       0      0 ip6-localhost:323       [::]:*
raw        0      0 0.0.0.0:255             0.0.0.0:*               7
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     56462    /run/WSL/1_interop
unix  2      [ ACC ]     STREAM     LISTENING     60630    /run/WSL/1_interop
unix  2      [ ACC ]     STREAM     LISTENING     60092    /run/WSL/1_interop
unix  2      [ ACC ]     STREAM     LISTENING     60071    /run/WSL/1_interop
...
  • 출력을 보면 이제 listening socket들도 등장하기 시작했다. 단순히 open socket만 출력하던 기본형과 차이점을 보인다.

-t

  • active TCP socket만 출력한다.
$ netstat -t

-u

  • active UDP socket만 출력한다.
$ netstat -u

-ㅣ

  • listening socket만 출력한다.
$ netstat -l

-p

  • 매우 중요한 option 중 하나로, socket을 보유하고 있는 process의 ID랑 process program의 이름이 나온다. 이게 중요한 이유는 해당 socket을 활용하고 있는 프로그램이 무엇인지를 파악해야 할 일이 자주 있기 때문이다. PID/Program name이라는 column이 추가된다.
$ netstat -ap
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN      19086/node
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN      -
udp        0      0 127.0.0.53:domain       0.0.0.0:*                           -
udp        0      0 localhost:323           0.0.0.0:*                           -
udp6       0      0 ip6-localhost:323       [::]:*                              -
raw        0      0 0.0.0.0:255             0.0.0.0:*               7           -
...
  • 온전한 정보를 얻으려면 sudo를 사용해야 한다.
$ sudo netstat -ap
[sudo] password for sycho:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN      19086/node
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN      146/systemd-resolve
udp        0      0 127.0.0.53:domain       0.0.0.0:*                           146/systemd-resolve
udp        0      0 localhost:323           0.0.0.0:*                           -
udp6       0      0 ip6-localhost:323       [::]:*                              -
raw        0      0 0.0.0.0:255             0.0.0.0:*               7           12911/atop
...

-n

  • host 이름이나 port를 전부 numeric하게 나오도록 하는 option이다. Process에 해당되진 않는 다는 점 유의
$ sudo netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:45409         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*

-e

  • 추가로 정보를 표기하는데 사용되는 option인데, internet 관련 socket의 경우 inode 정보와 user 정보도 표기한다.
$ netstat -ae
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN      sycho      119757
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN      systemd-resolve 1264
udp        0      0 127.0.0.53:domain       0.0.0.0:*                           systemd-resolve 1263
udp        0      0 localhost:323           0.0.0.0:*                           root       313
udp6       0      0 ip6-localhost:323       [::]:*                              root       314
raw        0      0 0.0.0.0:255             0.0.0.0:*               7           root       77618
...

-s

  • 모든 protocol에 대한 종합 통계를 출력하는데 사용이 가능하다. 여기에 추가 option을 넣어가지고 특정 protocol에 대한 통계만 보는것도 가능하다. 밑은 UDP에 대한 통계만 남긴 것이다.
$ netstat -su
IcmpMsg:
    InType0: 1385
    InType3: 120
    InType8: 43
    InType11: 6753
    OutType0: 43
    OutType3: 856
    OutType8: 18639
    OutType13: 7
Udp:
    767 packets received
    1507 packets to unknown port received
    0 packet receive errors
    1527 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 10155
UdpLite:
IpExt:
    InBcastPkts: 10155
    InOctets: 57573064
    OutOctets: 22728649
    InBcastOctets: 792090
    InNoECTPkts: 106708

응용

  • -ie option을 사용하면 ifconfig랑 매우 유사한 출력물을 만드는게 가능하다.
$ netstat -ie
Kernel Interface table
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.215.138  netmask 255.255.240.0  broadcast 172.18.223.255
        inet6 fe80::215:5dff:fe25:835d  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:25:83:5d  txqueuelen 1000  (Ethernet)
        RX packets 102752  bytes 41201849 (41.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51071  bytes 3997805 (3.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 27000  bytes 19714209 (19.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27000  bytes 19714209 (19.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • -at option을 통해 현존하는 모든 TCP socket만 출력이 가능하다.
$ netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN
  • 마찬가지로 -au option을 통해 현존하는 모든 UDP socket만 출력이 가능하다. UDP의 경우 state가 안나오는데, connectionless라 그렇다는 점 유의.
$ netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 127.0.0.53:domain       0.0.0.0:*
udp        0      0 localhost:323           0.0.0.0:*
udp6       0      0 ip6-localhost:323       [::]:*
  • listening socket만 특정 protocol에 대해서 출력하고 싶은 경우 -lt-lu를 사용하면 된다.
$ netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN
$ netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
udp        0      0 127.0.0.53:domain       0.0.0.0:*
udp        0      0 localhost:323           0.0.0.0:*
udp6       0      0 ip6-localhost:323       [::]:*
  • 위의 것들에 p까지를 추가해가지고 TCP/UDP connection들이 현 system에서 어떻게 이루어지는 건지 파악하는 것이 가능하다.
$ sudo netstat -atp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 localhost:45409         0.0.0.0:*               LISTEN      19086/node
tcp        0      0 127.0.0.53:domain       0.0.0.0:*               LISTEN      146/systemd-resolve
  • grep과 pipeline을 활용해가지고 특정 port에 대한 정보만을 추출하는 것도 가능하다.
$ sudo netstat -nlp | grep :53
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      146/systemd-resolve
udp        0      0 127.0.0.53:53           0.0.0.0:*                           146/systemd-resolve
  • filtering을 하더라도 출력물이 너무 많은 경우가 있는데, 이 경우 less를 사용하도록 하자. 출력물 전체중 화면에 딱 맞는 출력물 내용만 나오게 되며, 방향키를 통해 스크롤링하면서 확인하는게 가능하다. 다음명령어로 밑의 사진처럼 나오게 된다.
$ netstat -a | less

profile
CS 학부생, 핵심 관심 분야 : Embed/System/Architecture/SWE

0개의 댓글