man ipfw
Here are some important points to consider when designing your rules:
o Remember that you filter both packets going in and out.
--> Most connections need packets going in both directions. <--
o Remember to test very carefully. It is a good idea to be near the console when doing this. If you cannot be near the console, use an auto-recovery script such as the one in
/usr/share/examples/ipfw/change_rules.sh.
o Don't forget the loopback interface.
imho это значит следующее. Каждый пакет проходит через брандмауэр. Соответственно каждый входящий и каждый выходящий.
Надо понимать, что пакет _проходящий_ через машину на самом деле удваивается: один пакет принимается, а второй, почти полностью идентичный (с измененным TTL и проч.), но с такими же src/dst отправляется. И каждый из них проходит через брандмауэр.
Отсюда возможна ситуация, когда оба пакета считаются одним и тем же правилом (если оно без in/out).
В твоем случае все зависит от того, что такое 10.1.1.XX:
а) если это сама машина, то все нормально; пакет не станет исходящим и посчитается один раз;
б) если это машина, подключенная к другому интерфейсу (не xl0) -- то тоже все ок, так как выходящий пакет не будет отвечать твоему правилу;
в) если же 10.1.1.XX -- хост, подключенный через тот же xl0, то возникнет ситуация двойного подсчета.
А вообще -- хочешь считать гарантированно только входящий трафик, поставь in
Еще. Есть такое словечко -- log. включи ненадолго, и посмотри, какие пакеты и когда считаются. Чрезвычайно проясняет ситуацию :)