Проблемът идва оттам, че юзърспейския процес, дали чрез libpcap, дали чрез отваряне на някакъв по-специален raw сокет, успява да тормози достатъчно много процесора, занимавайки се със всеки пристигнал пакет.
Тука вече не съм съгласен. Кернела така или иначе се занимава със всеки пристигнал пакет, копирайки го няколко пъти в паметта eth0->arptables->iptables->routing->iptables->tc(htb)->eth1. libpcap вади копие на пакета който те интересува ( все пак се сетва филтър в кернела ) в един буфер. Не го ли вземеш навреме тоя пакет от userspace следващия го презаписва, няма буфериране на повече от 1 пакет в кернела.
Ето извадка от мой рутер:
# uptime
08:35:45 up 59 days, 21:24, 1 user, load average: 0.01, 0.01, 0.00
# sar -I 66 1 5 | grep Average
Average: 66 15533.89
# ps ax // само процесите които са натрупали cpu
PID TTY STAT TIME COMMAND
2033 ? Ss 1:13 syslogd -m 0
2075 ? Ss 0:00 /usr/sbin/zebra -d -A 127.0.0.1 -f /etc/quagga/zebra.conf
2170 ? Ss 0:14 /usr/sbin/sshd
6166 ? Ss 2:03 /usr/sbin/ospfd -d -A 127.0.0.1 -f /etc/quagga/ospfd.conf
18633 ? Sl 0:18 /usr/sbin/snmpd -Lsd -Lf /dev/null -p /var/run/snmpd.pid -a
18685 ? Ssl 15:25 /usr/sbin/named -u named -c /etc/named.caching-nameserver.conf -t /var/named/chroot
27590 ? Ss 0:00 /sbin/zdhcp -i eth1
Последното е демон който аз съм писал и слухти активно за dhcp сървъри е сегмента. Ползва libpcap и бълва dhcp заявки на всеки 10 сек. Вика с fork php скрипт, който вкарва инфото в mysql база, праща майл, прави лог и при определени случаи се конектва към управляеми switch-ове и филтрира проблемния потребител. За 2 месеца работа използваното cpu е 0:00, а това е рутер в сегмент с 2 class C мрежи, който кара 400+ Mbit, филтрира и шейпи.
Същия демон, само че с libpcap в promics mode пребива рутера в пикови моменти. Има прекалено много начини една мрежа да се изкара от "switched" режим, даже и без зложелателна умисъл. Разликата е дали лан картата хардуерно ще игорира трафика който не е за нея, или в кернела ще се изсипят 80000+ пакета/сек, 2/3 от които кернела така или иначе трябва да дропне, но все пак ще приеме и обработи.
Става въпрос за X7SBI с Core2Quad, 1Gb ram, Centos5 2.6.18-53.