Чтение кадров с крана с прокси ARP - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь прочитать кадры с устройства крана по ссылке, которая начинается с двунаправленного (поэтому кэш ARP является звуком), но затем переходит в однонаправленный. Записи ARP истекают и выпадают. Я попытался включить прокси ARP (/proc/sys/net/ipv4/conf/XXX/proxy_arp) на устройстве ethX, устройстве tap0 и мосте br0. Несмотря ни на что, моя программа перестает получать пакеты UDP. Он видит запросы ARP до тех пор, пока я не включу proxy_arp на br0

Запуск tcpdump с прокси-сервером ARP на br0 Я вижу запрос ARP и отвечаю. Я также вижу пакет UDP в tcpdump, но моя программа ничего не видит.

Я пропускаю какие-либо другие флаги конфигурации?

Вот мой быстрый взлом, тестирование с использованием netcat и UDP

#include <sys/types.h>
#include <unistd.h>
#include <net/if.h>
#include <linux/if_ether.h>
#include <linux/if_tun.h>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netinet/ip.h>

int main(int argc, char ** argv)
{
   int fd = 0;
   struct ifreq ifr = ifreq();

   //  When a character array is initialized with a string literal that is too short, the remainder of the array is zero-initialized.
   char devname[IFNAMSIZ] = "tap0";

   fd = open("/dev/net/tap", O_RDWR);
   if (fd < 0)
   {
      printf("ERROR Opening tap device\n");
      return (1);
   }

   memset(&ifr, 0, sizeof(ifr));

   /* Flags: IFF_TUN   - TUN device (no Ethernet headers)
    *        IFF_TAP   - TAP device
    *
    *        IFF_NO_PI - Do not provide packet information
    */
   ifr.ifr_ifru.ifru_flags = IFF_TAP | IFF_NO_PI;

   if(strcmp(devname, ""))
   {
      snprintf(ifr.ifr_ifrn.ifrn_name, sizeof(ifr.ifr_ifrn.ifrn_name), "%s", devname);
   }
   if(ioctl(fd, TUNSETIFF, &ifr) >= 0)
   {

      // Create bridge
      system("brctl addbr br0");
      system("brctl addif br0 eth2");
      system("brctl addif br0 tap0");
      system("ifconfig tap0 up");
      system("ifconfig br0 up");
      while(1)
      {
         printf("Reading...\n");
         char buffer[1500];
         ssize_t count = read(fd, &buffer, sizeof(buffer));
         if(count > 0)
         {
            printf("Read %d bytes\n", count);
            uint8_t* char_buffer = reinterpret_cast<uint8_t *>(&buffer);
            for(unsigned int byte = 0 ; byte < count; byte++)
            {
               printf("%2X ", char_buffer[byte]);
            }
            printf("\n");
         }
         else if(count < 0)
         {
            break;
         }
      }
   }
}
...