use strict;
# enable only the following on debugging purpose
-use warnings;
+#use warnings;
use CGI::Carp 'fatalsToBrowser';
require '/var/ipfire/general-functions.pl';
my %netsettings=();
&General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
-open (ACTIVE, "/proc/net/ip_conntrack") or die 'Unable to open ip_conntrack';
+open (ACTIVE, 'iptstate -1rbt |') or die 'Unable to open ip_conntrack';
my @active = <ACTIVE>;
close (ACTIVE);
my @vpn = ('none');
-open (ACTIVE, "/proc/net/ipsec_eroute") and @vpn = <ACTIVE>;
-close (ACTIVE);
+#open (ACTIVE, "/proc/net/ipsec_eroute") and @vpn = <ACTIVE>;
+#close (ACTIVE);
my $aliasfile = "${General::swroot}/ethernet/aliases";
open(ALIASES, $aliasfile) or die 'Unable to open aliases file.';
my $unknownlines = ''; # should be empty all the time...
my $index = 0; # just a counter to make unique entryies in entries
-foreach my $line (@active) {
- my $protocol='';
- my $expires='';
- my $status='';
- my $orgsip='';
- my $orgdip='';
- my $orgsp='';
- my $orgdp='';
- my $exsip='';
- my $exdip='';
- my $exsp='';
- my $exdp='';
- my $marked='';
- my $use='';
-
- chomp($line);
- my @temp = split(' ',$line);
-
- if ($temp[0] eq 'icmp') {
- $protocol = $temp[0];
- $status = $Lang::tr{'all'};
- $orgsip = substr $temp[3], 4;
- $orgdip = substr $temp[4], 4;
- $marked = $temp[8] eq '[UNREPLIED]' ? '[UNREPLIED]' : ' ';
- }
- if ($temp[0] eq 'udp') {
- $protocol = $temp[0];
- $status = $Lang::tr{'all'};
- $orgsip = substr $temp[3], 4;
- $orgdip = substr $temp[4], 4;
- $marked = $temp[7] eq '[UNREPLIED]' ? '[UNREPLIED]' : defined ($temp[12]) ? $temp[11] : ' ';
- }
- if ($temp[0] eq 'tcp') {
- $protocol = $temp[0];
- $status = $temp[3];
- $orgsip = substr $temp[4], 4;
- $orgdip = substr $temp[5], 4;
- $marked = $temp[8] eq '[UNREPLIED]' ? '[UNREPLIED]' : defined ($temp[13]) ? $temp[12] : ' ';
- }
-
- # filter the line if we found a known proto
- next if( !(
- (($cgiparams{'SEE_PROTO'} eq $Lang::tr{'all'}) || ($protocol eq $cgiparams{'SEE_PROTO'} ))
- && (($cgiparams{'SEE_STATE'} eq $Lang::tr{'all'}) || ($status eq $cgiparams{'SEE_STATE'} ))
- && (($cgiparams{'SEE_MARK'} eq $Lang::tr{'all'}) || ($marked eq $cgiparams{'SEE_MARK'} ))
- && (($cgiparams{'SEE_SRC'} eq "*.*.*.*") || ($orgsip eq $cgiparams{'SEE_SRC'} ))
- && (($cgiparams{'SEE_DEST'} eq "*.*.*.*") || ($orgdip eq $cgiparams{'SEE_DEST'} ))
- ));
-
- if ($temp[0] eq 'icmp') {
- my $offset = 0;
- $protocol = $temp[0] . " (" . $temp[1] . ")";
- $expires = $temp[2];
- $status = ' ';
- if ($temp[8] eq '[UNREPLIED]' ) {
- $offset = +1;
- }
- $orgsip = substr $temp[3], 4;
- $orgdip = substr $temp[4], 4;
- $orgsp = &General::GetIcmpDescription(substr( $temp[5], 5)) . "/" . substr( $temp[6], 5);;
- $orgdp = 'id=' . substr( $temp[7], 3);
- $exsip = substr $temp[8 + $offset], 4;
- $exdip = substr $temp[9 + $offset], 4;
- $exsp = &General::GetIcmpDescription(substr( $temp[10 + $offset], 5)). "/" . substr( $temp[11 + $offset], 5);
- $exdp = 'id=' . substr( $temp[11 + $offset], 5);
- $marked = $temp[8] eq '[UNREPLIED]' ? '[UNREPLIED]' : ' ';
- $use = substr( $temp[13 + $offset], 4 );
- }
- if ($temp[0] eq 'udp') {
- my $offset = 0;
- $marked = '';
- $protocol = $temp[0] . " (" . $temp[1] . ")";
- $expires = $temp[2];
- $status = ' ';
- $orgsip = substr $temp[3], 4;
- $orgdip = substr $temp[4], 4;
- $orgsp = substr $temp[5], 6;
- $orgdp = substr $temp[6], 6;
- if ($temp[7] eq '[UNREPLIED]') {
- $offset = 1;
- $marked = $temp[7];
- $use = substr $temp[12], 4;
- } else {
- if ((substr $temp[11], 0, 3) eq 'use' ) {
- $marked = '';
- $use = substr $temp[11], 4;
- } else {
- $marked = $temp[11];
- $use = substr $temp[12], 4;
- }
- }
- $exsip = substr $temp[7 + $offset], 4;
- $exdip = substr $temp[8 + $offset], 4;
- $exsp = substr $temp[9 + $offset], 6;
- $exdp = substr $temp[10 + $offset], 6;
- }
- if ($temp[0] eq 'tcp') {
- my $offset = 0;
- $protocol = $temp[0] . " (" . $temp[1] . ")";
- $expires = $temp[2];
- $status = $temp[3];
- $orgsip = substr $temp[4], 4;
- $orgdip = substr $temp[5], 4;
- $orgsp = substr $temp[6], 6;
- $orgdp = substr $temp[7], 6;
- if ($temp[8] eq '[UNREPLIED]') {
- $marked = $temp[8];
- $offset = 1;
- } else {
- $marked = $temp[16];
- }
- $exsip = substr $temp[10 + $offset], 4;
- $exdip = substr $temp[11 + $offset], 4;
- $exsp = substr $temp[12 + $offset], 6;
- $exdp = substr $temp[13 + $offset], 6;
- $use = substr $temp[18], 4;
- }
- if ($temp[0] eq 'unknown') {
- my $offset = 0;
- $protocol = "??? (" . $temp[1] . ")";
- $protocol = "esp (" . $temp[1] . ")" if ($temp[1] == 50);
- $protocol = "ah (" . $temp[1] . ")" if ($temp[1] == 51);
- $expires = $temp[2];
- $status = ' ';
- $orgsip = substr $temp[3], 4;
- $orgdip = substr $temp[4], 4;
- $orgsp = ' ';
- $orgdp = ' ';
- $exsip = substr $temp[5], 4;
- $exdip = substr $temp[6], 4;
- $exsp = ' ';
- $exdp = ' ';
- $marked = ' ';
- $use = ' ';
- }
- if ($temp[0] eq 'gre') {
- my $offset = 0;
- $protocol = $temp[0] . " (" . $temp[1] . ")";
- $expires = $temp[2];
- $orgsip = substr $temp[5], 4;
- $orgdip = substr $temp[6], 4;
- $orgsp = ' ';
- $orgdp = ' ';
- $exsip = substr $temp[11], 4;
- $exdip = substr $temp[12], 4;
- $exsp = ' ';
- $exdp = ' ';
- $marked = $temp[17];
- $use = $temp[18];
- }
- # Only from this point, lines have the same known format/field
- # The floating fields [UNREPLIED] [ASSURED] etc are ok.
-
- # Store the line in a hash array for sorting
- if ( $protocol ) { # line is decoded ?
- my @record = ( 'index', $index++,
- 'protocol', $protocol,
- 'expires', $expires,
- 'status', $status,
- 'orgsip', $orgsip,
- 'orgdip', $orgdip,
- 'orgsp', $orgsp,
- 'orgdp', $orgdp,
- 'exsip', $exsip,
- 'exdip', $exdip,
- 'exsp', $exsp,
- 'exdp', $exdp,
- 'marked', $marked,
- 'use', $use);
- my $record = {}; # create a reference to empty hash
- %{$record} = @record; # populate that hash with @record
- $entries{$record->{index}} = $record; # add this to a hash of hashes
- } else { # it was not a known line
- $unknownlines .= "<tr bgcolor='${Header::table1colour}'>";
- $unknownlines .= "<td colspan='9'> unknown:$line></td></tr>";
- }
-}
-
-# Build listbox objects
-my $menu_proto = &make_select ('SEE_PROTO', $cgiparams{'SEE_PROTO'}, @list_proto);
-my $menu_state = &make_select ('SEE_STATE', $cgiparams{'SEE_STATE'}, @list_state);
-my $menu_src = &make_select ('SEE_SRC', $cgiparams{'SEE_SRC'}, &get_known_ips('orgsip'));
-my $menu_dest = &make_select ('SEE_DEST', $cgiparams{'SEE_DEST'}, &get_known_ips('orgdip'));
-my $menu_mark = &make_select ('SEE_MARK', $cgiparams{'SEE_MARK'}, @list_mark);
-my $menu_sort = &make_select ('SEE_SORT', $cgiparams{'SEE_SORT'}, @list_sort);
-
&Header::showhttpheaders();
&Header::openpage($Lang::tr{'connections'}, 1, '');
&Header::openbigbox('100%', 'left');
&Header::openbox('100%', 'left', $Lang::tr{'connection tracking'});
+# Build listbox objects
+my $menu_proto = &make_select ('SEE_PROTO', $cgiparams{'SEE_PROTO'}, @list_proto);
+my $menu_state = &make_select ('SEE_STATE', $cgiparams{'SEE_STATE'}, @list_state);
+
print <<END
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<table width='100%'>
<td align='center' bgcolor='${Header::colourovpn}'><b><font color='#FFFFFF'>$Lang::tr{'OpenVPN'}</font></b></td>
</tr>
</table>
-<br></br>
+<br />
<table width='100%'>
-<tr><td align='center'><font size=2>$Lang::tr{'protocol'}</font></td>
+<tr><td align='center'><font size=2>$Lang::tr{'source ip and port'}</font></td>
+ <td> </td>
+ <td align='center'><font size=2>$Lang::tr{'dest ip and port'}</font></td>
+ <td> </td>
+ <td align='center'><font size=2>$Lang::tr{'protocol'}</font></td>
+ <td align='center'><font size=2>$Lang::tr{'connection'}<br></br>$Lang::tr{'status'}</font></td>
<td align='center'><font size=2>$Lang::tr{'expires'}<br></br>($Lang::tr{'seconds'})</font></td>
- <td align='center'><font size=2>$Lang::tr{'connection'}<br></br>$Lang::tr{'status'}</font></td>
- <td align='center'><font size=2>$Lang::tr{'original'}<br></br>$Lang::tr{'source ip and port'}</font></td>
- <td align='center'><font size=2>$Lang::tr{'original'}<br></br>$Lang::tr{'dest ip and port'}</font></td>
- <td align='center'><font size=2>$Lang::tr{'expected'}<br></br>$Lang::tr{'source ip and port'}</font></td>
- <td align='center'><font size=2>$Lang::tr{'expected'}<br></br>$Lang::tr{'dest ip and port'}</font></td>
- <td align='center'><font size=2>$Lang::tr{'marked'}</font></td>
+
</tr>
-<tr>
- <td align='center'>$menu_proto</td>
- <td> </td>
+<tr><td colspan='4'> </td>
+ <td align='center'>$menu_proto</td>
<td align='center'>$menu_state</td>
- <td align='center'>$menu_src</td>
- <td align='center'>$menu_dest</td>
- <td align='center' colspan='2'></td>
- <td align='center'>$menu_mark</td>
+ <td> </td>
</tr>
<tr>
- <td align='center' colspan='8'></td>
+ <td align='center' colspan='7'></td>
</tr>
<tr>
- <td align='center' colspan='8'><input type='submit' value='Aktualisieren' /></td>
+ <td align='center' colspan='7'><input type='submit' value="$Lang::tr{'update'}" /></td>
</tr>
END
;
-foreach my $entry (sort sort_entries keys %entries) {
- my $orgsipcolour = &ipcolour( $entries{$entry}->{orgsip} );
- my $orgdipcolour = &ipcolour( $entries{$entry}->{orgdip} );
- my $exsipcolour = &ipcolour( $entries{$entry}->{exsip} );
- my $exdipcolour = &ipcolour( $entries{$entry}->{exdip} );
- print <<END
- <tr bgcolor='${Header::table1colour}'>
- <td align='center'><font size=2>$entries{$entry}->{protocol}</font></td>
- <td align='center'><font size=2>$entries{$entry}->{expires}</font></td>
- <td align='center'><font size=2>$entries{$entry}->{status}</font></td>
- <td align='center' bgcolor='$orgsipcolour'>
- <a href='/cgi-bin/ipinfo.cgi?ip=$entries{$entry}->{orgsip}'>
- <font color='#FFFFFF' size=2>$entries{$entry}->{orgsip}</font>
- </a><font color='#FFFFFF' size=2>:$entries{$entry}->{orgsp}</font></td>
- <td align='center' bgcolor='$orgdipcolour'>
- <a href='/cgi-bin/ipinfo.cgi?ip=$entries{$entry}->{orgdip}'>
- <font color='#FFFFFF' size=2>$entries{$entry}->{orgdip}</font>
- </a><font color='#FFFFFF' size=2>:$entries{$entry}->{orgdp}</font></td>
- <td align='center' bgcolor='$exsipcolour'>
- <a href='/cgi-bin/ipinfo.cgi?ip=$entries{$entry}->{exsip}'>
- <font color='#FFFFFF' size=2>$entries{$entry}->{exsip}</font>
- </a><font color='#FFFFFF' size=2>:$entries{$entry}->{exsp}</font></td>
- <td align='center' bgcolor='$exdipcolour'>
- <a href='/cgi-bin/ipinfo.cgi?ip=$entries{$entry}->{exdip}'>
- <font color='#FFFFFF' size=2>$entries{$entry}->{exdip}</font>
- </a><font color='#FFFFFF' size=2>:$entries{$entry}->{exdp}</font></td>
- <td align='center'><font size=2>$entries{$entry}->{marked}</font></td>
- </tr>
+my $i=0;
+foreach my $line (@active) {
+ $i++;
+ if ($i < 3) {
+ next;
+ }
+ chomp($line);
+ my @temp = split(' ',$line);
+
+ my ($sip, $sport) = split(':', $temp[0]);
+ my ($dip, $dport) = split(':', $temp[1]);
+ my $proto = $temp[2];
+ my $state = $temp[3];
+ my $ttl = $temp[4];
+
+ next if( !(
+ (($cgiparams{'SEE_PROTO'} eq $Lang::tr{'all'}) || ($proto eq $cgiparams{'SEE_PROTO'} ))
+ && (($cgiparams{'SEE_STATE'} eq $Lang::tr{'all'}) || ($state eq $cgiparams{'SEE_STATE'} ))
+ && (($cgiparams{'SEE_SRC'} eq "*.*.*.*") || ($sip eq $cgiparams{'SEE_SRC'} ))
+ && (($cgiparams{'SEE_DEST'} eq "*.*.*.*") || ($dip eq $cgiparams{'SEE_DEST'} ))
+ ));
+
+ if (($proto eq 'udp') && ($ttl eq '')) {
+ $ttl = $state;
+ $state = ' ';
+ }
+
+ my $sipcol = ipcolour($sip);
+ my $dipcol = ipcolour($dip);
+
+ my $sserv = '';
+ if ($sport < 1024) {
+ $sserv = uc(getservbyport($sport, lc($proto)));
+ if ($sserv ne '') {
+ $sserv = " ($sserv)";
+ }
+ }
+
+ my $dserv = '';
+ if ($dport < 1024) {
+ $dserv = uc(getservbyport($dport, lc($proto)));
+ if ($dserv ne '') {
+ $dserv = " ($dserv)";
+ }
+ }
+
+ print <<END
+ <tr >
+ <td align='center' bgcolor='$sipcol'>
+ <a href='/cgi-bin/ipinfo.cgi?ip=$sip'>
+ <font color='#FFFFFF'>$sip</font>
+ </a>
+ </td>
+ <td align='center' bgcolor='$sipcol'>
+ <a href='http://isc.sans.org/port_details.php?port=$sport' target='top'>
+ <font color='#FFFFFF'>$sport$sserv</font>
+ </a>
+ </td>
+ <td align='center' bgcolor='$dipcol'>
+ <a href='/cgi-bin/ipinfo.cgi?ip=$dip'>
+ <font color='#FFFFFF'>$dip</font>
+ </a>
+ </td>
+ <td align='center' bgcolor='$dipcol'>
+ <a href='http://isc.sans.org/port_details.php?port=$dport' target='top'>
+ <font color='#FFFFFF'>$dport$dserv</font>
+ </a>
+ </td>
+ <td align='center'>$proto</td>
+ <td align='center' bgcolor="${Header::table1colour}">$state</td>
+ <td align='center'>$ttl</td>
+ </tr>
END
;
}
-print "$unknownlines</table></form>";
+print "</table></form>";
&Header::closebox();
&Header::closebigbox();
my ($ip) = $_[0];
my $found = 0;
foreach $line (@network) {
- if ($network[$id] eq '') {
- $id++;
- } else {
- if (!$found && ipv4_in_network( $network[$id] , $masklen[$id], $ip) ) {
- $found = 1;
- $colour = $colour[$id];
- }
- $id++;
- }
+ if ($network[$id] eq '') {
+ $id++;
+ } else {
+ if (!$found && ipv4_in_network( $network[$id] , $masklen[$id], $ip) ) {
+ $found = 1;
+ $colour = $colour[$id];
+ }
+ $id++;
+ }
}
return $colour
}