ioctl을 사용해 ARP Cache의 Entry 추가하기.

kuaaan의 이미지

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 게시판 검색에.. 만 하루를 허비하다 글을 올립니다.

이런 비슷한일 해보신적 있거나 도움을 주실 고수븐들을 기다립니다.
감사합니다. 꾸벅~

wariua의 이미지

arp_flags 필드의 문제입니다. 일단 ATF_COM 플래그가 빠져있습니다. 그리고 ATF_PUBL를 설정해 주셨으므로 이는

[root@fedora a]# arp -s 192.168.100.111 11:11:11:11:11:11 temp -i eth0

가 아니라
[root@fedora a]# arp -s 192.168.100.111 11:11:11:11:11:11 temp -i eth0 pub

가 됩니다.(명령 문법에 맞지 않는 것 같기도 합니다만...) proxy arp를 설정하시는 게 아니라면 pub 옵션을 사용하실 필요는 없겠지요.

인즉

ARPREQ.arp_flags = ATF_COM;

입니다.

$PWD `date`

kuaaan의 이미지

아앗!!!! 그렇군요....
드디어 해결되었네요...
너무 감사합니다~~~ ^^;;

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.