Перехват / перенаправление пакетов SYN TCP в программу C ++ в linux - PullRequest
1 голос
/ 27 февраля 2009

Я пытаюсь найти самый простой способ перехватить пакеты TCP SYN, отправленные моим компьютером, в программе на c ++. Есть несколько вариантов, которые я знаю. Можно было бы отслеживать весь трафик и просто выборочно работать с пакетами SYN, ничего не делая с остальными. Другой вариант, с которым я столкнулся, - использовать утилиту фильтрации пакетов, которая будет пересылать пакеты SYN в мою программу. Кто-то предложил мне использовать netfilter для того же самого.

Мне было интересно, есть ли другие варианты или я должен углубиться в netfilter. Кроме того, любые указания о том, как это сделать с помощью netfilter, будут полезны.

РЕДАКТИРОВАТЬ: Я хочу перехватить пакет SYN и, возможно, потребуется изменить его (перенаправить на другой пункт назначения, изменить порт назначения и т. Д.), Прежде чем повторно внедрить его обратно в сеть

Редактировать: я смог сделать это, используя комбинацию iptables и libnetfilter_queue. Я использовал ipfilter для перенаправления всех пакетов TCP SYN в определенную очередь (это было с помощью простой команды)
Затем в программе на Си я смог использовать API libnetfilter_queue для доступа к пакетам в очереди, проанализировать их и повторно внедрить в сеть.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2009

Если вы просто хотите увидеть пакеты, используйте libpcap и фильтрацию пакетов - это будет работать почти во всех вариантах UNIX.

Если вы хотите каким-то образом перехватить и переписать пакеты, пожалуйста, предоставьте больше информации о том, что вы пытаетесь сделать, и что после этого должно произойти с пакетами.

Как вы предполагаете, это может быть приложение для netfilter и его модуля queue , хотя для этого требуется ядро ​​2.6.14 или новее:

Основные характеристики

  • получение пакетов из очереди подсистемы ядра nfnetlink_queue
  • вынесение вердиктов и / или повторное внедрение измененных пакетов в ядро Подсистема nfnetlink_queue
0 голосов
/ 27 февраля 2009

Вы можете использовать необработанные сокеты или, например, библиотеку pcap. С помощью pcap вы устанавливаете фильтр и захватываете интересный трафик:

#include <pcap.h>
...
pcap_t* reader_handle;
char errbuf[PCAP_ERRBUF_SIZE];
if ( (reader_handle = pcap_open_live(device_string, capture_size, 0, timeout, errbuf) ) == NULL)
{
    //ooops
}
struct bpf_program fp;
if (pcap_compile(reader_handle, &fp, filter_string, 1, 0) == -1)
{
    //ooops, cleanup
}
if (pcap_setfilter(reader_handle, &fp) == -1)
{
    //ooops, cleanup
}
pcap_freecode(&fp);

И после этого вы просто снимаете, есть несколько разных способов, например:

pcap_pkthdr* header; 
u_char* pkt_data;
const int status = pcap_next_ex(reader_handle, &header, &pkt_data);
// Check the status

После окончания захвата:

pcap_close(reader_handle);

Вам нужны привилегии, чтобы играть с необработанными сокетами. Приведенный выше пример можно красиво обернуть в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...