Project

General

Profile

Download (6.27 KB) Statistics
| Branch: | Tag: | Revision:
1 9d71da81 jim-p
<?php
2 2a2af670 jim-p
/*
3
	diag_states_summary.php
4 ce77a9c4 Phil Davis
	Copyright (C) 2013-2015 Electric Sheep Fencing, LP
5 c245a846 jim-p
	Copyright (C) 2010-2014 Jim Pingle
6 2a2af670 jim-p
7
	Portions borrowed from diag_dump_states.php:
8
	Copyright (C) 2005-2009 Scott Ullrich
9
	Copyright (C) 2005 Colin Smith
10
	All rights reserved.
11
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33
34
/*
35
	pfSense_BUILDER_BINARIES:	/sbin/pfctl
36
	pfSense_MODULE:	filter
37
*/
38
39
##|+PRIV
40
##|*IDENT=page-diagnostics-statessummary
41
##|*NAME=Diagnostics: States Summary page
42
##|*DESCR=Allow access to the 'Diagnostics: States Summary' page.
43
##|*MATCH=diag_states_summary.php*
44
##|-PRIV
45 9d71da81 jim-p
46
exec("/sbin/pfctl -s state", $states);
47
48
$srcipinfo = array();
49 c1613ade jim-p
$dstipinfo = array();
50 63284430 jim-p
$allipinfo = array();
51 c1613ade jim-p
$pairipinfo = array();
52 9d71da81 jim-p
53 63284430 jim-p
function addipinfo(&$iparr, $ip, $proto, $srcport, $dstport) {
54
	$iparr[$ip]['seen']++;
55
	$iparr[$ip]['protos'][$proto]['seen']++;
56
	if (!empty($srcport)) {
57
		$iparr[$ip]['protos'][$proto]['srcports'][$srcport]++;
58
	}
59
	if (!empty($dstport)) {
60
		$iparr[$ip]['protos'][$proto]['dstports'][$dstport]++;
61
	}
62
}
63
64 9d71da81 jim-p
$row = 0;
65
if(count($states) > 0) {
66
	foreach($states as $line) {
67
		$line_split = preg_split("/\s+/", $line);
68 c245a846 jim-p
		$iface = array_shift($line_split);
69 9d71da81 jim-p
		$proto = array_shift($line_split);
70
		$state = array_pop($line_split);
71
		$info  = implode(" ", $line_split);
72
73 c245a846 jim-p
		/* Handle NAT cases
74
			Replaces an external IP + NAT by the internal IP */
75
		if (strpos($info, ') ->') !== FALSE) {
76
			/* Outbound NAT */
77
			$info = preg_replace('/(\S+) \((\S+)\)/U', "$2", $info);
78
		} elseif (strpos($info, ') <-') !== FALSE) {
79
			/* Inbound NAT/Port Forward */
80
			$info = preg_replace('/(\S+) \((\S+)\)/U', "$1", $info);
81
		}
82
83 9d71da81 jim-p
		/* break up info and extract $srcip and $dstip */
84
		$ends = preg_split("/\<?-\>?/", $info);
85 c1613ade jim-p
86
		if (strpos($info, '->') === FALSE) {
87
			$srcinfo = $ends[count($ends) - 1];
88
			$dstinfo = $ends[0];
89
		} else {
90
			$srcinfo = $ends[0];
91
			$dstinfo = $ends[count($ends) - 1];
92
		}
93
94 96bddaf3 Seth Mos
		/* Handle IPv6 */
95
		$parts = explode(":", $srcinfo);
96 c245a846 jim-p
		$partcount = count($parts);
97 5a27a095 bcyrill
		if ($partcount <= 2) {
98
			$srcip = trim($parts[0]);
99
			$srcport = trim($parts[1]);
100 96bddaf3 Seth Mos
		} else {
101 5a27a095 bcyrill
			preg_match("/([0-9a-f:]+)(\[([0-9]+)\])?/i", $srcinfo, $matches);
102
			$srcip = $matches[1];
103
			$srcport = trim($matches[3]);
104 96bddaf3 Seth Mos
		}
105 c245a846 jim-p
106 96bddaf3 Seth Mos
		$parts = explode(":", $dstinfo);
107 c245a846 jim-p
		$partcount = count($parts);
108 5a27a095 bcyrill
		if ($partcount <= 2) {
109
			$dstip = trim($parts[0]);
110
			$dstport = trim($parts[1]);
111 96bddaf3 Seth Mos
		} else {
112 5a27a095 bcyrill
			preg_match("/([0-9a-f:]+)(\[([0-9]+)\])?/i", $dstinfo, $matches);
113
			$dstip = $matches[1];
114
			$dstport = trim($matches[3]);
115 96bddaf3 Seth Mos
		}
116 9d71da81 jim-p
117 63284430 jim-p
		addipinfo($srcipinfo, $srcip, $proto, $srcport, $dstport);
118
		addipinfo($dstipinfo, $dstip, $proto, $srcport, $dstport);
119
		addipinfo($pairipinfo, "{$srcip} -> {$dstip}", $proto, $srcport, $dstport);
120 c1613ade jim-p
121 63284430 jim-p
		addipinfo($allipinfo, $srcip, $proto, $srcport, $dstport);
122
		addipinfo($allipinfo, $dstip, $proto, $srcport, $dstport);
123 c1613ade jim-p
124 9d71da81 jim-p
	}
125
}
126
127
function sort_by_ip($a, $b) {
128 96033063 Erik Fonnesbeck
	return ip2ulong($a) < ip2ulong($b) ? -1 : 1;
129 9d71da81 jim-p
}
130
131 2a63c863 jim-p
function build_port_info($portarr, $proto) {
132 1bceebd0 jim-p
	if (!$portarr)
133 3f00208a Ermal
		return '';
134 2a63c863 jim-p
	$ports = array();
135
	asort($portarr);
136
	foreach (array_reverse($portarr, TRUE) as $port => $count) {
137
		$str = "";
138
		$service = getservbyport($port, strtolower($proto));
139
		$port = "{$proto}/{$port}";
140
		if ($service)
141
			$port = "{$port} ({$service})";
142
		$ports[] = "{$port}: {$count}";
143
	}
144
	return implode($ports, ', ');
145
}
146
147 63284430 jim-p
function print_summary_table($label, $iparr, $sort = TRUE) { ?>
148
149
<h3><?php echo $label; ?></h3>
150 f11afbf7 Colin Fleming
<table class="tabcont" width="100%" border="0" cellspacing="0" cellpadding="0" summary="states summary">
151 9d71da81 jim-p
	<tr>
152 e99a1c28 Rafaellucas
		<td class="listhdrr"><?=gettext("IP");?></td>
153 9049e088 Vinicius Coque
		<td class="listhdrr"># <?=gettext("States");?></td>
154 e99a1c28 Rafaellucas
		<td class="listhdrr"><?=gettext("Proto");?></td>
155 9049e088 Vinicius Coque
		<td class="listhdrr"># <?=gettext("States");?></td>
156 e99a1c28 Rafaellucas
		<td class="listhdrr"><?=gettext("Src Ports");?></td>
157
		<td class="listhdrr"><?=gettext("Dst Ports");?></td>
158 9d71da81 jim-p
	</tr>
159 63284430 jim-p
<?php   if ($sort)
160
		uksort($iparr, "sort_by_ip");
161
	foreach($iparr as $ip => $ipinfo) { ?>
162 9d71da81 jim-p
	<tr>
163 f11afbf7 Colin Fleming
		<td class="vncell"><?php echo $ip; ?></td>
164
		<td class="vncell"><?php echo $ipinfo['seen']; ?></td>
165
		<td class="vncell">&nbsp;</td>
166
		<td class="vncell">&nbsp;</td>
167
		<td class="vncell">&nbsp;</td>
168
		<td class="vncell">&nbsp;</td>
169 9d71da81 jim-p
	</tr>
170
	<?php foreach($ipinfo['protos'] as $proto => $protoinfo) { ?>
171
	<tr>
172 f11afbf7 Colin Fleming
		<td class="list">&nbsp;</td>
173
		<td class="list">&nbsp;</td>
174
		<td class="listlr"><?php echo $proto; ?></td>
175
		<td class="listr" align="center"><?php echo $protoinfo['seen']; ?></td>
176
		<td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['srcports'], $proto); ?>"><?php echo count($protoinfo['srcports']); ?></span></td>
177
		<td class="listr" align="center"><span title="<?php echo build_port_info($protoinfo['dstports'], $proto); ?>"><?php echo count($protoinfo['dstports']); ?></span></td>
178 9d71da81 jim-p
	</tr>
179
	<?php } ?>
180
<?php } ?>
181
182
</table>
183
184 3e6ec5df Renato Botelho
<?php
185 63284430 jim-p
}
186 c1613ade jim-p
187 e99a1c28 Rafaellucas
$pgtitle = array(gettext("Diagnostics"),gettext("State Table Summary"));
188 63284430 jim-p
require_once("guiconfig.inc");
189
include("head.inc");
190 f11afbf7 Colin Fleming
echo "<body>";
191 63284430 jim-p
include("fbegin.inc");
192 c1613ade jim-p
193
194 e99a1c28 Rafaellucas
print_summary_table(gettext("By Source IP"), $srcipinfo);
195
print_summary_table(gettext("By Destination IP"), $dstipinfo);
196
print_summary_table(gettext("Total per IP"), $allipinfo);
197
print_summary_table(gettext("By IP Pair"), $pairipinfo, FALSE);
198 63284430 jim-p
?>
199 c1613ade jim-p
200 9d71da81 jim-p
<?php include("fend.inc"); ?>
201 f11afbf7 Colin Fleming
</body>
202
</html>