10696600cSBjoern A. Zeeb#!/bin/sh 20696600cSBjoern A. Zeeb# 30696600cSBjoern A. Zeeb# 40696600cSBjoern A. Zeeb 50696600cSBjoern A. Zeeb# PROVIDE: ipfw_netflow 60696600cSBjoern A. Zeeb# REQUIRE: ipfw 70696600cSBjoern A. Zeeb# KEYWORD: nojailvnet 80696600cSBjoern A. Zeeb 90696600cSBjoern A. Zeeb. /etc/rc.subr 100696600cSBjoern A. Zeeb. /etc/network.subr 110696600cSBjoern A. Zeeb 120696600cSBjoern A. Zeebname="ipfw_netflow" 130696600cSBjoern A. Zeebdesc="firewall, ipfw, netflow" 140696600cSBjoern A. Zeebrcvar="${name}_enable" 150696600cSBjoern A. Zeebstart_cmd="${name}_start" 160696600cSBjoern A. Zeebstop_cmd="${name}_stop" 170696600cSBjoern A. Zeebstart_precmd="${name}_test" 180696600cSBjoern A. Zeebstatus_cmd="${name}_status" 190696600cSBjoern A. Zeebrequired_modules="ipfw ng_netflow ng_ipfw" 200696600cSBjoern A. Zeebextra_commands="status" 210696600cSBjoern A. Zeeb 220696600cSBjoern A. Zeeb: ${ipfw_netflow_hook:=9995} 230696600cSBjoern A. Zeeb: ${ipfw_netflow_rule:=01000} 240696600cSBjoern A. Zeeb: ${ipfw_netflow_ip:=127.0.0.1} 250696600cSBjoern A. Zeeb: ${ipfw_netflow_port:=9995} 260696600cSBjoern A. Zeeb: ${ipfw_netflow_version:=} 270696600cSBjoern A. Zeeb 280696600cSBjoern A. Zeebipfw_netflow_test() 290696600cSBjoern A. Zeeb{ 300696600cSBjoern A. Zeeb if [ "${ipfw_netflow_version}" != "" ] && [ "${ipfw_netflow_version}" != 9 ]; then 310696600cSBjoern A. Zeeb err 1 "Unknown netflow version \'${ipfw_netflow_version}\'" 320696600cSBjoern A. Zeeb fi 330696600cSBjoern A. Zeeb case "${ipfw_netflow_hook}" in 340696600cSBjoern A. Zeeb [!0-9]*) 350696600cSBjoern A. Zeeb err 1 "Bad value \"${ipfw_netflow_hook}\": Hook must be numerical" 360696600cSBjoern A. Zeeb esac 370696600cSBjoern A. Zeeb case "${ipfw_netflow_rule}" in 380696600cSBjoern A. Zeeb [!0-9]*) 390696600cSBjoern A. Zeeb err 1 "Bad value \"${ipfw_netflow_rule}\": Rule number must be numerical" 400696600cSBjoern A. Zeeb esac 410696600cSBjoern A. Zeeb} 420696600cSBjoern A. Zeeb 430696600cSBjoern A. Zeebipfw_netflow_is_running() 440696600cSBjoern A. Zeeb{ 450696600cSBjoern A. Zeeb ngctl show netflow: > /dev/null 2>&1 && return 0 || return 1 460696600cSBjoern A. Zeeb} 470696600cSBjoern A. Zeeb 480696600cSBjoern A. Zeebipfw_netflow_status() 490696600cSBjoern A. Zeeb{ 500696600cSBjoern A. Zeeb ipfw_netflow_is_running && echo "ipfw_netflow is active" || echo "ipfw_netflow is not active" 510696600cSBjoern A. Zeeb} 520696600cSBjoern A. Zeeb 530696600cSBjoern A. Zeebipfw_netflow_start() 540696600cSBjoern A. Zeeb{ 550696600cSBjoern A. Zeeb ipfw_netflow_is_running && err 1 "ipfw_netflow is already active" 560696600cSBjoern A. Zeeb ipfw add ${ipfw_netflow_rule} ngtee ${ipfw_netflow_hook} ip from any to any ${ipfw_netflow_fib:+fib ${ipfw_netflow_fib}} 570696600cSBjoern A. Zeeb ngctl -f - <<-EOF 580696600cSBjoern A. Zeeb mkpeer ipfw: netflow ${ipfw_netflow_hook} iface0 590696600cSBjoern A. Zeeb name ipfw:${ipfw_netflow_hook} netflow 600696600cSBjoern A. Zeeb mkpeer netflow: ksocket export${ipfw_netflow_version} inet/dgram/udp 610696600cSBjoern A. Zeeb msg netflow: setdlt {iface=0 dlt=12} 620696600cSBjoern A. Zeeb name netflow:export${ipfw_netflow_version} netflow_export 630696600cSBjoern A. Zeeb msg netflow:export${ipfw_netflow_version} connect inet/${ipfw_netflow_ip}:${ipfw_netflow_port} 640696600cSBjoern A. ZeebEOF 650696600cSBjoern A. Zeeb} 660696600cSBjoern A. Zeeb 670696600cSBjoern A. Zeebipfw_netflow_stop() 680696600cSBjoern A. Zeeb{ 690696600cSBjoern A. Zeeb ipfw_netflow_is_running || err 1 "ipfw_netflow is not active" 700696600cSBjoern A. Zeeb ngctl shutdown netflow: 710696600cSBjoern A. Zeeb ipfw delete ${ipfw_netflow_rule} 720696600cSBjoern A. Zeeb} 730696600cSBjoern A. Zeeb 740696600cSBjoern A. Zeebload_rc_config $name 750696600cSBjoern A. Zeeb 76*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting 77*f99f0ee1SAlexander Leidingeripfw_netflow_svcj="NO" 78*f99f0ee1SAlexander Leidinger 790696600cSBjoern A. Zeebrun_rc_command $* 80