Пусть условно локалка имеет адреса 192.168.0.0/24 и есть внешний IP=$IPADR. Пусть внешний интерфейс - wi0 (с адресом $IPADR), а внутренний ed0 (с адресом 192.168.0.100). Пусть, к примеру, есть конкретный пользователь в локалке (192.168.0.29) , чей траффик нас интересует.
В этом случае опционально на мой взгляд составить такие правила:
10 allow ip from any to any via lo0
200 divert 8668 ip from any to any via xl0
# для свободного доступа к данной машины из локалки :
210 allow ip from $IPADR to 192.168.0.0/24
211 allow ip from 192.168.0.100 to 192.168.0.0/24
212 allow ip from 192.168.0.0/24 to 192.168.0.100
# открываем исходящий поток :
220 allow ip from $IPADR to not 192.168.0.0/24 via wi0
# Для нормальной работы DNS :
230 allow udp from any 53 to $IPADR
231 allow udp from 192.168.0.0/24 to any 53
# Безконтрольно пропускаем все идущее из "вне" в локалку через внутренний интерфейс
240 allow ip from not 192.168.0.0/24 to 192.168.0.0/24 via ed0
# Блок для сбора статистики. Кол-во таких блоков = кол-ву юзеров в сети
1010 allow tcp from any to 192.168.0.29 via wi0
1020 allow udp from any to 192.168.0.29 via wi0
1030 allow ip from 192.168.0.29 to any
# всех остальных запрещаем.
65535 deny ip from any to any
Затем, снимается статистика с правил 1010 и 1020.
Несовпадение в статистике у тебя было вызвано тем, что ты считал суммарный траффик с внешнего и внутреннего интерфейсов, то есть в двойном размере.
Я написал простенький скрипт, который периодически снимает траффик с логов IPFW и сохраняет в файл. Эти данные дальше отображаются через веб пользователям. Если интересует, то могу его выслать.