Ненене! Это не наш метод. Я потоптался по всем граблям, и таки научил mpd5 сожрать все украинские сети для фильтров.
Итак, вкратце, пока не забыл - в ядро добавляем BPF_JITTER (если фря - семерка и старше) - сильно успорит обработку bpf.
2 - опытным путем было установлено, что в строка вида match src net 217.175.4.0/22 or src net 217.175.8.0/22 не должна привышать примерно 200 символов.
Быдлоскрипт на баше генерит набор такого вида:
Код: Выделить всё
uaix:
set global filter 3 add 1 "match dst net 4.3.2.0/24 or dst net 8.8.4.0/24 or dst net 8.8.8.0/24 or dst net 62.16.0.0/19 or dst net 62.64.64.0/18 or dst net 62.6
set global filter 3 add 2 "match dst net 62.64.104.0/21 or dst net 62.72.160.0/19 or dst net 62.72.183.0/24 or dst net 62.80.160.0/19 or dst net 62.122.0.0/21 o
set global filter 3 add 3 "match dst net 62.122.104.0/21 or dst net 62.122.152.0/22 or dst net 62.122.152.0/21 or dst net 62.122.156.0/22 or dst net 62.122.200.
set global filter 3 add 4 "match dst net 62.182.80.0/21 or dst net 62.182.81.0/24 or dst net 62.182.82.0/24 or dst net 62.182.84.0/24 or dst net 62.182.85.0/24
set global filter 3 add 5 "match dst net 62.182.120.0/21 or dst net 62.205.128.0/19 or dst net 62.216.32.0/22 or dst net 62.216.36.0/22 or dst net 62.216.40.0/2
set global filter 3 add 6 "match dst net 62.221.34.0/24 or dst net 62.221.35.0/24 or dst net 62.221.37.0/24 or dst net 62.221.38.0/24 or dst net 62.221.39.0/24
set global filter 3 add 7 "match dst net 62.221.42.0/23 or dst net 62.221.44.0/24 or dst net 62.221.45.0/24 or dst net 62.221.46.0/24 or dst net 62.221.47.0/24
<...>
set global filter 3 add 77 "match dst net 85.90.211.0/24 or dst net 85.90.212.0/23 or dst net 85.90.214.0/24 or dst net 85.90.216.0/23 or dst net 85.90.218.0/24
set global filter 3 add 78 "match dst net 85.91.123.0/24 or dst net 85.114.192.0/19 or dst net 85.159.0.0/21 or dst net 85.198.128.0/18 or dst net 85.198.130.0/
set global filter 3 add 79 "match dst net 85.198.136.0/23 or dst net 85.198.139.0/24 or dst net 85.198.144.0/21 or dst net 85.198.152.0/21 or dst net 85.198.164
set global filter 3 add 80 "match dst net 85.198.188.0/22 or dst net 85.202.192.0/20 or dst net 85.223.128.0/17 or dst net 85.223.129.0/24 or dst net 85.223.136
set global filter 5 add 1 "match dst net 85.223.165.0/24 or dst net 85.223.188.0/24 or dst net 85.223.189.0/24 or dst net 85.223.190.0/24 or dst net 85.223.191.
set global filter 5 add 2 "match dst net 86.106.83.0/24 or dst net 86.111.64.0/20 or dst net 86.111.64.0/19 or dst net 86.111.80.0/20 or dst net 86.111.224.0/21
set global filter 5 add 3 "match dst net 87.238.157.0/24 or dst net 87.238.159.0/24 or dst net 87.244.128.0/18 or dst net 87.244.175.0/24 or dst net 87.244.192.
set global filter 5 add 4 "match dst net 87.250.252.0/22 or dst net 88.81.224.0/20 or dst net 88.81.240.0/22 or dst net 88.81.244.0/24 or dst net 88.81.244.0/22
set global filter 5 add 5 "match dst net 88.154.0.0/15 or dst net 88.208.8.0/23 or dst net 88.212.0.0/18 or dst net 88.214.64.0/19 or dst net 88.214.64.0/18 or
file "/usr/local/etc/mpd5/uaix_dst.conf", 498 lines
и похожего вида, с четными номерами фильтров.
Вот тут первое ограничение ng_bpf - примерно 18к адресов сетей может переварить на входе. Поэтому фильтров много.
Теперь второй финт ушами - снять аккаунтинг со всего этого. И попутно прошейпить.
Код: Выделить всё
RAD:mpd-limit+=in#1#1=flt1 pass,mpd-limit+=in#1#1=flt3 pass,mpd-limit+=in#1#1=flt5 pass,mpd-limit+=in#1#1=flt7 pass,mpd-limit+=in#1#1=flt9 pass,mpd-limit+=in#1#1=flt11 pass,mpd-limit+=in#1#1=flt12 pass,mpd-limit+=in#1#1=flt15 pass, mpd-limit+=in#2=all shape 256000 16000, mpd-limit+=out#1#1=flt2 pass, mpd-limit+=out#1#1=flt4 pass, mpd-limit+=out#1#1=flt6 pass, mpd-limit+=out#1#1=flt8 pass, mpd-limit+=out#1#1=flt10 pass, mpd-limit+=out#1#1=flt12 pass, mpd-limit+=out#1#1=flt14 pass, mpd-limit+=out#1#1=flt16 pass, mpd-limit+=out#2=all shape 256000 16000
Вот. Тут есть еще одна интересная штука. Как мне показалась в процессе исследований, биллинг при использовании ng_сar+ng_bpf из коробки траффик по предопределенным направлениям считает правильно по mpd_(input|output)_octets, а дефолтный - по ACCT_(INPUT|OUTPUT) _OCTETS, куда попадает весь траффик, вместе с уже посчитанным.
Мое решение, имхо, будет несколько быстрее, плюс для работающего шейпера по любым направлениям и гибкого сбора статистики только средствами радиуса. Плюс таблицы можно вполне безболезненно грузить прямо на ходу мпд