man page를 보면 다음과 같이 요약되어 있다.
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
한마디로 현 시스템 상에 있는 모든 네트워크 연결에 대한 정보를 파악하는데 사용되는 command다. 현 시스템에 있는 모든 연결된 TCP, UDP, UNIX socket은 물론 listening 용도로 사용되고 있는 socket들도 파악하는게 가능하다.
네트워크랑 시스템 관리에서 자주 사용되는 명령어다. 현재 시스템에서 무슨 연결이 이루어졌는지, 그리고 listening 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개정도 상태가 있는데 보통 ACC
인 SO_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 부분만 참고를 하면 된다.
-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
$ 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
$ netstat -c
(...기본 출력이 매초마다 계속 나온다.)
$ 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
...
$ netstat -t
$ netstat -u
$ netstat -l
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
...
$ 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:*
$ 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
...
$ 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 [::]:*
-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
less
를 사용하도록 하자. 출력물 전체중 화면에 딱 맞는 출력물 내용만 나오게 되며, 방향키를 통해 스크롤링하면서 확인하는게 가능하다. 다음명령어로 밑의 사진처럼 나오게 된다.$ netstat -a | less