Почему я не могу перехватить сырой пакет, хотя tcpdump может?
Я пытаюсь перехватить пакеты с зеркалированием портов, используя необработанный сокет (пропущена проверка ошибок, чтобы показать только основной код):
int sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
int size = recvfrom(sock, buf, 65536, 0, &saddr, &saddr_size);
struct iphdr* iph = (struct iphdr*)(buf + sizeof(struct ethhdr));
if (iph->protocol != 6 || iph->saddr != inet_addr("192.168.12.48")) return;
printf("got it\n");
Хотя tcpdump может захватывать пакеты, моя программа не может. Вот дамп пакета:
22:19:42.140498 IP (tos 0x0, ttl 54, id 42987, offset 0, flags [DF], proto TCP (6), length 52)
192.168.12.48.33011 > 172.16.103.12.57102: Flags [.], cksum 0xf4ef (correct), ack 7, win 186, options [nop,nop,TS val 1950796524 ecr 3768292988], length 0
0x0000: 4500 0034 a7eb 4000 3606 bce3 c0a8 0c30 E..4..@.6......0
0x0010: ac10 670c 80f3 df0e 983d f043 d1c7 3087 ..g......=.C..0.
0x0020: 8010 00ba f4ef 0000 0101 080a 7446 caec ............tF..
0x0030: e09b 967c ...|
Я использую ядро CentOS 6.5 2.6.32-431.29.2.el6.x86_64. Я уже отключил брандмауэр и установил rp_filter в 0. Кто-нибудь знает, как перехватывать такие пакеты в C?