====== IPFW tables ======
Czasem się zdarza, że trzeba wypełnić tablicę dużą ilością obiektów, np. lista blokowanych IP. W takim wypadku klasyczne podejście by wypełniać tablicę w pętli w bash-u mija się z celem, to trwa to zbyt długo. Dla przykładu lista zawierająca 105k adresów, która zostanie wczytana przy pomocy skryptu:
while read IP_ADDR; do
ipfw -q table IPSUM add $IP_ADDR
done < /etc/ipsum_ip.txt
Wykona się w czasie:
# ipfw table IPSUM info
--- table(IPSUM), set(0) ---
kindex: 2, type: addr
references: 0, valtype: legacy
algorithm: addr:radix
items: 0, size: 296
# time ./ipsum_bash.sh
69.451u 209.959s 4:46.19 97.6% 398+188k 0+0io 0pf+0w
# ipfw table IPSUM info
--- table(IPSUM), set(0) ---
kindex: 2, type: addr
references: 0, valtype: legacy
algorithm: addr:radix
items: 105675, size: 12681296
Czas ten można znacząco skrócić, gdy zamiast listy adresów IP (jeden na linię), stworzymy listę poleceń do IPFW jak poniżej:
table IPSUM add xxx.xxx.xx.xx
table IPSUM add xxx.xxx.xxx.x
table IPSUM add xxx.xxx.xx.xxx
table IPSUM add xx.xxx.xxx.x
...
Wtedy ładujemy ją poleceniem:
ipfw /path/lista.txt
Porównanie czasu ładowania:
# ipfw table IPSUM info
--- table(IPSUM), set(0) ---
kindex: 2, type: addr
references: 0, valtype: legacy
algorithm: addr:radix
items: 0, size: 296
# time ./ipsum_ipfw.sh
0.307u 0.485s 0:00.81 96.2% 156+176k 0+0io 0pf+0w
# ipfw table IPSUM info
--- table(IPSUM), set(0) ---
kindex: 2, type: addr
references: 0, valtype: legacy
algorithm: addr:radix
items: 105675, size: 12681296
Przyspieszenie tej operacji to ponad 400x :)