1*0696600cSBjoern A. Zeeb#!/bin/sh 2*0696600cSBjoern A. Zeeb# 3*0696600cSBjoern A. Zeeb# $FreeBSD$ 4*0696600cSBjoern A. Zeeb# 5*0696600cSBjoern A. Zeeb 6*0696600cSBjoern A. Zeeb# PROVIDE: ipfw_netflow 7*0696600cSBjoern A. Zeeb# REQUIRE: ipfw 8*0696600cSBjoern A. Zeeb# KEYWORD: nojailvnet 9*0696600cSBjoern A. Zeeb 10*0696600cSBjoern A. Zeeb. /etc/rc.subr 11*0696600cSBjoern A. Zeeb. /etc/network.subr 12*0696600cSBjoern A. Zeeb 13*0696600cSBjoern A. Zeebname="ipfw_netflow" 14*0696600cSBjoern A. Zeebdesc="firewall, ipfw, netflow" 15*0696600cSBjoern A. Zeebrcvar="${name}_enable" 16*0696600cSBjoern A. Zeebstart_cmd="${name}_start" 17*0696600cSBjoern A. Zeebstop_cmd="${name}_stop" 18*0696600cSBjoern A. Zeebstart_precmd="${name}_test" 19*0696600cSBjoern A. Zeebstatus_cmd="${name}_status" 20*0696600cSBjoern A. Zeebrequired_modules="ipfw ng_netflow ng_ipfw" 21*0696600cSBjoern A. Zeebextra_commands="status" 22*0696600cSBjoern A. Zeeb 23*0696600cSBjoern A. Zeeb: ${ipfw_netflow_hook:=9995} 24*0696600cSBjoern A. Zeeb: ${ipfw_netflow_rule:=01000} 25*0696600cSBjoern A. Zeeb: ${ipfw_netflow_ip:=127.0.0.1} 26*0696600cSBjoern A. Zeeb: ${ipfw_netflow_port:=9995} 27*0696600cSBjoern A. Zeeb: ${ipfw_netflow_version:=} 28*0696600cSBjoern A. Zeeb 29*0696600cSBjoern A. Zeebipfw_netflow_test() 30*0696600cSBjoern A. Zeeb{ 31*0696600cSBjoern A. Zeeb if [ "${ipfw_netflow_version}" != "" ] && [ "${ipfw_netflow_version}" != 9 ]; then 32*0696600cSBjoern A. Zeeb err 1 "Unknown netflow version \'${ipfw_netflow_version}\'" 33*0696600cSBjoern A. Zeeb fi 34*0696600cSBjoern A. Zeeb case "${ipfw_netflow_hook}" in 35*0696600cSBjoern A. Zeeb [!0-9]*) 36*0696600cSBjoern A. Zeeb err 1 "Bad value \"${ipfw_netflow_hook}\": Hook must be numerical" 37*0696600cSBjoern A. Zeeb esac 38*0696600cSBjoern A. Zeeb case "${ipfw_netflow_rule}" in 39*0696600cSBjoern A. Zeeb [!0-9]*) 40*0696600cSBjoern A. Zeeb err 1 "Bad value \"${ipfw_netflow_rule}\": Rule number must be numerical" 41*0696600cSBjoern A. Zeeb esac 42*0696600cSBjoern A. Zeeb} 43*0696600cSBjoern A. Zeeb 44*0696600cSBjoern A. Zeebipfw_netflow_is_running() 45*0696600cSBjoern A. Zeeb{ 46*0696600cSBjoern A. Zeeb ngctl show netflow: > /dev/null 2>&1 && return 0 || return 1 47*0696600cSBjoern A. Zeeb} 48*0696600cSBjoern A. Zeeb 49*0696600cSBjoern A. Zeebipfw_netflow_status() 50*0696600cSBjoern A. Zeeb{ 51*0696600cSBjoern A. Zeeb ipfw_netflow_is_running && echo "ipfw_netflow is active" || echo "ipfw_netflow is not active" 52*0696600cSBjoern A. Zeeb} 53*0696600cSBjoern A. Zeeb 54*0696600cSBjoern A. Zeebipfw_netflow_start() 55*0696600cSBjoern A. Zeeb{ 56*0696600cSBjoern A. Zeeb ipfw_netflow_is_running && err 1 "ipfw_netflow is already active" 57*0696600cSBjoern A. Zeeb ipfw add ${ipfw_netflow_rule} ngtee ${ipfw_netflow_hook} ip from any to any ${ipfw_netflow_fib:+fib ${ipfw_netflow_fib}} 58*0696600cSBjoern A. Zeeb ngctl -f - <<-EOF 59*0696600cSBjoern A. Zeeb mkpeer ipfw: netflow ${ipfw_netflow_hook} iface0 60*0696600cSBjoern A. Zeeb name ipfw:${ipfw_netflow_hook} netflow 61*0696600cSBjoern A. Zeeb mkpeer netflow: ksocket export${ipfw_netflow_version} inet/dgram/udp 62*0696600cSBjoern A. Zeeb msg netflow: setdlt {iface=0 dlt=12} 63*0696600cSBjoern A. Zeeb name netflow:export${ipfw_netflow_version} netflow_export 64*0696600cSBjoern A. Zeeb msg netflow:export${ipfw_netflow_version} connect inet/${ipfw_netflow_ip}:${ipfw_netflow_port} 65*0696600cSBjoern A. ZeebEOF 66*0696600cSBjoern A. Zeeb} 67*0696600cSBjoern A. Zeeb 68*0696600cSBjoern A. Zeebipfw_netflow_stop() 69*0696600cSBjoern A. Zeeb{ 70*0696600cSBjoern A. Zeeb ipfw_netflow_is_running || err 1 "ipfw_netflow is not active" 71*0696600cSBjoern A. Zeeb ngctl shutdown netflow: 72*0696600cSBjoern A. Zeeb ipfw delete ${ipfw_netflow_rule} 73*0696600cSBjoern A. Zeeb} 74*0696600cSBjoern A. Zeeb 75*0696600cSBjoern A. Zeebload_rc_config $name 76*0696600cSBjoern A. Zeeb 77*0696600cSBjoern A. Zeebrun_rc_command $* 78