Generator pakietów w systemie Linux
- Kamil Folga,
- 14.10.2013
Przykładowo na maszynie czteroprocesorowej istnieją cztery procesy PKTGEN:
web:~# ps aux | grep pktgen
root 23324 0.0 0.0 0 0 ? S< 22:05 0:00 [kpktgend_0]
root 23326 0.0 0.0 0 0 ? S< 22:05 0:00 [kpktgend_1]
root 23327 0.0 0.0 0 0 ? S< 22:05 0:00 [kpktgend_2]
root 23328 0.0 0.0 0 0 ? S< 22:05 0:00 [kpktgend_3]
Aby określony proces PKTGEN obsługiwał określoną kartę sieciową, należy ustawić /proc/irq/X/smp_affinity, w celu powiązania karty sieciowej z procesorem. Numer przerwania irq przydzielony do określonych kart sieciowych NIC jest widoczny w /proc/interrupts. Przykładowo:
web:~# cat /proc/interrupts | grep eth
18: 162868851 0 0 0 IO-APIC-fasteoi eth0
29: 569 0 0 0 IO-APIC-fasteoi eth1
Przypisujemy eth0 do CPU0, natomiast eth1 CPU1:
echo 1 > /proc/irq/18/smp_affinity
echo 2 > /proc/irq/29/smp_affinity
Kontrola PKTGEN odbywa się za pomocą systemu plików proc. Pliki wynikowe są tworzone w katalogu: /proc/net/pktgen/*. Najlepszym sposobem na konfigurację pakietu PKTGEN jest wspomniana wcześniej metoda poprzez skrypty konfiguracyjne. Zakres parametrów możliwych do wykorzystania jest dość szeroki i pozwala zrealizować właściwie każdą konfigurację generowanego ruchu. Przykładowe skrypty są dostępne z wielu źródeł. Przykład skryptu wysyłającego ruch na adresy IP z zakresu 10.0.50.10-30 może wyglądać następująco:
#!/bin/bash
modprobe pktgen
function pgset() {
local result
echo $1 >$PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Konfiguracja urządzenia sieciowegoPGDEV=/proc/net/pktgen/kpktgend_0
pgset "rem_device_all"
pgset "add_device eth0"
pgset "max_before_softirq 10000"
# Konfiguracja parametrów generowanego ruchu
PGDEV=/proc/net/pktgen/eth0
pgset "clone_skb 0"
pgset "dst_min 10.0.50.10"
pgset "dst_max 10.0.50.30"
# Uruchamiany PKTGEN
PGDEV=/proc/net/pktgen/pgctrl
pgset "start"