xref: /freebsd/libexec/rc/rc.d/ipfw_netflow (revision f99f0ee14e3af81c23150a6a340259ca8a33d01a)
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