ARP-ответ через маршрутизатор - PullRequest
0 голосов
/ 30 октября 2019

Я довольно плохо знаком с сетью и пытаюсь понять запросы ARP. Я использую mininet и wireshark, чтобы проверить, что я делаю.

Когда я использую mininet для генерации 2 хостов (h1 и h2) и коммутатора, моя трансляция ARP немедленно отвечает ARPответьте, все работает правильно.

Когда я использую данный скрипт router.py, который генерирует следующее в mininet -

*** Creating network
*** Adding controller
*** Adding hosts:
h1x1 h1x2 h2x1 h2x2 h3x1 h3x2 r0 
*** Adding switches:
s1 s2 s3 
*** Adding links:
(h1x1, s1) (h1x2, s1) (h2x1, s2) (h2x2, s2) (h3x1, s3) (h3x2, s3) (s1, r0) (s2, r0) (s3, r0) 
*** Configuring hosts
h1x1 h1x2 h2x1 h2x2 h3x1 h3x2 r0 
*** Starting controller
c0 
*** Starting 3 switches
s1 s2 s3 ...
*** Routing Table on Router:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 r0-eth3
172.16.0.0      0.0.0.0         255.240.0.0     U     0      0        0 r0-eth2
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 r0-eth1
// ./a.out Send <InterfaceName>  <DestIP> <RouterIP> <Message>
mininet> h1x1 ./a.out Send h1x1-eth0 10.0.0.1 192.168.1.100 'This is a test'

Вот так я запускаю команду в mininet для запуска запроса ARP.

Когда я пытаюсь выполнить запрос ARP, используя IP-адрес назначения 10.0.0.1 и IP-адрес маршрутизатора 192.168.1.00, мой запрос ARP вещает нормально, но я не получаю ответ ARP, вместо этого я получаю серию ответов ICMPv6,

enter image description here

Вот как я создаю свой ARP-заголовок

struct arp_hdr construstArpRequest(char if_name[], int sockfd, struct in_addr dst, struct ifreq if_hwaddr) {
    printf("Constructing ARP request --\n");
    struct arp_hdr arphdr;
    arphdr.ar_hrd = htons(0x0001);
    arphdr.ar_pro = htons(0x0800);
    arphdr.ar_hln = 6;
    arphdr.ar_pln = 4;
    arphdr.ar_op = htons(0x0001);

    unsigned long sip = get_ip_saddr(if_name, sockfd); // source IP
    memcpy(arphdr.ar_sip, &sip, 4); // source IP
    memcpy(arphdr.ar_tip, &dst.s_addr, 4); // taget IP
    memset(arphdr.ar_tha, 0, 6); // taget HA
    memcpy(arphdr.ar_sha, if_hwaddr.ifr_hwaddr.sa_data, 6); // source HA

    return arphdr;
}

И я создаю свой ARP-запрос

        int sockfd = -1;
        if((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0){
            perror("socket() failed!");
        }

        // connect to an internet frame
        struct ifreq if_hwaddr;
        memset(&if_hwaddr, 0, sizeof(struct ifreq));
        strncpy(if_hwaddr.ifr_name, interfaceName, IFNAMSIZ-1);
        if(ioctl(sockfd, SIOCGIFHWADDR, &if_hwaddr) < 0){
            perror("SIOCGIFHWADDR");
        }

        struct arp_hdr arpRequest;
        arpRequest = construstArpRequest(interfaceName, sockfd, router_ip, if_hwaddr);

Если мне нужно включить код о том, как я на самом деле отправляю запрос, я могу, но не уверен, нужен ли этот код. В ходе моего исследования я сталкивался с некоторыми ответами, в которых говорилось, что вы не получите широковещательный ответ, потому что вы запускаете его по сети, в таком случае, как вы получаете целевой MAC-адрес?

1 Ответ

1 голос
/ 30 октября 2019

ARP-запросы предназначены только для IPv4 и используют широковещательную рассылку (IPv6 не имеет широковещательной рассылки и использует NDP, а не ARP), но маршрутизаторы не пересылают широковещательные рассылки в другую сеть.

Исходный хост будетзамаскируйте адрес назначения его настроенной маской, чтобы определить, находится ли адрес назначения в той же сети. Если пункт назначения находится в той же сети, он будет использовать ARP (либо в таблице ARP, либо отправлять новый запрос ARP), чтобы определить адрес канала передачи данных хоста назначения и использовать его для построения кадра канала передачи данных. Если пункт назначения находится в другой сети, узел источника будет использовать ARP (либо в таблице ARP, либо отправлять новый запрос ARP), чтобы определить адрес канала передачи данных своего настроенного шлюза, и он будет использовать канал передачи данных шлюза. адрес для построения фрейма канала передачи данных.

Вы пытаетесь использовать запрос ARP для хоста в другой сети, и это не будет работать. Попытка отправить запрос ARP для пункта назначения в другой сети не получит ответа, и вы видите это (вам нужно установить таймаут для ваших запросов ARP и отправить сообщение об ошибке по сетевому стеку запрашивающему процессу, когда оновремя ожидания).

Трафик IPv6, который вы видите, является обычным трафиком обслуживания IPv6, который периодически происходит в локальной сети, где настроен IPv6.

...