Чтение таблицы маршрутизации из пространства пользователя - PullRequest
1 голос
/ 20 января 2020

Я хочу найти маршрут пакета в пространстве пользователя. У меня есть dst ip, и я хочу прочитать таблицы ядра, поэтому он выдаст мне результат в соответствии с текущим ip route cfg. любой способ сделать это в C?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Вы можете сделать следующее, чтобы получить индекс интерфейса:

Сначала создайте сокет UDP к месту назначения:

int fd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in in;

in.sin_family = AF_INET;
in.sin_port = htons(1234);
in.sin_addr.s_addr = inet_addr("1.2.3.4");
connect(fd, (struct sockaddr *)&in, sizeof(struct sockaddr_in));

Затем вызовите getsockname(), чтобы определить адрес интерфейса. исходящего интерфейса для этого сокета:

int inlen = sizeof(in);
getsockname(fd, (struct sockaddr *)&in, &inlen);

Теперь получите все структуры интерфейса системы и найдите правильный адрес интерфейса:

struct ifaddrs *ifa, *ifap;

getifaddrs(&ifa);
ifap = ifa;
char *ifname = NULL;
while (ifa) {
   if (((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr ==
       in.sin_addr.s_addr) {
      ifname = strdup(ifa->ifa_name);
      break;
   }
   ifa = ifa->ifa_next;
}
freeifaddrs(ifap);

Наконец, получите индекс интерфейса для интерфейса name:

struct ifreq iface;

strncpy(iface.ifr_name, interface, IFNAMSIZ);
iface.ifr_name[IFNAMSIZ-1] = 0;
int len = sizeof(iface);
ioctl(fd, SIOCGIFINDEX, &iface, &len);

int ifindex = iface.ifr_ifindex;

Выглядит немного сложно, но не зависит от netlink (что тоже не намного проще).

1 голос
/ 20 января 2020

Запрос ядра через nlmsg выглядит как le git и работал для меня в прошлом.

Я тогда начал с этого ответа:

{ ссылка }

...