У меня есть приложение для 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-пакетов.)