Могу ли я сделать «модификатор TCP-пакета», используя tun / tap и необработанные сокеты? - PullRequest
3 голосов
/ 19 апреля 2010

У меня есть приложение для Linux, которое поддерживает протокол TCP, и, чтобы помочь с анализом и статистикой, я бы хотел изменить данные в некоторых пакетах TCP, которые он отправляет. Я бы предпочел сделать это без взлома стека TCP Linux.

Идея, которую я имею до сих пор, состоит в том, чтобы создать мост, который действует как «модификатор пакета TCP». Моя идея состоит в том, чтобы подключиться к приложению через устройство настройки / прослушивания на одной стороне моста и к сетевой карте через необработанные сокеты на другой стороне моста.

Меня беспокоит то, что когда вы открываете необработанный сокет, он все еще отправляет пакеты в стек TCP Linux, и поэтому я не мог их изменять и отправлять, даже если бы захотел. Это правильно?

Эскиз моста с псевдо-C-кодом выглядит так:

tap_fd = open_tap_device("/dev/net/tun");
raw_fd = open_raw_socket();
for (;;) {
    select(fds = [tap_fd, raw_fd]);
    if (FD_ISSET(tap_fd, &fds)) {
        read_packet(tap_fd);
        modify_packet_if_needed();
        write_packet(raw_fd);
    }
    if (FD_ISSET(raw_fd, &fds)) {
        read_packet(raw_fd);
        modify_packet_if_needed();
        write_packet(tap_fd);
    }
}

Это выглядит возможным, или есть другие лучшие способы достижения того же самого? (Соединение и модификация TCP-пакетов.)

Ответы [ 3 ]

1 голос
/ 19 апреля 2010

Возможно, вы захотите использовать библиотеку LD_PRELOAD для подключения функций, которые она использует для отправки данных (send (), write () и т. Д.).

Это вообще не повлечет за собой никаких проблем с ядром.

Другим вариантом является NAT для исходящих соединений с локальным прокси, который может считывать данные, вносить любые изменения и отправлять все это в реальное место назначения (с некоторыми опциями, чтобы предотвратить повторное использование NAT и его повторное использование). круги)

1 голос
/ 19 апреля 2010

Было несколько приложений, которые я использовал несколько лет назад, чтобы выполнить некоторые манипуляции с пакетами TCP / IP для тестирования брандмауэра: fragoute и fragtest . Похоже, их не трогали годами, но они могут дать вам некоторые идеи о том, что делать в вашем коде.

0 голосов
/ 19 апреля 2010

Вы можете использовать click модульный маршрутизатор . Это программный маршрутизатор, полностью реализованный на C ++. Click позволяет вам захватывать пакеты, когда они проходят через elements в маршрутизаторе, где вы можете изменять или собирать статистику по мере необходимости. Как модуль ядра, вы полностью переопределяете механизм маршрутизации linux, а в качестве бинарного файла пользовательского интерфейса вы просто получаете дубликат (как вы упомянули в своем посте) каждого пакета из интерфейса. Пакеты могут направляться через граф Click с помощью фильтров pcap и множества других механизмов.

Если вы направляетесь по маршруту bridge , я думаю, что это обеспечивает самую прямую поддержку того, что вы хотите сделать, так как вы можете использовать tun / tap, с / с хоста или с / с устройства методы захвата, как вам нужно.

...