簡體   English   中英

添加arp入口Linux

[英]Add arp entry Linux

請仔細閱讀問題以提出解決方案

我需要以某種方式在 Linux 中添加永久arp 條目。

問題是:如果我通過 shell 或 sockets 添加一個條目,它總是得到標志 0x6 即使我使用此處發布的代碼,我在其中指定了標志,它仍然保持不變,0x6。

我找到了有關 0x6 標志的信息:

注意“0x6”的ARP標志。 帶有標志 0x6 的 ASIC ARP 條目是與 MAC 緩存相關的條目。 這是安裝session時arp查找失敗引起的。 session 將嘗試使用傳入數據包的源 MAC 地址,但不必使用此 MAC 地址。 當回復包到達時,我們可以通過向源主機發送一個 ARP 包來獲取 MAC 地址。

因此,每當我添加任何 arp 條目,然后我 ping 相同的 ip 地址時,它總是會導致ARP 請求廣播

問題是,有沒有辦法添加帶有正確標志的永久 ARP 條目? 所以我添加一個條目,如果之后有任何通信,不會有任何ARP廣播?

Btw, to get into what I am up to: I am sending a broadcast(L3) from PC1 containing PC1's IP and MAC, PC2 gets the packet and add addresses them into ARP table and establish TCP session, but always first run ARP broadcast.

通過 shell:

#!/bin/sh
arp -s $1 $2 2>/dev/null

通過 sockets:

char *mac_ntoa(unsigned char *ptr){
    static char address[30];

    sprintf(address, "%02X:%02X:%02X:%02X:%02X:%02X",
        ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);

    return(address);
} /* End of mac_ntoa */

int mac_aton(char *addr, unsigned char *ptr){
    int i, v[6];
    if((i = sscanf(addr, "%x:%x:%x:%x:%x:%x", &v[0], &v[1], &v[2], &v[3],
            &v[4], &v[5])) !=6){

        fprintf(stderr, "arp: invalid Ethernet address '%s'\n", addr);
        return(1);
    } /* End of If*/

    for(i = 0; i < 6; i++){
        ptr[i] = v[i];
    } /* End of For */

    return(0);
}

int main(int argc, char* argv[]){
    if(argc < 3 || argc > 4){
        fprintf(stderr,"usage: %s <ip_addr> <hw_addr> [temp|pub|perm|trail]\n",
            argv[0]);
        fprintf(stderr, "default: temp.\n");
        exit(-1);
    } /* End of If */

    int s, flags;
    char *host = argv[1];

    struct arpreq req;
    struct hostent *hp;
    struct sockaddr_in *sin;

    bzero((caddr_t)&req, sizeof(req)); /* caddr_t is not really needed. */

    sin = (struct sockaddr_in *)&req.arp_pa;
    sin->sin_family = AF_INET;
    sin->sin_addr.s_addr = inet_addr(host);

    if(sin->sin_addr.s_addr ==-1){
        if(!(hp = gethostbyname(host))){
            fprintf(stderr, "arp: %s ", host);
            herror((char *)NULL);
            return(-1);
        } /* End of If */
        bcopy((char *)hp->h_addr,
            (char *)&sin->sin_addr, sizeof(sin->sin_addr));
    } /* End of If */

    if(mac_aton(argv[2], req.arp_ha.sa_data)){ /* If address is valid... */
        return(-1);
    }

    argc -=2;
    argv +=2;

    flags = ATF_PERM | ATF_COM;

    while(argc-- > 0){
        if(!(strncmp(argv[0], "temp", 4))){
            flags &= ~ATF_PERM;
        } else if(!(strncmp(argv[0], "pub", 3))){
            flags |= ATF_PUBL;
        } else if(!(strncmp(argv[0], "trail", 5))){
            flags |= ATF_USETRAILERS;
        } else if(!(strncmp(argv[0], "dontpub", 7))){ /* Not working yet */
            flags |= ATF_DONTPUB;
        } else if(!(strncmp(argv[0], "perm", 4))){
            flags = ATF_PERM;
        } else {
            flags &= ~ATF_PERM;
        } /* End of Else*/
    argv++;
    }/* End of While */

    req.arp_flags = flags; /* Finally, asign the flags to the structure */
    strcpy(req.arp_dev, "eth0"); /* Asign the device.  */

    if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
        perror("socket() failed.");
        exit(-1);
    } /* End of If */

    if(ioctl(s, SIOCSARP, (caddr_t)&req) <0){ /* caddr_t not really needed. */
        perror(host);
        exit(-1);
    } /* End of If */

    printf("ARP cache entry successfully added.\n");
    close(s);
    return(0);
}

0x06 標志值表示條目是完整且永久的。 所以我猜你的 shell 腳本足以添加一個 static arp 條目。 這是相關的標志值 -

#define ATF_COM 0x02        /* completed entry (ha valid)   */
#define ATF_PERM    0x04        /* permanent entry      */

您發布的標志0x06的定義與linux kernel無關。

您看到 arp 請求的原因可能是由於您的拓撲或 IP 尋址問題。 你能發布這些細節嗎? 或者,即使 PC2 有 static arp 條目,您也可以發布數據包跟蹤,其中 PC2 執行 arp 請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM