TCP/IP Network Experimental Programming [패킷 모니터링 실험] cheol-joo chae cjchae@netwk.hannam.ac.kr
목차 패킷 모니터링의 기초 지식 데이터 링크 액세스 인터페이스 패킷 모니터링
패킷 모니터링의 기초 지식 패킷 모니터링 네트워크 안을 흐르는 패킷을 들여다보는 것을 패킷 모니터링이라함 패킷 모니터링을 위해서는 네트워크 analyzer, LAN analyzer, 프로토콜 analyzer 등의 전용 하드웨어가 필요 Linux, FreeBSD에는 tcpdump라는 패킷 모니터 프로그램이 있음 호스트 A 호스트 B 호스트 C TO : 호스트 C FROM : 호스트 A 내용 C
허브와 어드레스 학습 기능 제한 사항과 문제점
Promiscuous 모드 Promiscuous 모드 보통 NIC의 디바이스 드라이버는 다른 MAC 어드레스 앞에 보내온 Ethernet 프레임을 폐기 이를 위해 패킷을 모니터링해도 다른 프레임을 들여다 볼 수 없음 다른 호스트 앞의 프레임을 폐기하지 않고 상위 층이 받아들이는 모드를 promiscuous 모드라고 함 MAC 어드레스가 어떤 번호로 되어 있을지라도 구별하지 않고 NIC가 패킷을 수신 CPU의 부하 때문에 평상시에는 promiscuous를 사용하지 않음
Promiscuous 모드 Promiscuous 모드
Promiscuous 모드 Promiscuous 모드 Linux인 경우(설정) Linux인 경우(해제) ifconfig 인터페이스명 promisc ifconfig 인터페이스명 - promisc
Promiscuous 모드 Promiscuous 모드 Linux에서 promiscuous 모드가 아닌 경우
Promiscuous 모드 Promiscuous 모드 Linux에서 promiscuous 모드인 경우
데이터 링크 액세스 인터페이스 데이터 링크 액세스 인터페이스 Ethernet 등의 패킷을 애플리케이션 프로그램으로부터 직접처리하기 위해 데이터 링크 액세스 인터페이스를 이용 데이터 링크 액세스 인터페이스를 사용하면 TCP, UDP, IP를 통하지 않고 Ethernet 등의 데이터 링크 헤더를 직접 조작하는 것이 가능 데이터 링크 액세스 인터페이스는 TCP헤더나 IP 헤더, Ethernet 헤더를 전부 자신이 작성하거나 네트워크에서 흘러들어 온 패킷을 전수 수신하고 싶은 경우 사용 패킷 모니터링 프로그램 작성시 데이터 링크에 액세스하기 위한 범용 라이브러리로 pcap을 사용 개발처 URL http://www.lbl.gov 최신버전 URL http://www.tcpdump.org
데이터 링크 액세스 인터페이스 Linux 소켓을 이용하여 데이터 링크에 액세스 Ethernet을 직접 이용해서 패킷을 송수신 하고 싶을 경우 PF_PACKET은 모든 프로토콜을 다루기 위한 프로토콜 패밀리 IP 패킷만들 다룰때 사용 s = socket(PF_PACKET,SOCKET_PACKET, htons(ETH_P_ALL)); s = socket(AF_PACKET,SOCKET_PACKET, htons(ETH_P_IP));
데이터 링크 액세스 인터페이스 BPF(BSD Packet Filter) BSD계열 UNIX에서만 이용할 수 있는 데이터 링크 엑세스 인터페이스 BPF에서는 디바이스 파일을 이용해서 읽기/쓰기를 실행(/dev/bpf0, /dev/bpf1, /dev/bpf2, /dev/bpf3) BPF를 오픈한 경우 패킷을 입출력하는 인터페이스 명의 설정 등은 ioctl 시스템 콜을 사용 BPF를 이용할 때는 write, read 시스템 콜을 사용하여 패킷의 송수신을 실행
패킷 모니터링 ipdump main open_buf (BPF를 오픈한다. FreeBSD의 경우에만) print_ethernet mac_ntoa (MAC 어드레스를 아스키 문자열로 변환한다) print_arp (ARP 패킷을 출력한다) ip_ttoa print_ip (TOS를 아스키 문자열로 변환한다) main (ip 헤더를 출력한다) ip_ftoa (패킷 헤더의 수신, 해석) (FLAG를 아스키 문자열로 변환한다) print_icmp (icmp 헤더를 출력한다) print_tcp tcp_ftoa (tcp 헤더를 출력한다) (control 플래그를 아스키 문자열로 변환한다) print_udp (udp 헤더를 출력한다) print_packet (패킷 내용을 16진수 및 아스키 문자로 표시한다) help (idump 사용 방법을 표현한다)
패킷 모니터링 ipdump 흐름
패킷 모니터링 ipdump 호스트 간의 통신 패킷을 모니터링하고 싶을때는 ifconfig 명령어를 사용하여 promiscuous 모드로 변경 ipdump 실행 서식 -a : 모든 패킷의 정보를 표시, -a를 지정하지 않을 경우에는 Ethernet 타입이 ARP나 IP인 경우만 표시 -e : Ethernet 타입이 ARP나 IP인 경우만 표시, -a를 지정하지 않을 경우에는 Ethernet 타입이 ARP나 IP인 경우만 표시 -d : 패킷의 내용을 16진수와 아스키 문자로 표시합니다. h는 help를 의미하고, 이용 방법을 간단히 표시 -i ifname : 패킷을 읽고 이해하는 인터페이스 명을 지정, 지정하지 않을 경우 lo를 통해서 통신한 패킷도 표시 -p protocol : 표시하고 싶은 패킷을 지정, 지정할 수 있는 패킷은 arp, ip, icmp, tcp, udp ./ipdump [-aedh] [-i ifrname] [-p protocol]
패킷 모니터링 ipdump ipdump 실행 시 Ethernet Frame과 IP Protocol 부분
패킷 모니터링 ipdump ipdump 실행 시 TCP Protocol 부분
패킷 모니터링 ipdump ipdump 실행 시 Ethernet 헤더의 16진수 표현
Tcpdump 네트워크 인터페이스 상에 있는 패킷 중에서 보고자 하는 패킷의 헤더 정보를 보여주는 툴 기대효과 IP의 동작과 네트워크 특성에 관하여 자세히 알 수 있다. 침입탐지나 트래픽 분석을 하여 시스템 ,네트워크 보호가능
Tcpdump 분석 패킷 출력 분석 ① 타임스탬프 (패킷 캡쳐 시간) ② 발신지 주소.포트 ③ 방향 ④ 목적지 주소.포트 15:49:29.286150 218.150.249.113.1047 > caldera.hannam.ac.kr.telnet: . ack 2592955740 win 64226 (DF) 15:49:29.286233 caldera.hannam.ac.kr.telnet > 218.150.249.113.1047: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ① 타임스탬프 (패킷 캡쳐 시간) ② 발신지 주소.포트 ③ 방향 ④ 목적지 주소.포트 ⑤ 플래그 ⑥ 데이터 길이 ⑦ ack 번호 ⑧ 수신측 윈도우 크기 ⑨ DF – Don Fregmentation ⑩ tos Type Of Service 설정
Tcpdump 옵션 tcpdump –n (도메인 IP) tcpdump –N (도메인을 미출력) tcpdump –O (출력하지 않음) tcpdump: listening on eth0 15:09:19.734337 203.247.39.189.3339 > 203.247.39.78.telnet: . ack 4090693970 win 64061 (DF) 15:09:19.734405 203.247.39.78.telnet > 203.247.39.189.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 15:09:19.934967 203.247.39.189.3339 > 203.247.39.78.telnet: . ack 29 win 64033 (DF) 15:09:19.935034 203.247.39.78.telnet > 203.247.39.189.3339: P 29:226(197) ack 0 win 5840 (DF) [tos 0x10] tcpdump: listening on eth0 15:11:06.074036 roka.3339 > caldera.telnet: . ack 4090696723 win 62878 (DF) 15:11:06.074103 caldera.telnet > roka.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 15:11:06.274677 roka.3339 > caldera.telnet: . ack 29 win 62850 (DF) 15:11:06.274743 caldera.telnet > roka.3339: P 29:198(169) ack 0 win 5840 (DF) [tos 0x10] tcpdump: listening on eth0 15:12:08.974973 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090699461 win 63201 (DF) 15:12:08.975041 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 15:12:09.175618 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 29 win 63173 (DF) 15:12:09.175684 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:250(221) ack 0 win 5840 (DF) [tos 0x10]
Tcpdump 옵션 tcpdump –p (promiscuous 모드 x) tcpdump –q (프로토콜 정보 줄임) tcpdump –R (raw 소켓인터페이스) tcpdump: listening on eth0 15:15:51.586112 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090703410 win 63839 (DF) 15:15:51.586179 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 15:15:51.786760 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 29 win 63811 (DF) 15:15:51.786826 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:250(221) ack 0 win 5840 (DF) [tos 0x10] tcpdump: listening on eth0 15:16:50.373911 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: tcp 0 (DF) 15:16:50.373976 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: tcp 28 (DF) [tos 0x10] 15:16:50.574553 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: tcp 0 (DF) 15:16:50.574615 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: tcp 181 (DF) [tos 0x10] tcpdump: listening on eth0 15:17:46.553380 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090710283 win 63150 (DF) 15:17:46.553446 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 15:17:46.754016 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 29 win 63122 (DF) 15:17:46.754079 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:250(221) ack 0 win 5840 (DF) [tos 0x10]
Tcpdump 옵션 tcpdump –VV (더욱 상세한 정보) tcpdump –t (timestamp 출력하지 않음) tcpdump: listening on eth0 15:25:36.253879 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . [tcp sum ok] 2559335782:2559335782(0) ack 4090726773 win 63775 (DF) (ttl 128, id 19684, len 40) 15:25:36.253946 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P [tcp sum ok] 1:29(28) ack 0 win 5840 (DF) [tos 0x10] (ttl 64, id 63774, len 68) 15:25:36.454517 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . [tcp sum ok] 0:0(0) ack 29 win 63747 (DF) (ttl 128, id 19685, len 40) 15:25:36.454582 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:356(327) ack 0 win 5840 (DF) [tos 0x10] (ttl 64, id 63775, len 367) tcpdump: listening on eth0 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090718523 win 64114 (DF) caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 29 win 64086 (DF) caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:218(189) ack 0 win 5840 (DF) [tos 0x10] tcpdump: listening on eth0 15:23:18.814809 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . [tcp sum ok] ack 4090722148 win 63648 (DF) (ttl 128, id 19620, len 40) 15:23:18.814876 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P [tcp sum ok] 1:29(28) ack 0 win 5840 (DF) [tos 0x10] (ttl 64, id 63727, len 68) 15:23:19.015452 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . [tcp sum ok] ack 29 win 63620 (DF) (ttl 128, id 19621, len 40) 15:23:19.015518 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 29:331(302) ack 0 win 5840 (DF) [tos 0x10] (ttl 64, id 63728, len 342)
Tcpdump 옵션 tcpdump –x (패킷을 16진수로) 15:26:44.772768 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090731756 win 63460 (DF) 4500 0028 4d23 4000 8006 c6b2 cbf7 27bd cbf7 274e 0d0b 0017 988c 5db9 f3d3 9cec 5010 f7e4 3ccd 0000 0000 0000 0000 15:26:44.772836 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 4510 0044 f950 4000 4006 5a59 cbf7 274e cbf7 27bd 0017 0d0b f3d3 9cec 988c 5db9 5018 16d0 0efa 0000 7463 7064 756d 703a 206c 6973 7465 6e69 6e67 206f 6e20 6574 6830 0d0a
Tcpdump 옵션 tcpdump –X (패킷 소켓 인터페이스 사용) 15:26:44.772768 roka.hannam.ac.kr.3339 > caldera.hannam.ac.kr.telnet: . ack 4090731756 win 63460 (DF) 4500 0028 4d23 4000 8006 c6b2 cbf7 27bd cbf7 274e 0d0b 0017 988c 5db9 f3d3 9cec 5010 f7e4 3ccd 0000 0000 0000 0000 15:26:44.772836 caldera.hannam.ac.kr.telnet > roka.hannam.ac.kr.3339: P 1:29(28) ack 0 win 5840 (DF) [tos 0x10] 4510 0044 f950 4000 4006 5a59 cbf7 274e cbf7 27bd 0017 0d0b f3d3 9cec 988c 5db9 5018 16d0 0efa 0000 7463 7064 756d 703a 206c 6973 7465 6e69 6e67 206f 6e20 6574 6830 0d0a
Q & A