ARP의 실험 발표자 : 이직수 jslee@netwk.hannam.ac.kr
목차 ARP의 개요 ARP의 동작 같은 IP 주소가 있을 때 ARP의 동작 Arpupdate의 개요
ARP의 개요 ARP(Address Resolution Protocol) ARP는 Ethernet이나 토큰링 등의 브로드캐스트형 데이터 링크에 사용되는 프로토콜 IP 어드레스를 검색하는 MAC 어드레스를 검색할 때 사용 IP 패킷을 전송할 때 목적지 물리 주소를 모르는 경우 논리 주소를 이용하여 알아내는 프로토콜 ARP 요구나 응답 패킷은 ARP 테이블을 참조함
ARP 개요 ARP 패킷 포맷
ARP 개요 ARP 구조체 Struct arphdr{ U_short ar_hrd; /* 하드웨어 주소 포맷 */ U_short ar_pro; /* 프로토콜 주소 포맷 */ U_char ar_hln; /* 하드웨어 주소 길이 */ U_char ar_pln; /* 프로토콜 주소 길이 */ U_short ar_op; /* 오퍼레이션 */ }; Struct ether_arp{ struct arphdr ea_hdr; u_char arp_sha[ETHER_ADDR_LEN]; // 송신자 물리 주소 u_char arp_spa[4]; // 송신자 논리 주소 u_char arp_tha[ETHER_ADDR_LEN]; // 타깃 하드 주소 u_char arp_tpa[4]; // 타깃 논리 주소
ARP 개요 ARP 패킷 구조
ARP의 동작 호스트 A측
ARP의 동작 호스트 B측
ARP의 동작 호스트 A는 IP 패킷을 송신하고자 할때 자신의 ARP 테이블 검색 ARP테이블에 타겟 주소가 있으면 패킷을 Ethernet 프레임에 삽입 ARP테이블에 타겟 주소가 없으면 패킷을 ARP 응답 대기 큐에 삽입-ARP 실행 ARP 프로토콜을 실행하여 ARP 요구 패킷을 호스트 B로 전송 호스트 B는 송신된 패킷을 확인하고 자신의 ARP 테이블 갱신 호스트 B는 ARP 응답 패킷을 작성하여 호스트 A로 전송 호스트 A는 수신된 패킷을 확인하고 자신의 ARP 테이블 갱신 호스트 A는 ARP 응답 대기 큐에 있는 IP 패킷을 Ethernet 프레임에 넣어서 목적지 호스트로 전송 => ARP 요구 패킷과 응답 패킷은 두 호스트 간에 ARP 테이블을 갱신한다.
ARP의 동작 ARP 테이블
같은 IP 주소가 있을 때 ARP 요구 패킷 전송
같은 IP 주소가 있을 때 호스트 C 통신 불능
arpupdate의 개요 arpupdate의 목적 arp 프로토콜의 기능이나 동작 내용 이해 arp 프로토콜의 문제점 이해 arpupdate는 특정 IP 주소를 갖는 호스트를 3가지 방법으로 통신 불능 상태로 만듦
arpupdate의 개요
arpupdate의 개요 호스트 D는 타깃 호스트인 C를 찾기 위해 ARP 요구 패킷을 브로드캐스트 함 호스트 A는 네트워크 내에서 ARP 요구 패킷을 모니터링 함 호스트 C가 ARP 요구 패킷에 대해 응답함 호스트 A는 arpupdate가 작성한 패킷을 호스트 D로 전송 호스트 D는 ARP 테이블에 잘못된 주소를 갱신함 호스트 D는 통신 불가능 상태가 됨
arpupdate의 개요
arpupdate의 개요
arpupdate의 개요
arpupdate 함수 구조도
arpupdate 처리 흐름
arpupdate 프로그램 리스트
arpupdate 프로그램 리스트 명령어 인수 해석, 옵션 설정 명령어 인수로부터 IP 주소와 MAC 주소 넣음 flag = NORMAL; if(argc == 5) if(strcmp(argv[OPTION], "reply") == 0) flag = REPLY; else if (strcmp(argv[OPTION], "request") == 0) flag = REQUEST; else { help(argv[CMD_NAME]); return EXIT_FAILURE; } } else if ((argc != 4) { help(argv[CMD_NAME]); return EXIT_FAILURE; } strcpy(ifname, argv[IFNAME]); dst_ip = inet_addr(argv[DST_IP]); if ((sscanf(argv[MAC_ADDR], "%x:%x:%x:%x:%x:%x", &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5]) !=6) { printf("MAC Address error %s\n", argv[MAC_ADDR]); return EXIT_FAILURE; }
arpupdate 프로그램 리스트 데이터 링크 액세스 인터페이스 열기 if((s=socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL))) < 0) { perror("socket"); return EXIT_FAILURE; } memset(&sa, 0, sizeof sa); sa.sa_family = PF_PACKET; strcpy(sa.sa_data, ifname); if(bind(s, &sa, sizeof sa)<0){ perror("bind"); if((s=open_bpf(ifname))<0) return EXIT_FAILURE; bpf_len=0;
arpupdate 프로그램 리스트 MAC 주소 타입 검사 Reply 설정 처리 Request 설정 처리 if ((memcmp (eth->ether_dhost, mac_addr, 6) != 0 && memcmp(eth->ether_shost, mac_addr, 6) !=0 && ntohs(eth->ether_type) == ETHERTYPE_ARP){ make_arp((struct ether_arp *)sp, ARPOP_REPLY, mac_addr, arp->arp_tpa, arp->arp_sha, arp->arp_spa); make_ethernet((struct ether_header *)send_buff, arp->arp_sha, mac_addr, ETHERTYPE_ARP); make_arp((struct ether_arp *)sp, ARPOP_REQUEST, mac_addr, arp->arp_spa, zero, arp->arp_tpa); make_ethernet((struct ether_header *)send_buff, arp->arp_sha, mac_addr, ETHERTYPE_ARP);
arpupdate 실행 예 - reply
arpupdate 실행 예 - request
arpupdate 실행 예 - normal
Thank you… Q & A mailto://jslee@netwk.hannam.ac.kr