1 / 28

IP 와 ICMP 의 실험

IP 와 ICMP 의 실험. Jae-dong kim 네트워크 실험실. 목차. 라우팅 테이블과 경로 제어 라우팅 테이블 Redirect 프로그램 redirect 프로그램의 개요와 구조 redirect 프로그램의 사용 방법 redirect 프로그램의 실행 예 redirect 처리의 흐름 redirect 프로그램 리스트의 해설 Scanroute 프로그램 scanroute 의 개요와 구조 scanroute 프로그램의 사용방법 scanroute 처리의 흐름

ewa
Download Presentation

IP 와 ICMP 의 실험

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. IP와 ICMP의 실험 Jae-dong kim 네트워크 실험실

  2. 목차 • 라우팅 테이블과 경로 제어 • 라우팅 테이블 • Redirect 프로그램 • redirect 프로그램의 개요와 구조 • redirect 프로그램의 사용 방법 • redirect 프로그램의 실행 예 • redirect 처리의 흐름 • redirect 프로그램 리스트의 해설 • Scanroute 프로그램 • scanroute의 개요와 구조 • scanroute 프로그램의 사용방법 • scanroute 처리의 흐름 • scanroute 프로그램 리스트의 해설

  3. 라우팅 테이블과 경로 제어 • 라우팅 테이블 • netstat -rn : 라우팅 테이블(경로 제어표)을 표시할 수 있음 (r 은 라우팅 테이블을 표시, n은 IP 어드레스를 표시할 때의 옵션) Destination : 종착점 주소 Gateway : 그 때의 전송처 # netstat –rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.4.0 192.168.3.1 255.255.255.0 UG 0 0 0 eth0 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.3.1 0.0.0.0 UG 0 0 0 eth0

  4. 라우팅 테이블과 경로 제어 • IP에서 패킷을 전송할 때 반드시 routing table이 참조됨 • 경로상의 모든 Host나 router의 routing table이 정확하여야 함. • 그렇지 않으면, 패킷이 목적지 호스트까지 도달하지 않음 • Redirect program : ICMP redirect message를 억지로 발생시켜 routing table 변경 • Scanroute program : 시작점 Host와 종착점 Host 사이에 있는 Route의 IP 주소를 모두 표시하는 program 라우팅 테이블 은 : 1) 루트 명령어를 사용해서 수작업으로 편집 2) RIP나 OSPF 등의 Routing Protocol 사용 3) ICMP redirect Message에 의해서 자동적으로 변경 기대효과 : Network 이상발생시 예상가능 및 Unknown Network Topology 추측

  5. redirect 프로그램(개요) • 개요: ICMP redirect message를 작성해서 송신하는 program으로, 특정 host의 Routing table 값을 갱신할 수있음 (1) 타킷호스트(호스트 B)에 ICMP redirect message를 송신 192.168.4.0/24 192.168.3.0/24 호스트 B의 라우팅 테이블 IP 어드레스 전송선 0.0.0.0/0 192.168.4.0/24 192.168.4.1 192.168.4.14 호스트 A 192.168.4.12 호스트 B 192.168.4.14 호스트 C 192.168.3.104 가공라우터 B 192.168.4.99 가공라우터 A 192.168.4.1 192.168.3.4 redirect 1) 호스트 B와 호스트 C 사이에서 통신가능 2) ICMP redirect 메시지를 송신

  6. redirect 프로그램(개요) (2) 타킷호스트(호스트 B)는 특정의 호스트와 통신불능 예 192.168.4.0/24 192.168.3.0/24 호스트 B의 라우팅 테이블 IP 어드레스 전송선 0.0.0.0/0 192.168.4.0/24 192.168.3.104/32 192.168.4.1 192.168.4.14 192.168.4.99 3) 호스트 B의 라우팅 테이블에 추가된다 호스트 A 192.168.4.12 호스트 B 192.168.4.14 호스트 C 192.168.3.104 가공라우터 B 192.168.4.99 가공라우터 A 192.168.4.1 192.168.3.4 4) 호스트 B는 호스트 C에 송신하는 패킷을 가공 라우터 B로 경유해서 보내려고 한다 그림 7.1 ICMP redirect 메시지의 동작

  7. redirect 프로그램(사용방법) • raw IP를 사용하고 있기 때문에 실행하기위해 root의 권한이 필요 • Linux에서는 redirect 메시지를 수신해도 무시하기 때문에 효과 없으며, FreeBSD, Windows ME/2000에서는 동작함 • target_host : ICM redirect 메시지의 전송처 IP 어드레스를 지정 • old_router : redirect 메시지 전송에 사용되는 라우터의 IP • 어드레스를 지정 • new_router : redirect 앞의 라우터 IP 어드레스를 지정 • dst_ip : redirect하는 전송처의 IP 어드레스를 지정 실행 : redirect target_host old_router new_router dst_ip

  8. redirect 프로그램(사용방법) 192.168.4.0/24 192.168.3.0/24 호스트 A 192.168.4.12 호스트 B 192.168.4.14 호스트 C 192.168.3.104 가공라우터 B 192.168.4.99 가공라우터 A 192.168.4.1 192.168.3.4 redirect new_router old_router dst_ip target_host V : 4 HL : 5 TOS : TL: ID : 0 F M FO : TTL : P : 1 CKSUM : IP 헤드 SRC IP : 192. 168. 4. 1 DST IP : 192. 168. 4. 14 T : C : CKSUM : ICMP 헤드 NEXT GW : 192.168.4.99 V : HL : TOS : TL: ID : 0 F M FO : TTL : 254 P : CKSUM : 반송되는 IP 헤드 SRC IP : 192. 168. 4. 14 DST IP : 192. 168. 3. 104 transport 헤드의 선두 64비트 그림 7.2 명령어 인수와 생성되는 ICMP redirect 메시지

  9. redirect 프로그램의 실행 예 • 그림 7.2의 ICMP redirect 패킷을 생성하기위해 입력 • ipdump에서 모니터링하면 다음과같음 # ./redirect 192.168.4.14 192.168.4.1 192.168.4.99 192.168.3.104

  10. redirect 프로그램의 실행 예 • 호스트 B(192.168.4.14)의 운영체제가 Windows2000 일때 (Before)

  11. redirect 프로그램의 실행 예 • 라우팅테이블에 192.168.3.104의 행이 추가 (After)

  12. redirect 프로그램의 실행 예 • 결과해설 : • 호스트 B는 호스트 C(192.168.3.104)와 통신을 할 수 없게됨 • Icmp redirect 메시지가 틀리게 송신되면 통신장애가 발생 • 라우팅 테이블에 추가되어있는 경로는 Net Mask가 32비트 길이의 호스트 루트로 되어 있음 • 원래는 네트워크 어드레스로 redirect 해야만 효율적임 • 프로토콜의 방법은 ICMP redirect의 코드를 0으로하면 네트워크 redirect로 됨 • 패킷형식을 보면 redirect하는 네트워크의 서브넷 마스크 필드없음 • Class에서 정의된 비트길이의 네트워크 어드레스로서 redirect 되게됨 • Classless가 일반화된 현재의 인터넷에서는 통신장애를 초래할 위험성 있음 • 따라서 네트워크 redirect의 패킷을 받아도 호스트 루트로서 라우팅테이블에 추가하는 방법이 일반적이 됨

  13. redirect 처리의 흐름 • Redirect 프로그램은 5개의 함수로 구성됨 make_udp_header (UDP 헤더를 작성한다) main make_ip_header (IP 헤더를 작성한다) checksum make_icmp5_header (checksum을 계산한다) (ICMP redirect 패킷을 작성한다) 그림 7.3 redirect의 함수 구조도

  14. redirect 처리의 흐름 • redirect 처리의 흐름 개요 시 작 IP 헤더를 작성 송신용 RAW 소켓을 연다 (make_ip_header) 헤더의 포인트를 설정 송신 어드레스의 설정 UDP 헤더를 작성 패킷의 송신 (make_udp_header) (sendto) IP 헤더를 작성 소켓을 닫는다 (make_ip_header) (close) ICMP 헤드를 작성 종 료 (make_icmp5_header) 그림 7.4 redirect 처리의 흐름

  15. redirect 프로그램 리스트(1) • redirect 프로그램 해설 redirect ip_new icmp ip_old udp 헤드 구조를 나타내는 구조체로의 포인터 설정 0 20 28 48 56 buff [1500] ICMP 헤드 UDP 헤드 IP 헤드 IP 헤드 make_udp_header make_ip_header 헤드의 작성 make_icmp5_header make_ip_header raw IP sendto 운영체제 Ethernet 헤드 ICMP 헤드 UDP 헤드 IP 헤드 IP 헤드 그림 7.5 redirect의 패킷 작성 처리 송신

  16. redirect 프로그램 리스트(2) • redirect 프로그램 해설 80 /* 각 헤더의 포인터 설정 */ 81 /* IP(20) + ICMP(8) + IP(20) + UDP(8) */ 82 ip_new = (struct ip *)(buff); 83 icmp = (struct icmp *)(buff + 20); 84 ip_old = (struct ip *)(buff + 20 + 8); 85 udp = (struct udphdr *)(buff + 20 + 8 + 20); 86 size = 20 + 8 + 20 + 8; • 작성한 ICMP 패킷은 4개의 헤드로 구성되며, char형 배열의 버퍼에 순서대로 저장됨 각 헤드의 포인터를 설정

  17. redirect 프로그램 리스트(3) • redirect 프로그램 해설 88 /* 소켓의 작성 */ 89 make_udp_header(udp); 90 make_ip_header(ip_old, inet_addr(argv[TARGET_IP]), inet_addr(argv[DST_IP]), 91 IPPROTO_UDP, 100); 92 make_icmp5_header(icmp, inet_addr(argv[NEW_ROUTER])); 93 make_ip_header(ip_new, inet_addr(argv[OLD_ROUTER])), 94 inet_addr(argv[TARGET_IP]), IPPROTO_ICMP, size); 95 • 패킷의 헤더를 작성할 때에는 뒤의 헤더부터 순서대로 작성함 (패킷 송신시 상위 층의 헤더나 테이터부터 순서대로 작성하여야 함) • ICMP 헤더에는 ICMP 헤더이하에 계속되는 데이터를 포함한 체크섬을 저장하기 때문에 ICMP 헤더를 작성하기전에 ICMP헤더 뒤의 IP 헤더나 UDP헤더를 작성해 둘 필요가 있음

  18. redirect 프로그램 리스트(4) • redirect 프로그램 해설 96 /* 송신 어드레스의 설정 */ 97 memset((char *) &dest, 0, sizeof(dest)); 98 dest.sin_family = AF_INET; 99 dest.sin_addr.s_addr = inet_addr(argv[TARGET_IP]); 100 CHKADDRESS(dest.sin_addr.s_addr); 101 • 종착점의 어드레스를 설정하며, 앞서 작성한 IP 헤더 중에는 종착점 IP 어드레스가 저장되어 있지만, 패킷을 송신하는 호스트 내부의 라우팅 처리에서는 이용되지 않음 • 라우팅은 sento의 다섯번째 인수에 지정된 어드레스를 기본으로 해서 이루어짐

  19. Scanroute 프로그램 • 개요: 통신장애 등이 발생할 때에 자주 이용되며, 특정 호스트까지의 경로도중에 도중에 있는 라우터를 표시함 (실행시 라우터 A,B,C의 IP 어드레스가 순서대로 표시됨) 호스트 B 호스트 A 라우터 A 라우터 B 라우터 C 192.168.0.10 192.168.0.1 192.168.2.4 192.168.3.2 192.168.4.14 ICMP 시간 초과 메시지 시작점 IP 어드레스 192.168.0.1 TTL=1 TTL=0 TTL=2 ICMP 시간 초과 메시지 시작점 IP 어드레스 192.168.2.4 TTL=1 TTL=0 ICMP 시간 초과 메시지 시작점 IP 어드레스 192.168.3.2 TTL=3 TTL=0 TTL=1 TTL=2 ICMP 시간 초과 메시지 시작점 IP 어드레스 192.168.4.14 TTL=4 TTL=0 TTL=1 TTL=3 TTL=2 그림 7.6 scanroute의 동작개요

  20. scanroute 프로그램의 사용방법 • scanroute [-n] dst_ip (dst_ip는 조사하고 싶은 IP어드레스를 지정) * scanroute에서는 raw IP를 사용하기 때문에 실행시 루트의 권한이 필요함 # ./scanroute –n 192.168.4.14 scanroute 192.168.4.12 1 : 192.168.0.1 : RTT = 0.4930 ms 2 : 192.168.2.4 : RTT = 1.0220 ms 3 : 192.168.3.2 : RTT = 1.0700 ms 4 : 192.168.4.14 : RTT = 2.5320 ms

  21. scanroute 프로그램의 사용방법 • 실행

  22. scanroute 처리의 흐름(1) make_udp_header (UDP 헤더를 작성한다) main make_ip_header (IP 헤더를 작성한다) checksum tvsub (checksum을 계산한다) (tv 구조체의 뺄셈을 한다) 그림 7.7 scanroute의 함수 구조도

  23. scanroute 처리의 흐름(2) 그림 7.8 scanroute처리의 흐름

  24. scanroute 프로그램 리스트의 해설(1) 그림 7.9 scanroute의 패킷 작성 처리

  25. scanroute 프로그램 리스트의 해설(2) • 92 /* UDP/IP 송신용 RAW 소켓 오픈 */ • 93 if ((send_sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { • 94 perror("socket(SOCK_RAW)"); • 95 exit (EXIT_FAILURE); • 96 } • 97 • 98 if (setsockopt(send_sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) { • 99 perror("setsockopt(IPPROTO_IP, IP_HDRINCL)"); • 100 exit (EXIT_FAILURE); • 101 } • 102 • 103 /* ICMP 수신용 RAW 소켓 오픈 */ • 104 if ((recv_sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { • 105 perror("socket(SOCK_RAW)"); • exit (EXIT_FAILURE); • 107 • 108 • 109 /* UDP/IP 패킷 작성 */ • 110 len = sizeof(struct packet_udp); • 111 memset((char *)&sendpacket, 0, sizeof(struct packet_udp)); • 112 make_udp_header(&(sendpacket.udp)); • 113 make_ip_header(&(sendpacket.ip), 0, send_sa.sin_addr.s_addr, len); • 114 ttl을 변경키위해 raw소켓을 사용 ICMP패킷을 수신하기위해 raw소켓 오픈 UDP/IP패킷 을 작성

  26. scanroute 프로그램 리스트의 해설(3) ttl의 값을 1부터 순서 대로 늘림 • 119 for (ttl = 1; ttl <= 64; ttl++) { • sendpacket.ip.ip_ttl = ttl; • for (i = 0; i < 3; i++) { • /* UDP 패킷 송신 */ • 127 if (sendto(send_sd, (char *)&sendpacket, len, 0, • 128 (struct sockaddr *) &send_sa, sizeof send_sa) < 0) { • 129 perror("sendto"); • 130 exit (EXIT_FAILURE); • } • 137 tv.tv_sec = 3; • 138 tv.tv_usec = 0; • 139 reread; • 140 /* select 검사한 디스크리프트 설정 */ • 141 FD_ZERO(&readfd); • 142 FD_SET(recv_sd, &readfd); • if ((select(recv_sd + 1, &readfd, NULL, NULL, &tv)) > 0) { • 153 if (recvfrom(recv_sd, buff, BUFSIZE, 0, NULL, NULL) < 0) { • 154 perror("recvfrom"); • 155 exit (EXIT_FAILURE); IP헤더에 ttl의 값을 설정 ICMP 메시지가 돌아올 떄의 재송 처리용 Loop UDP 패킷 송신 ICMP패킷 수신준비 select 시스템 콜을 사용 수신용 raw 소켓이 패킷을 수신할 때까지 대기 패킷을 수신한 경우 골라냄

  27. scanroute 프로그램 리스트의 해설(4) • 161 if(ip->ip_p !=IPPROTO_ICMP) • 162 goto reread; • 163 • 164 icmp = (struct icmp *) (buff + hlen); • 165 • 166 /* 무한 패킷을 수신하지 않을 것인지 검사 */ • 167 if ((icmp->icmp_type != ICMP_TIMXCEED • 168 || icmp->icmp_code != ICMP_TIMXCEED_INTRANS) • 169 && (icmp->icmp_type != ICMP_UNREACH_PORT)) • goto reread; • 180 if (dns_flg == OFF) • 181 printf("%-15s", hostip); • 182 else if ((host = gethostbyaddr((char *)&ipaddr, 4, AF_INET)) == NULL) • 183 printf("%-15s (%s) ", hostip, hostip); • 184 Else • 185 printf("%-15s (%s) ", hostip, host->h_name); • 186 • 187 printf(": RTT =%8.4f ms", tvml.tv_sec*1000.0 + tvml.tv_usec/1000.0); 무한패킷을 수신한 경우 무시하기위한 처리 IP 어드레스로부터 도메인 명을 조사 및 왕복시간을 계산 표적 호스트로부터 ICMP 포트도달 불능 메시지가 전송되었는지 검사 • if (icmp->icmp_type == ICMP_UNREACH_PORT) { • 222 udp->uh_dport = htons(33434) ; /*traceroute 포트번호 */ UDP의 종착점 포트번호를 지정 32768 +666

  28. 라우팅 테이블과 경로 제어 라우팅 테이블 Redirect 프로그램 개요와 구조 프로그램의 사용 방법 프로그램의 실행 예 처리의 흐름 해설 Scanroute 프로그램 개요와 구조 프로그램의 사용방법 처리의 흐름 해설 요 약

More Related