FreeBSD распределение траффика на UA-IX/World средствами PF

Приветствую!

Помните мою статью "FreeBSD ipfw bandwidth control для UA-IX сетей

Так вот уважаемый Redacid тогда подсказал своё решение для подобных задач.

Спустя год я изменил своё виденье на файерволл во FreeBSD в целом и полностью перешёл на PF.

Ниже привожу скрипт для фомирования таблицы Украинских сетей и последующего использования уже в PF:

#!/bin/sh

/usr/local/bin/wget -q -O – http://noc.ix.net.ua/ua-list.txt | sed 's/\.0$/.0\/24/g' > /tmp/ua-list.txt

for SUBNET in `pfctl -t ua_ix -T show | cut -f 4 -d " " | diff /tmp/ua-list.txt – | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep ">" | cut -f 2 -d " " ` ; do
pfctl -t ua_ix -T delete $SUBNET
done

for SUBNET in `pfctl -t ua_ix -T show | cut -f 4 -d " " | diff /tmp/ua-list.txt – | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep "<" | cut -f 2 -d " " ` ; do
pfctl -t ua_ix -T add $SUBNET
done

Первоначально было так. Но из-за большого количества выпадающих сетей (я бы даже сказал частого) немного изменил его, чтобы видеть какие же всё таки сети выпадают чаще всего.

#!/bin/sh

/usr/local/bin/wget -q -O – http://noc.ix.net.ua/ua-list.txt | sed 's/\.0$/.0\/24/g' > /tmp/ua-list.txt

for SUBNET in `pfctl -t ua_ix -T show | cut -f 4 -d " " | diff /tmp/ua-list.txt – | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep ">" | cut -f 2 -d " " ` ; do
pfctl -t ua_ix -T delete $SUBNET
echo $SUBNET –delete
done

for SUBNET in `pfctl -t ua_ix -T show | cut -f 4 -d " " | diff /tmp/ua-list.txt – | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep "<" | cut -f 2 -d " " ` ; do
pfctl -t ua_ix -T add $SUBNET
echo $SUBNET –add
done

Собственно у нас появилась таблица ua_ix с динамически изменяемыми сетями UA-IX

/etc/crontab

*       *       *       *       *       root    /home/zeon/projects/ua-ix.sh

В самом /etc/pf.conf использую пока для построения графиков. Привожу секцию относящуюся только к этому.

table <ua_ix> persist

pass in on gif0 from any to !<ua_ix> label "world_in"
pass out on gif0 from !<ua_ix> to any label "world_out"

pass in on gif0 from any to <ua_ix> label "uaix_in"
pass out on gif0 from <ua_ix> to any label "uaix_out"

Вызывать аккаунтинг по лейблам можно вот этой командой

pfctl -sl
world_out 15063585 1325371 523049558
world_in 7416209 1526405 1354981094
ua_uaix_out 7416210 1982702 458136247
ua_uaix_in 7416210 2581732 2681024568

Ну и собсно далее будет… 🙂