====== 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 :)