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