Давайте, я попробую абстрагироваться от моей задачи и описать конкретно суть проблемы ;)Будем рассматривать только одну машину. Будем ловить все пакеты поступающие на данный узел.
Это будем делать с помощью iptables/libipq (кусок кода ниже). Потом с помощью библиотеки libnet я записываю перехваченный пакет КАК ЕСТЬ в сокет. (кусок кода см. ниже).
Wireshark ловит этот "возрожденный" пакет. Но система его будто не обрабатывает. Потому что это например я тестил пингом эту машину и она не отвечает на пинги. Т.к. фактически пакеты не были обработаны системой.
Вот код, отвечающий за перехват пакета:
int status;
unsigned char buf[66000];
struct ipq_handle *h;
h = ipq_create_handle(0, PF_INET);
if (!h)
Die(h);
status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE);
if (status < 0)
Die(h);
do{
status = ipq_read(h, buf, BUFSIZE, 0);
if (status < 0)
Die(h);
switch (ipq_message_type(buf)) {
case NLMSG_ERROR:
fprintf(stderr, "Received error message %s\n",
strerror(ipq_get_msgerr(buf)));
break;
case IPQM_PACKET: {
ipq_packet_msg_t *m = ipq_get_packet(buf);
// m содержит перехваченный пакет.
// отбрасываем оригинальный пакет
status = ipq_set_verdict(h, m->packet_id, NF_DROP, 0, NULL);
// вызываем функцию отправки перехваченного пакета
result = ResendPacket(m->payload, m->data_len);
Код, отвечающий за отправку перехваченного пакета:
int PacketSend::ResendPacket(const u_char * raw_data,
u_short data_len)
{
int network, c;
printf("packet injection in the network! thrhu raw socket\n");
network = libnet_open_raw_sock(IPPROTO_RAW);
if (network == -1)
{
libnet_error(LIBNET_ERR_FATAL, (char *)"Can't open network.\n");
return 1;
}
c = libnet_write_ip(network, (u_char *)raw_data, data_len);
if (c < data_len)
{
libnet_error(LN_ERR_WARNING, (char *)"libnet_write_ip only wrote %d bytes\n", c);
return 1;
}
else
{
printf((char *)"construction and injection completed, wrote all %d bytes\n\n", c);
}
if (libnet_close_raw_sock(network) == -1)
{
libnet_error(LN_ERR_WARNING, (char *)"libnet_close_raw_sock couldn't close the
interface");
return 1;
}
return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS);
}
Жду ваших ответов! Спасибо.