]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - html/cgi-bin/forwardfw.cgi
Forward Firewall: edited colspan for timeframe from 6 to 7
[people/pmueller/ipfire-2.x.git] / html / cgi-bin / forwardfw.cgi
index 8e1100b45e8caa8f5e6d2fa2f4e6aaf8865e544e..bf35b1f97d734d23ebead9f11b32d9f254cac021 100755 (executable)
@@ -140,8 +140,10 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
                                if ("$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'}" 
                                        eq "$configinputfw{$key}[0],$configinputfw{$key}[2],$configinputfw{$key}[3],$configinputfw{$key}[4],$configinputfw{$key}[5],$configinputfw{$key}[6],$configinputfw{$key}[7],$configinputfw{$key}[8],$configinputfw{$key}[9],$configinputfw{$key}[10],$configinputfw{$key}[11],$configinputfw{$key}[12],$configinputfw{$key}[13],$configinputfw{$key}[14],$configinputfw{$key}[15],$configinputfw{$key}[17],$configinputfw{$key}[18],$configinputfw{$key}[19],$configinputfw{$key}[20],$configinputfw{$key}[21],$configinputfw{$key}[22],$configinputfw{$key}[23],$configinputfw{$key}[24],$configinputfw{$key}[25],$configinputfw{$key}[26],$configinputfw{$key}[27]"){
                                                $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
-                                               if ($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on'){
+                                               if ($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && &validremark($fwdfwsettings{'ruleremark'})){
                                                        $errormessage='';
+                                               }elsif($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && !&validremark($fwdfwsettings{'ruleremark'})){
+                                                       $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
                                                }
                                                if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
                                                        $fwdfwsettings{'nosave'} = 'on';
@@ -192,6 +194,7 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
                #print"ALT: $fwdfwsettings{'oldgrp3a'} $fwdfwsettings{'oldgrp3b'}       NEU:    $fwdfwsettings{'grp3'} $fwdfwsettings{$fwdfwsettings{'grp3'}}<br>";
                #print"DIENSTE Checkalt:$fwdfwsettings{'oldusesrv'}  DIENSTE Checkneu:$fwdfwsettings{'USESRV'}    DIENST ALT:$fwdfwsettings{'oldgrp3a'},$fwdfwsettings{'oldgrp3b'}   DIENST NEU:$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}}<br>";
        }else{
+               #FORWARD PART
                $fwdfwsettings{'chain'} = 'FORWARDFW';
                if($fwdfwsettings{'oldrulenumber'} eq $fwdfwsettings{'rulepos'}){
                        #check if we have an identical rule already
@@ -199,8 +202,10 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
                                if ("$fwdfwsettings{'RULE_ACTION'},$fwdfwsettings{'ACTIVE'},$fwdfwsettings{'grp1'},$fwdfwsettings{$fwdfwsettings{'grp1'}},$fwdfwsettings{'grp2'},$fwdfwsettings{$fwdfwsettings{'grp2'}},$fwdfwsettings{'USE_SRC_PORT'},$fwdfwsettings{'PROT'},$fwdfwsettings{'ICMP_TYPES'},$fwdfwsettings{'SRC_PORT'},$fwdfwsettings{'USESRV'},$fwdfwsettings{'TGT_PROT'},$fwdfwsettings{'ICMP_TGT'},$fwdfwsettings{'grp3'},$fwdfwsettings{$fwdfwsettings{'grp3'}},$fwdfwsettings{'LOG'},$fwdfwsettings{'TIME'},$fwdfwsettings{'TIME_MON'},$fwdfwsettings{'TIME_TUE'},$fwdfwsettings{'TIME_WED'},$fwdfwsettings{'TIME_THU'},$fwdfwsettings{'TIME_FRI'},$fwdfwsettings{'TIME_SAT'},$fwdfwsettings{'TIME_SUN'},$fwdfwsettings{'TIME_FROM'},$fwdfwsettings{'TIME_TO'}" 
                                        eq "$configfwdfw{$key}[0],$configfwdfw{$key}[2],$configfwdfw{$key}[3],$configfwdfw{$key}[4],$configfwdfw{$key}[5],$configfwdfw{$key}[6],$configfwdfw{$key}[7],$configfwdfw{$key}[8],$configfwdfw{$key}[9],$configfwdfw{$key}[10],$configfwdfw{$key}[11],$configfwdfw{$key}[12],$configfwdfw{$key}[13],$configfwdfw{$key}[14],$configfwdfw{$key}[15],$configfwdfw{$key}[17],$configfwdfw{$key}[18],$configfwdfw{$key}[19],$configfwdfw{$key}[20],$configfwdfw{$key}[21],$configfwdfw{$key}[22],$configfwdfw{$key}[23],$configfwdfw{$key}[24],$configfwdfw{$key}[25],$configfwdfw{$key}[26],$configfwdfw{$key}[27]"){
                                                $errormessage.=$Lang::tr{'fwdfw err ruleexists'};
-                                               if ($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on'){
+                                               if ($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && &validremark($fwdfwsettings{'ruleremark'})){
                                                        $errormessage='';
+                                               }elsif($fwdfwsettings{'oldruleremark'} ne $fwdfwsettings{'ruleremark'} && $fwdfwsettings{'updatefwrule'} eq 'on' && !&validremark($fwdfwsettings{'ruleremark'})){
+                                                       $errormessage=$Lang::tr{'fwdfw err remark'}."<br>";
                                                }
                                                if ($fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'}){
                                                        $fwdfwsettings{'nosave'} = 'on';
@@ -209,7 +214,7 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
                        }
                }       
                #check if we just close a rule
-               if( $fwdfwsettings{'oldgrp1a'} eq  $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq  $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} &&  $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq  $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} ) {
+               if( $fwdfwsettings{'oldgrp1a'} eq  $fwdfwsettings{'grp1'} && $fwdfwsettings{'oldgrp1b'} eq $fwdfwsettings{$fwdfwsettings{'grp1'}} && $fwdfwsettings{'oldgrp2a'} eq  $fwdfwsettings{'grp2'} && $fwdfwsettings{'oldgrp2b'} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} &&  $fwdfwsettings{'oldgrp3a'} eq $fwdfwsettings{'grp3'} && $fwdfwsettings{'oldgrp3b'} eq  $fwdfwsettings{$fwdfwsettings{'grp3'}} && $fwdfwsettings{'oldusesrv'} eq $fwdfwsettings{'USESRV'} && $fwdfwsettings{'oldruleremark'} eq $fwdfwsettings{'ruleremark'} ) {
                        if($fwdfwsettings{'nosave'} eq 'on' && $fwdfwsettings{'updatefwrule'} eq 'on'){
                                $fwdfwsettings{'nosave2'} = 'on';
                                $errormessage='';
@@ -662,23 +667,42 @@ sub checksource
                        $fwdfwsettings{'PROT'}='';
                }
 
-       if($fwdfwsettings{'USE_SRC_PORT'} eq 'ON' && $fwdfwsettings{'PROT'} ne 'ICMP' && $fwdfwsettings{'SRC_PORT'} ne ''){
-               #change dashes with :
-               $fwdfwsettings{'SRC_PORT'}=~ tr/-/:/;
-                       
-               if ($fwdfwsettings{'SRC_PORT'} eq "*") {
-                       $fwdfwsettings{'SRC_PORT'} = "1:65535";
-               }
-               if ($fwdfwsettings{'SRC_PORT'} =~ /^(\D)\:(\d+)$/) {
-                       $fwdfwsettings{'SRC_PORT'} = "1:$2";
-               }
-               if ($fwdfwsettings{'SRC_PORT'} =~ /^(\d+)\:(\D)$/) {
-                       $fwdfwsettings{'SRC_PORT'} = "$1:65535";
+       if($fwdfwsettings{'USE_SRC_PORT'} eq 'ON' && ($fwdfwsettings{'PROT'} eq 'TCP' || $fwdfwsettings{'PROT'} eq 'UDP') && $fwdfwsettings{'SRC_PORT'} ne ''){
+               my @parts=split(",",$fwdfwsettings{'SRC_PORT'});
+               my @values=();
+               foreach (@parts){
+                       chomp($_);
+                       if ($_ =~ /^(\d+)\:(\d+)$/) {
+                               my $check;
+                               #change dashes with :
+                               $_=~ tr/-/:/;
+                               if ($_ eq "*") {
+                                       push(@values,"1:65535");
+                                       $check='on';
+                               }
+                               if ($_ =~ /^(\D)\:(\d+)$/) {
+                                       push(@values,"1:$2");
+                                       $check='on';
+                               }
+                               if ($_ =~ /^(\d+)\:(\D)$/) {
+                                       push(@values,"$1:65535");
+                                       $check='on'
+                               }
+                               $errormessage .= &General::validportrange($_, 'destination');
+                               if(!$check){
+                                       push (@values,$_);
+                               }
+                       }else{
+                               if (&General::validport($_)){
+                                       push (@values,$_);
+                               }else{
+                                       
+                               }
+                       }
                }
-
-               $errormessage.=&General::validportrange($fwdfwsettings{'SRC_PORT'},'src');
+               $fwdfwsettings{'SRC_PORT'}=join("|",@values);
+               return $errormessage;
        }
-       return $errormessage;
 }
 sub checktarget
 {
@@ -736,18 +760,39 @@ sub checktarget
                if ($fwdfwsettings{'grp3'} eq 'TGT_PORT'){
                        if ($fwdfwsettings{'TGT_PROT'} eq 'TCP' || $fwdfwsettings{'TGT_PROT'} eq 'UDP'){
                                if ($fwdfwsettings{'TGT_PORT'} ne ''){
-                                       #change dashes with :
-                                       $fwdfwsettings{'TGT_PORT'}=~ tr/-/:/;
-                                       if ($fwdfwsettings{'TGT_PORT'} eq "*") {
-                                               $fwdfwsettings{'TGT_PORT'} = "1:65535";
-                                       }
-                                       if ($fwdfwsettings{'TGT_PORT'} =~ /^(\D)\:(\d+)$/) {
-                                               $fwdfwsettings{'TGT_PORT'} = "1:$2";
-                                       }
-                                       if ($fwdfwsettings{'TGT_PORT'} =~ /^(\d+)\:(\D)$/) {
-                                               $fwdfwsettings{'TGT_PORT'} = "$1:65535";
+                                       my @parts=split(",",$fwdfwsettings{'TGT_PORT'});
+                                       my @values=();
+                                       foreach (@parts){
+                                               chomp($_);
+                                               if ($_ =~ /^(\d+)\:(\d+)$/) {
+                                                       my $check;
+                                                       #change dashes with :
+                                                       $_=~ tr/-/:/;
+                                                       if ($_ eq "*") {
+                                                               push(@values,"1:65535");
+                                                               $check='on';
+                                                       }
+                                                       if ($_ =~ /^(\D)\:(\d+)$/) {
+                                                               push(@values,"1:$2");
+                                                               $check='on';
+                                                       }
+                                                       if ($_ =~ /^(\d+)\:(\D)$/) {
+                                                               push(@values,"$1:65535");
+                                                               $check='on'
+                                                       }
+                                                       $errormessage .= &General::validportrange($_, 'destination');
+                                                       if(!$check){
+                                                               push (@values,$_);
+                                                       }
+                                               }else{
+                                                       if (&General::validport($_)){
+                                                               push (@values,$_);
+                                                       }else{
+                                                               
+                                                       }
+                                               }
                                        }
-                                       $errormessage .= &General::validportrange($fwdfwsettings{'TGT_PORT'}, 'destination');
+                                       $fwdfwsettings{'TGT_PORT'}=join("|",@values);
                                }
                        }elsif ($fwdfwsettings{'TGT_PROT'} eq 'GRE'){
                                        $fwdfwsettings{$fwdfwsettings{'grp3'}} = '';
@@ -781,7 +826,6 @@ sub checktarget
                $fwdfwsettings{$fwdfwsettings{'grp3'}}='';
                $fwdfwsettings{'TGT_PROT'}='';
                $fwdfwsettings{'ICMP_TGT'}='';
-
        }
        #check timeframe
        if($fwdfwsettings{'TIME'} eq 'ON'){
@@ -798,7 +842,7 @@ sub checkrule
                $errormessage.=$Lang::tr{'fwdfw err remark'}."<br>";
        }
        #check if source and target identical
-       if ($fwdfwsettings{$fwdfwsettings{'grp1'}} eq $fwdfwsettings{$fwdfwsettings{'grp2'}}){
+       if ($fwdfwsettings{$fwdfwsettings{'grp1'}} eq $fwdfwsettings{$fwdfwsettings{'grp2'}} && $fwdfwsettings{$fwdfwsettings{'grp1'}} ne 'ALL'){
                $errormessage.=$Lang::tr{'fwdfw err same'};
                return $errormessage;
        }
@@ -832,6 +876,8 @@ sub checkrule
 
        #check source and destination protocol if manual
        if( $fwdfwsettings{'USE_SRC_PORT'} eq 'ON' && $fwdfwsettings{'USESRV'} eq 'ON'){
+               
+               
                if($fwdfwsettings{'PROT'} ne $fwdfwsettings{'TGT_PROT'} && $fwdfwsettings{'grp3'} eq 'TGT_PORT'){
                        $errormessage.=$Lang::tr{'fwdfw err prot'};
                }
@@ -1013,15 +1059,21 @@ print <<END;
 END
        foreach ("ACCEPT","DROP","REJECT")
        {
-               if($fwdfwsettings{'POLICY'} eq 'MODE2'){
-                       $fwdfwsettings{'RULE_ACTION'} = 'DROP';
-               }
-
-               if ($_ eq $fwdfwsettings{'RULE_ACTION'})
-               {
-                       print"<option selected>$_</option>";
+               if($fwdfwsettings{'updatefwrule'} eq 'on'){
+                       print"<option ";
+                       print "selected='selected'" if ($fwdfwsettings{'RULE_ACTION'} eq $_);
+                       print">$_</option>";
                }else{
-                       print"<option>$_</option>";
+                       if($fwdfwsettings{'POLICY'} eq 'MODE2'){
+                               $fwdfwsettings{'RULE_ACTION'} = 'DROP';
+                       }
+       
+                       if ($_ eq $fwdfwsettings{'RULE_ACTION'})
+                       {
+                               print"<option selected>$_</option>";
+                       }else{
+                               print"<option>$_</option>";
+                       }
                }
        }
        print"</select></td></tr></table><hr>"; 
@@ -1133,8 +1185,9 @@ END
                                print"<option>$_</option>";
                        }
                }
+               $fwdfwsettings{'SRC_PORT'}=~ s/\|/,/g;
                print<<END;
-               </select></td><td align='right'><input type='text' name='SRC_PORT' value='$fwdfwsettings{'SRC_PORT'}' maxlength='11' size='9' ></td></tr>
+               </select></td><td align='right'><input type='text' name='SRC_PORT' value='$fwdfwsettings{'SRC_PORT'}' maxlength='20' size='18' ></td></tr>
                <tr><td></td><td></td><td></td><td></td><td nowrap='nowrap'>$Lang::tr{'fwhost icmptype'}</td><td colspan='2'><select name='ICMP_TYPES'>
 END
                &General::readhasharray("${General::swroot}/fwhosts/icmp-types", \%icmptypes);
@@ -1287,8 +1340,9 @@ END
                                print"<option>$_</option>";
                        }
                }
+               $fwdfwsettings{'TGT_PORT'} =~ s/\|/,/g;
                print<<END;
-               </select></td><td align='right'><input type='text' name='TGT_PORT' value='$fwdfwsettings{'TGT_PORT'}' maxlength='11' size='9' ></td></tr>
+               </select></td><td align='right'><input type='text' name='TGT_PORT' value='$fwdfwsettings{'TGT_PORT'}' maxlength='20' size='18' ></td></tr>
                <tr><td colspan='2'></td><td></td><td>$Lang::tr{'fwhost icmptype'}</td><td colspan='2'><select name='ICMP_TGT'>
 END
                &General::readhasharray("${General::swroot}/fwhosts/icmp-types", \%icmptypes);
@@ -1349,7 +1403,7 @@ END
                                <input type='checkbox' name='TIME_THU' value='on' $checked{'TIME_THU'}{'on'} />
                                <input type='checkbox' name='TIME_FRI' value='on' $checked{'TIME_FRI'}{'on'} />
                                <input type='checkbox' name='TIME_SAT' value='on' $checked{'TIME_SAT'}{'on'} />
-                               <input type='checkbox' name='TIME_SUN' value='on' $checked{'TIME_SUN'}{$Lang::tr{'fwdfw wd_sun'}} />
+                               <input type='checkbox' name='TIME_SUN' value='on' $checked{'TIME_SUN'}{'on'} />
                        </td>
                        <td><select name='TIME_FROM'>
 END
@@ -1400,6 +1454,7 @@ END
                        <input type='hidden' name='oldusesrv' value='$fwdfwsettings{'oldusesrv'}' />
                        <input type='hidden' name='oldrulenumber' value='$fwdfwsettings{'oldrulenumber'}' />
                        <input type='hidden' name='rulenumber' value='$fwdfwsettings{'rulepos'}' />
+                       <input type='hidden' name='oldruleremark' value='$fwdfwsettings{'oldruleremark'}' />
                        <input type='hidden' name='ACTION' value='saverule' ></form><form method='post' style='display:inline'><input type='submit' value='$Lang::tr{'fwhost back'}' style='min-width:100px;'><input type='hidden' name='ACTION' value'reset'></td></td>
                        </table></form>
 END
@@ -1589,10 +1644,11 @@ sub getsrcport
 {
        my %hash=%{(shift)};
        my $key=shift;
-       if($hash{$key}[7] eq 'ON' && $hash{$key}[8] ne 'ICMP'){
-               print" : ($hash{$key}[8]) $hash{$key}[10]";
+       if($hash{$key}[7] eq 'ON' && $hash{$key}[8] ne '' && $hash{$key}[10]){
+               $hash{$key}[10]=~ s/\|/,/g;
+               print": $hash{$key}[10]";
        }elsif($hash{$key}[7] eq 'ON' && $hash{$key}[8] eq 'ICMP'){
-               print" : ($hash{$key}[8]) <br> $hash{$key}[9]";
+               print": <br>$hash{$key}[9] ";
        }
 }
 sub gettgtport
@@ -1601,35 +1657,53 @@ sub gettgtport
        my $key=shift;
        my $service;
        my $prot;
-
        if($hash{$key}[11] eq 'ON' && $hash{$key}[12] ne 'ICMP'){
                if($hash{$key}[14] eq 'cust_srv'){
                        &General::readhasharray("$configsrv", \%customservice);
                        foreach my $i (sort keys %customservice){
-                               #print "HHUHU: $customservice{$i}[0] und $hash{$key}[15]<br>";
                                if($customservice{$i}[0] eq $hash{$key}[15]){
-                                       $prot = $hash{$key}[12];
                                        $service = $customservice{$i}[0];
                                }
                        }
                }elsif($hash{$key}[14] eq 'cust_srvgrp'){
-
                        $service=$hash{$key}[15];
                }elsif($hash{$key}[14] eq 'TGT_PORT'){
+                       $hash{$key}[15]=~ s/\|/,/g;
                        $service=$hash{$key}[15];
-                       $prot=$hash{$key}[12];
+               }
+               if($service){
+                       print": $service";
                }
        }elsif($hash{$key}[11] eq 'ON' && $hash{$key}[12] eq 'ICMP'){
-               print" : ($hash{$key}[12]) <br>$hash{$key}[13]";
+               print":<br>$hash{$key}[13]";
        }
-
-       if ($prot ne '' || $service ne ''){
-               print" :";
-               if ($prot ne ''){
-                       print"($prot) ";
+}
+sub get_serviceports
+{
+       my $type=shift;
+       my $name=shift;
+       &General::readhasharray("$configsrv", \%customservice);
+       &General::readhasharray("$configsrvgrp", \%customservicegrp);
+       my $protocols;
+       my $tcp;
+       my $udp;
+       if($type eq 'service'){
+               foreach my $key (sort { uc($customservice{$a}[0]) cmp uc($customservice{$b}[0]) } keys %customservice){
+                       if ($customservice{$key}[0] eq $name){
+                               $protocols=$customservice{$key}[2];
+                       }
+               }
+               
+       }elsif($type eq 'group'){
+               foreach my $key (sort { uc($customservicegrp{$a}[0]) cmp uc($customservicegrp{$b}[0]) } keys %customservicegrp){
+                       if ($customservicegrp{$key}[0] eq $name){
+                               if($customservicegrp{$key}[4] eq 'TCP'){$tcp='TCP';}else{$udp='UDP';}
+                       }
                }
-               print" $service";
        }
+       if($tcp){$protocols.="TCP";}
+       if($udp){$protocols.=",UDP";}
+       return $protocols;
 }
 sub viewtablerule
 {
@@ -1655,7 +1729,7 @@ sub viewtablenew
                &General::readhasharray("$config", $hash);
                print"<b>$title1</b><br>";
                print"<table width='100%' border='0' cellspacing='1' style='padding-top: 0px; padding-left: 0px; padding-bottom: 0px ;padding-right: 0px ;'>";
-               print"<tr><td align='center' width='1%'><b>#</td><td width='1%'></td><td align='center' width='20%'><b>$Lang::tr{'fwdfw source'}</td><td width='1%'><b>Log</td><td align='center' width='20%'><b>$Lang::tr{'fwdfw target'}</td><td align='center' width='70%'><b>$Lang::tr{'remark'}</td><td align='center' colspan='3' width='1%'><b>$Lang::tr{'fwdfw action'}</td></tr>";
+               print"<tr><td align='center' width='1%'><b>#</td><td width='1%'></td><td align='center' ><b>$Lang::tr{'fwdfw source'}</td><td width='1%'><b>Log</td><td align='center' width='20%'><b>$Lang::tr{'fwdfw target'}</td><td align='center'><b>$Lang::tr{'protocol'}</b></td><td align='center' width='70%'><b>$Lang::tr{'remark'}</td><td align='center' colspan='3' width='1%'><b>$Lang::tr{'fwdfw action'}</td></tr>";
                foreach my $key (sort  {$a <=> $b} keys %$hash){
                        @tmpsrc=();
                        #check if vpn hosts/nets have been deleted
@@ -1724,7 +1798,7 @@ END
                                $rulecolor=$color{'color16'};
                        }
                        print"<td bgcolor='$rulecolor' width='2%' align='center'><span title='$tooltip'><b>$ruletype</b></span></td>";
-                       print"<td align='center'>";
+                       print"<td align='center' nowrap='nowrap'>";
                        if ($$hash{$key}[3] eq 'std_net_src'){
                                print &get_name($$hash{$key}[4]);
                        }else{
@@ -1756,7 +1830,23 @@ END
                        }
                        &gettgtport(\%$hash,$key);
        ################################################################################
-                       print"</td><td width='20%'>$$hash{$key}[16]</td>";
+                       print"</td>";
+                       #Get Protocol
+                       my $prot;
+                       if ($$hash{$key}[12]){                  #target prot if manual
+                               $prot=$$hash{$key}[12];
+                       }elsif($$hash{$key}[8]){                #source prot if manual
+                               $prot=$$hash{$key}[8];
+                       }elsif($$hash{$key}[14] eq 'cust_srv'){ 
+                               $prot=&get_serviceports("service",$$hash{$key}[15]);
+                       }elsif($$hash{$key}[14] eq 'cust_srvgrp'){
+                               $prot=&get_serviceports("group",$$hash{$key}[15]);
+                       }else{
+                               $prot=$Lang::tr{'all'};
+                       }
+                       print"<td align='center'>$prot</td>";
+                       
+                       print"<td width='20%'>$$hash{$key}[16]</td>";
                        
                        if($$hash{$key}[2] eq 'ON'){
                                $gif="/images/on.gif"
@@ -1826,7 +1916,7 @@ END
                                if($$hash{$key}[25] ne ''){push (@days,$Lang::tr{'fwdfw wd_sun'});}
                                my $weekdays=join(",",@days);
                                if (@days){
-                                       print"<tr bgcolor='#FFE4B5'><td colspan='4'>$Lang::tr{'fwdfw time'} ";
+                                       print"<tr bgcolor='#FFE4B5'><td colspan='7'>$Lang::tr{'fwdfw time'} ";
                                        print"$weekdays";
                                        print "&nbsp $Lang::tr{'fwdfw from'} $$hash{$key}[26] &nbsp $Lang::tr{'fwdfw till'} $$hash{$key}[27]</td><td colspan='8'></d></tr>";
                                }