[참고]
마이크로소프트 네트워크 모니터의 프로세스별 통신 상태
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 사의 네트워크 분석기를 이용하면 도움이 될 것이다.
댓글 없음:
댓글 쓰기