<< | обсуждения | >> февраль 2006 | архив + поиск << | по дате | >>

[freebsd] проблема с ng_ipacct + ngctl





16.02.06, Андрей Кочетков <andrews > написал(а):
Предлагаю воспользоваться ng_netflow.
Вот стартовый скрипт:
#! /bin/sh
#

IFACES="vlan0 vlan1"
FLOW_EXPORT_ADDR="62.33.196.222"
FLOW_EXPORT_PORT="20001"

# Start/restart routine
netflow_start() {

       # Load netgraph KLD's as necessary
       for KLD in ng_socket ng_ksocket ng_ether ng_tee ng_netflow; do
               if kldstat -v | grep -qw ${KLD}; then
               else
                       echo -n "Loading ${KLD}.ko... "
                       kldload ${KLD} || exit 1
                       echo "done"
               fi
       done

       # Reset all interfaces
       netflow_stop

       # Verify all interfaces exist
       for ETHER in ${IFACES}; do
               if ngctl info ${ETHER}: >/dev/null 2>&1; then
               else
                       echo "Error: interface ${ETHER} does not exist"
                       exit 1
               fi
               ifconfig ${ETHER} up || exit 1
       done

       # Starting input direction
       netflow_input

       # Starting output direction
       netflow_output

       # Set all interfaces in promiscuous mode and don't overwrite src addr
       ngctl msg netflow: settimeouts { inactive=15 active=300 }
       ngctl mkpeer netflow: ksocket export inet/dgram/udp || exit 1
       ngctl msg netflow:export connect inet/${FLOW_EXPORT_ADDR}:${FLOW_EXPORT_PORT} || exit 1

}

# INPUT direction
netflow_input() {

       IFNUM=0
       # Hook up local interface, if any
       for IF in ${IFACES}; do

               if [ ${IFNUM} = 0 ]; then
                       # Create new ng_netflow node, attached to the first interface
                       ngctl mkpeer ${IF}: tee lower right || exit 1
                       ngctl connect ${IF}: ${IF}:lower upper left || exit 1
                       INTNAME="${IF}_tee"
                       ngctl name ${IF}:lower ${INTNAME}
                       ngctl mkpeer ${INTNAME}: netflow right2left iface${IFNUM} || exit 1
                       ngctl name ${IF}:lower.right2left netflow || exit 1
                       IFINDEX=`ngctl msg ${IF}: getifindex >&1` || exit 1
                       IFINDEX=`echo ${IFINDEX} >&1 | sed -n 's/.*[a-z].*: \([0-9]*\).*$/\1/p'`
                       ngctl msg netflow: setifindex { iface=${IFNUM} index=${IFINDEX} } || exit 1
               else
                       # Attace another interfaces to netflow node
                       ngctl mkpeer ${IF}: tee lower right || exit 1
                       ngctl connect ${IF}: ${IF}:lower upper left || exit 1
                       INTNAME="${IF}_tee"
                       ngctl name ${IF}:lower ${INTNAME}
                       ngctl connect ${INTNAME}: netflow: right2left iface${IFNUM} || exit 1
                       IFINDEX=`ngctl msg ${IF}: getifindex >&1` || exit 1
                       IFINDEX=`echo ${IFINDEX} >&1 | sed -n 's/.*[a-z].*: \([0-9]*\).*$/\1/p'`
                       ngctl msg netflow: setifindex { iface=${IFNUM} index=${IFINDEX} } || exit 1
               fi
               IFNUM=`expr ${IFNUM} + 1`
       done

}

# OUTPUT direction
netflow_output() {

       IFNUM=10
       # Hook up local interface, if any
       for IF in ${IFACES}; do

                       # Attace another interfaces to netflow node
                       ngctl connect ${IF}:lower netflow: left2right iface${IFNUM} || exit 1
                       IFINDEX=`ngctl msg ${IF}: getifindex >&1` || exit 1
                       IFINDEX=`echo ${IFINDEX} >&1 | sed -n 's/.*[a-z].*: \([0-9]*\).*$/\1/p'`
                       ngctl msg netflow: setifindex { iface=${IFNUM} index=${IFINDEX} } || exit 1
                       IFNUM=`expr ${IFNUM} + 1`
       done

}

# Stop routine
netflow_stop() {

       ngctl kill netflow:export >/dev/null 2>&1
       IFNUM=0
       for EXTIF in ${IFACES}; do
           ngctl kill netflow:iface${IFNUM} >/dev/null 2>&1
           IFNUM=`expr ${IFNUM} + 1`
       done

       IFNUM=10
       for EXTIF in ${IFACES}; do
           ngctl kill netflow:iface${IFNUM} >/dev/null 2>&1
           IFNUM=`expr ${IFNUM} + 1`
       done

}

if [ -z "${source_rc_confs_defined}"]; then
       if [ -r /etc/defaults/rc.conf ]; then
               . /etc/defaults/rc.conf
               source_rc_confs
       elif [ -r /etc/rc.conf ]; then
               . /etc/rc.conf
       fi
fi

# Main entry point
case $1 in
       start)
       case  "${netflow_enable}" in
               [Yy][Ee][Ss])
                       echo -n 'Starting netflow'
                       netflow_start
               ;;
       esac
       ;;
       stop)
               netflow_stop
               ;;
       *)
               echo "usage: `basename $0` [ start | stop ]"
               exit 1
esac
Совместно с ng_netflow я использую NetAMS. Получается неплохо.
В скрипте укажите свои интерфейсы (IFACES) и адрес:порт netflow коллектора (FLOW_EXPORT_ADDR, FLOW_EXPORT_PORT).
Удачи!

--
С уважением,
Кочетков Андрей Анатольевич.
ООО "Авиаэкспресс"
672010, Россия, г. Чита, ул. Ленина, 55
тел./факс: +7 (3022) 351457
моб.: +7 914 4692252
ICQ:  168781713
e-Mail:   andrews

--
-----------------------------------------------------------
Для закрытия подписки необходимо направить письмо по адресу
mail-list с текстом "unsubscribe freebsd" в поле темы (subject) письма.

 
Не хочется прыгать на другое не справившись с этим :)
Да и ng_ipacct по-моему(на первый взгляд) проще чем ng_netflow. Но тред всё же не об этом, проблема как есть так и осталась :(
 
Я покопался ещё для выяснения граблей ::
ngctl ругается потому что он не знает что такое de0:lower(вся ругань из-за этого), то есть вывод команды ngctl list выдаёт следующее:
FreeFirst# ngctl list                                                      
There are 2 total nodes:                                                   
  Name: ngctl528        Type: socket          ID: 00000002   Num hooks: 0  
  Name: de0             Type: ether           ID: 00000001   Num hooks: 0  
То есть у интерфейса de0 почему-то совсем нет хуков, а должно быть 2 -- lower и upper.
Так вот вопрос: почему их нет и как это пофиксить?
 


Архив создан MHonArc Техническая поддержка CYGNUS HOSTING