LINUX.ORG.RU
ФорумAdmin

Настраиваемый аналог tcpreplay для UDP?

 , ,


0

1

Есть приложение которое принимает по UDP запросы от внешней железки.
Для тестирования хотелось бы генерировать эти запросы локально, чтобы не зависеть от внешних факторов и делать это быстрее.
Условия:
1. Приложение ожидает пакеты с определённого IP адреса, локально я такой на интерфейс назначить не могу.
2. Есть дамп пакетов, т.е. структура известна
Вопрос:
Можно ли и если можно то чем, используя существующий дамп генерировать запросы локально, гибко меняя нужные поля?
Использование существующего дампа непринципиально, но это сэкономило бы время, а то вручную его воспроизводить слишком муторно
Подумывал о какой-нибудь библиотеке для питона, но инструмент в общем тоже непринципиален.

★★★★★
Ответ на: комментарий от beastie

специфика сети и всего решения в целом делает отвязку от IP слишком геморройной...

предложенные варианты на первый взгляд позволяют модифицировать только заголовки на L2/L3/L4 (и непонятно можно ли будет сгенерировать пакет от нелокального адреса) покурю маны поглубже возможно ли более гибкое изменение пакета

zolden ★★★★★
() автор топика

1. Приложение ожидает пакеты с определённого IP адреса, локально я такой на интерфейс назначить не могу.

Что мешает создать изолированный VLAN и назначить там любые адреса, которые вздумается?

blind_oracle ★★★★★
()

гм. Если ядро с transparent proxy, то можно биндить сокет на не локальный адрес и слать с него пакеты.

Я обычно скармливал .pcap через tap-интерфейс при помощи простенького перлового скрипта, когда тестировал nDPI.

#!/usr/bin/perl
use Net::Pcap;
#use Net::IP;
use Linux::TunTap;

my($dev,$pcap,$dumper,$dump_file,$err) = ('','','','');

die "src not exist ".$ARGV[0]."\n" if ! -f $ARGV[0];

my $ai = 0;

my $tap=new Linux::TunTap(NAME => 'tap%d');

die "AAA" if !$tap;

system("/sbin/ifconfig ".$tap->{interface}." up");
system("brctl addif br0 ".$tap->{interface});

my $count = 0;
my $np = pack("N",0);

sub store_packet {
    my($user_data, $header, $packet) = @_;
    my $h1=unpack("n",substr($packet,12,2));
    if($h1 != 0x8100) {
        $tap->put_raw($np.$packet);
    } else { # VLAN
        my $p1=substr($packet,0,12).substr($packet,16);
        $header->{len} -= 4;
        $header->{caplen} -= 4;
        $tap->put_raw($np.$p1);
    }
    $count++;
}
do {
    $pcap=Net::Pcap::open_offline($ARGV[$ai],\$err);
    if(!$pcap){
        die "aaa ".$err if $ai == 1;
        last;
    }
    $ai++;
    Net::Pcap::loop($pcap, 0 ? 2:$total, \&store_packet, $user_text);
    Net::Pcap::close($pcap);
} while( -f $ARGV[$ai]);
system("brctl delif br0 ".$tap->{interface});
можно без бриджа, если адрес назначения локальный.

Больше 800мбит получить не удавалось, пришлось переписать на сях.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от frob

О, выглядит очень круто, спасибо

zolden ★★★★★
() автор топика

На интерфейс lo можно добавить любое количество любых адресов. В сеть они светиться не будут, если на остальных интерфейсах ты случайно не включишь proxy arp.

iliyap ★★★★★
()

Я разрабатывал серверы и клиенты протоколов RADIUS, GTP, Diameter, SMPP. По моему опыту разработка эмуляторов окупается. Их можно использовать и при разработке и при тестировании. И действительно добиться покрытия кода тестами. Дампами код не покроешь.

iliyap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.