ioctl을 사용해 ARP Cache의 Entry 추가하기.
글쓴이: kuaaan / 작성시간: 금, 2006/02/17 - 2:36오후
Linux 머쉰에서 로컬의 ARP Cache에 새로운 엔트리를 추가하고자 합니다. 말하자면[root@fedora a]# arp -s 192.168.100.111 11:11:11:11:11:11 temp -i eth0
위의 명령어가 하는 일을 프로그램에서 코드로 하고싶다는 뜻입니다.
UNP 442페이지의 코드를 잘 보고 비슷하게 만들어봤는데.. 잘 안되네요.
#include <sys/time.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <signal.h> #include <stdio.h> #include <time.h> #include <unistd.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <errno.h> #include <net/if.h> #include <netinet/ether.h> #include <arpa/inet.h> #include <pthread.h> #include <errno.h> #include <unistd.h> #include <net/if_arp.h> #include <sys/socket.h> #include <stdlib.h> #include <stdio.h> #include <netinet/ether.h> #include <netinet/in.h> // --> 있는헤더 없는헤더 전부... int setARPCache(u_int IP, struct ether_addr Mac, char*); int main(int argc, char** argv) { struct ether_addr Mac = {0}; struct in_addr IP = {0,}; if (argc != 4) { printf("Usage : %s [IP] [Mac] [NIC]\n", argv[0]); exit(0); } inet_aton(argv[1], &IP); memcpy(&Mac, ether_aton(argv[2]), sizeof(struct ether_addr)); setARPCache(IP.s_addr, Mac, argv[3]); } int setARPCache(u_int IP, struct ether_addr Mac, char* NI) { // set arp cache temporarily int sockfd, result; struct arpreq ARPREQ = {0,}; struct sockaddr_in PROTO_ADDR = {0,}; if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return false; } PROTO_ADDR.sin_family = AF_INET; PROTO_ADDR.sin_addr.s_addr = IP; memcpy((void*)&ARPREQ.arp_pa , (void*)&PROTO_ADDR, sizeof(struct sockaddr_in)); ARPREQ.arp_ha.sa_family = AF_UNSPEC; memcpy((void*)&ARPREQ.arp_ha.sa_data , (void*)&Mac, sizeof(struct ether_addr)); strcpy(ARPREQ.arp_dev, NI); ARPREQ.arp_flags |= ATF_PUBL; result = !(ioctl(sockfd, SIOCSARP, &ARPREQ)); close(sockfd); return result; }
컴파일해서 실행시켜보면 다음과 같이 됩니다.
[root@fedora a]# ./arp 192.168.100.111 11:11:11:11:11:11 eth0 [root@fedora a]# arp -a ? (192.168.10.105) at 00:D0:B7:E0:6D:5E [ether] on eth0 ? (192.168.11.1) at 00:07:40:62:4C:0C [ether] on eth0 ? (192.168.100.111) at * PERM PUP on eth0
--> 위에 보시면 뭔가 등록이 되긴 하지만... 실제 MAC은 등록되지 않음을 알수 있습니다.
arp 명령어의 소스코드도 뒤져보고 했는데... 뭔가 커널함수를 사용하는지.. 당췌 알수가 없더군요...
구글에... kldp 게시판 검색에.. 만 하루를 허비하다 글을 올립니다.
이런 비슷한일 해보신적 있거나 도움을 주실 고수븐들을 기다립니다.
감사합니다. 꾸벅~
Forums:
arp_flags 필드의 문제입니다. 일단 ATF_COM 플래그가 빠져있
arp_flags 필드의 문제입니다. 일단 ATF_COM 플래그가 빠져있습니다. 그리고 ATF_PUBL를 설정해 주셨으므로 이는
가 아니라
가 됩니다.(명령 문법에 맞지 않는 것 같기도 합니다만...) proxy arp를 설정하시는 게 아니라면 pub 옵션을 사용하실 필요는 없겠지요.
인즉
입니다.
$PWD `date`
아앗!!!! 그렇군요....드디어 해결되었네요...너무 감사합니다
아앗!!!! 그렇군요....
드디어 해결되었네요...
너무 감사합니다~~~ ^^;;
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
댓글 달기