2012년 12월 5일 수요일

프로세스별 네트워크 활동 추적은 어떻게?

tcpdump, wireshark 도구를 이용해 쉽게 네트워크 트래픽 상태를 감시할 수 있다. 그런데, 어떤 프로세스가 해당 트래픽과 연관되어 있는지 알고자 하는 경우에는 어떻게 해야 하는가 ? 윈도우 사용자라면 ProcessExplorer 로 간단하게 연결 형태 정도를 확인할 수 있고, MS 사의 네트워크 분석기를 이용하면 쉽게 프로세스별 트래픽을 모니터링 할 수 있다.

[참고]

마이크로소프트 네트워크 모니터의 프로세스별 통신 상태
MS사의 새로운 네트워크 분석기, Message Analyzer


리눅스 환경에서는 어떻게 살펴볼까? MS 네트워크 분석기만큼 편리한 것은 없어 보인다. 일단 lsof 로 간단하게 네트워크 연결 상태를 확인해 볼 수 있다.

# lsof -i
로 네트워크 상황을 볼 수 있고 -i :80 , -i @packetinside.com 과 같이 포트 번호 또는 호스트로도 제한할 수 있다. 비슷한 기능의 명령어로는

# netstat -a -p

정도가 될 것같다. 이외 lsof 로 해당 네트워크 프로그램의 오픈된 파일 정보등도 더 살펴볼 수 있다.

$ ping www.packetinside.com
PING ghs.l.google.com (74.125.128.121) 56(84) bytes of data.
64 bytes from hg-in-f121.1e100.net (74.125.128.121): icmp_req=1 ttl=43 time=173 ms
64 bytes from hg-in-f121.1e100.net (74.125.128.121): icmp_req=2 ttl=43 time=183 ms

# ps -ef | grep ping
test   8976  8842  0 08:10 pts/8    00:00:00 ping www.packetinside.com
root      8991  8764  0 08:13 pts/7    00:00:00 grep --color=auto ping

root@banana:~# lsof -p 8976
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/test/.gvfs
      Output information may be incomplete.
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
ping    8976 test  cwd    DIR    8,6     4096 16777218 /home/test
ping    8976 test  rtd    DIR    8,6     4096        2 /
ping    8976 test  txt    REG    8,6    35712 16515194 /bin/ping
ping    8976 test  mem    REG    8,6   101192  6816351 /lib/x86_64-linux-gnu/libresolv-2.13.so
ping    8976 test  mem    REG    8,6    27032  6816344 /lib/x86_64-linux-gnu/libnss_dns-2.13.so  
ping    8976 test  mem    REG    8,6    10368  6815809 /lib/libnss_mdns4_minimal.so.2
ping    8976 test  mem    REG    8,6    51736  6816363 /lib/x86_64-linux-gnu/libnss_files-2.13.so
ping    8976 test  mem    REG    8,6  1694008  6816367 /lib/x86_64-linux-gnu/libc-2.13.so
ping    8976 test  mem    REG    8,6   141088  6816365 /lib/x86_64-linux-gnu/ld-2.13.so
ping    8976 test    0u   CHR  136,8      0t0       11 /dev/pts/8
ping    8976 test    1u   CHR  136,8      0t0       11 /dev/pts/8
ping    8976 test    2u   CHR  136,8      0t0       11 /dev/pts/8
ping    8976 test    3u   raw             0t0   243673 00000000:0001->00000000:0000 st=07
root@banana:~#

ping 을 하는 프로세스를 찾고 lsof -p 옵션으로 pid 값을 주고 살펴보면 추가 정보를 얻을 수 있다.

또 strace 를 이용하면 해당 프로세스에서 네트워크 부분만을 확인할 수 도 있다. strace 는 시스템 콜 또는 시그널을 추적할 수 있는데 다음과 같은 몇 가지 옵션을 이용하면 쉽게 확인이 가능하다.

-p : 프로세스 PID 
-f : 현 프로세스가 fork 하는 자식프로세스까지 추적
-e : 지정한 시스템 콜만 추적 , 예를들면 trace=open,close,read,write 는 4개의 시스템 콜만 추적

# strace -p 9016  -f -e trace=network
Process 9016 attached - interrupt to quit
recvmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("74.125.128.121")}, msg_iov(1)=[{"E\0\0T\337B\0\0+\1/4J}\200y\254\24\n(\0\0\10q#8\0&\332\204\276P"..., 192}], msg_controllen=32, {cmsg_len=32, cmsg_level=SOL_SOCKET, cmsg_type=0x1d /* SCM_??? */, ...}, msg_flags=0}, MSG_DONTWAIT) = 84
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, 16) = 0
sendto(4, "\277\263\1\0\0\1\0\0\0\0\0\0\003121\003128\003125\00274\7in-a"..., 45, MSG_NOSIGNAL, NULL, 0) = 45
recvfrom(4, "\277\263\201\200\0\1\0\1\0\4\0\4\003121\003128\003125\00274\7in-a"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.1")}, [16]) = 225
sendmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("74.125.128.121")}, msg_iov(1)=[{"\10\0wj#8\0'\333\204\276P\0\0\0\0\374\215\10\0\0\0\0\0\20\21\22\23\24\25\26\27"..., 64}], msg_controllen=0, msg_flags=0}, MSG_CONFIRM) = 64

위와 같이 ping 프로그램이 이용하는 네트워크 시스템 콜을 추적한다.

또는 수동적이지만 프로그램을 동작시키고 해당 소스 포트 또는 목적지 IP , 포트 정보등을 함께 이용하여 필터를 하여 트래픽을 덤프할 수도 있겠다. 이외 nethogs 라는 도구를 이용하면 프로세스별 트래픽양을 확인할 수 있다.

# apt-get install nethogs
# nethogs eth0

NetHogs version 0.7.0

  PID USER     PROGRAM                                 DEV        SENT      RECEIVED
2088  test  pidgin                                  eth0       0.087       1.150 KB/sec
2349  test  remmina                                 eth0       0.077       0.110 KB/sec
2308  test  /usr/lib/firefox/firefox                eth0       0.026       0.026 KB/sec
2986  test  ssh                                     eth0       0.000       0.000 KB/sec
5979  test  ssh                                     eth0       0.000       0.000 KB/sec
2145  test  /opt/google/chrome/chrome               eth0       0.000       0.000 KB/sec
1792  test  ../google/chrome/chrome --type=service  eth0       0.000       0.000 KB/sec
0     root     unknown TCP                                        0.000       0.000 KB/sec

  TOTAL                                                           0.190       1.286 KB/sec

리눅스 환경에서는 윈도우에 비해 프로세스별 감시가 다소 불편한 부분이 있다. 특히 MS 사의 네트워크 분석기는 프로세스별 트래픽 추적을 할 수 있어 해당 기능이 가장 유용한 부분이기도 하다.

추후 리눅스 환경에서 프로세스별 추적에 좀더 유용한 도구가 있다면 다시 소개하도록 하겠다. 그리고 윈도우 사용자는 MS 사의 네트워크 분석기를 이용하면 도움이 될 것이다.

댓글 없음:

댓글 쓰기