]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - config/forwardfw/rules.pl
Merge commit '3af3ecd319bdcf8db27e9ca14af72383b4754567' into fifteen
[people/teissler/ipfire-2.x.git] / config / forwardfw / rules.pl
index 3f491f79465906cf08c30426e43f6f65e7206f86..fcaade2d6632f3416ff742b161642e8c72c73ba7 100755 (executable)
@@ -213,14 +213,13 @@ sub buildrules
                        }
                        ##get source prot and port
                        $SRC_TGT='SRC';
-                       $SPROT = &get_prot($hash,$key);
                        $SPORT = &get_port($hash,$key);
                        $SRC_TGT='';
 
                        ##get target prot and port
                        $DPROT=&get_prot($hash,$key);
 
-                       if ($DPROT eq ''){$DPROT=' ';}                          
+                       if ($DPROT eq ''){$DPROT=' ';}
                        @DPROT=split(",",$DPROT);
 
                        #get time if defined
@@ -252,12 +251,12 @@ sub buildrules
                                #print rules to console
                                foreach my $DPROT (@DPROT){
                                        $DPORT = &get_port($hash,$key,$DPROT);
-                                       if ($SPROT ne ''){$PROT=$SPROT;}else{$PROT=$DPROT;}
+                                       $PROT=$DPROT;
                                        $PROT="-p $PROT" if ($PROT ne '' && $PROT ne ' ');
                                        foreach my $a (sort keys %sourcehash){
                                                foreach my $b (sort keys %targethash){
                                                        if ($sourcehash{$a}[0] ne $targethash{$b}[0] && $targethash{$b}[0] ne 'none' || $sourcehash{$a}[0] eq '0.0.0.0/0.0.0.0'){
-                                                               if($SPROT eq '' || $SPROT eq $DPROT || $DPROT eq ' '){
+                                                               if($DPROT ne ''){
                                                                        if(substr($sourcehash{$a}[0], 3, 3) ne 'mac' && $sourcehash{$a}[0] ne ''){ $STAG="-s";}
                                                                        if(substr($DPORT, 2, 4) eq 'icmp'){
                                                                                my @icmprule= split(",",substr($DPORT, 12,));
@@ -311,12 +310,12 @@ sub buildrules
                        }elsif($MODE eq '0'){
                                foreach my $DPROT (@DPROT){
                                        $DPORT = &get_port($hash,$key,$DPROT);
-                                       if ($SPROT ne ''){$PROT=$SPROT;}else{$PROT=$DPROT;}
+                                       $PROT=$DPROT;
                                        $PROT="-p $PROT" if ($PROT ne '' && $PROT ne ' ');
                                        foreach my $a (sort keys %sourcehash){
                                                foreach my $b (sort keys %targethash){
                                                        if ($sourcehash{$a}[0] ne $targethash{$b}[0] && $targethash{$b}[0] ne 'none' || $sourcehash{$a}[0] eq '0.0.0.0/0.0.0.0'){
-                                                               if($SPROT eq '' || $SPROT eq $DPROT || $DPROT eq ' '){
+                                                               if($DPROT ne ''){
                                                                        if(substr($sourcehash{$a}[0], 3, 3) ne 'mac' && $sourcehash{$a}[0] ne ''){ $STAG="-s";}
                                                                        #Process ICMP RULE
                                                                        if(substr($DPORT, 2, 4) eq 'icmp'){
@@ -528,33 +527,29 @@ sub get_prot
 {
        my $hash=shift;
        my $key=shift;
-       if ($$hash{$key}[7] eq 'ON' && $SRC_TGT eq 'SRC'){
-               if ($$hash{$key}[10] ne ''){
-                       return"$$hash{$key}[8]";
-               }elsif($$hash{$key}[9] ne ''){
-                       return"$$hash{$key}[8]";
-               }else{
-                       return "$$hash{$key}[8]";
-               }
-       }elsif($$hash{$key}[11] eq 'ON' && $SRC_TGT eq ''){
-               if ($$hash{$key}[14] eq 'TGT_PORT'){
-                       if ($$hash{$key}[15] ne ''){
-                               return "$$hash{$key}[12]";
-                       }elsif($$hash{$key}[13] ne ''){
-                               return "$$hash{$key}[12]";
-                       }else{
-                               return "$$hash{$key}[12]";
-                       }
-               }elsif($$hash{$key}[14] eq 'cust_srv'){
+       #check AH,GRE,ESP or ICMP
+       if ($$hash{$key}[7] ne 'ON' && $$hash{$key}[11] ne 'ON'){
+               return "$$hash{$key}[8]";
+       }
+       if ($$hash{$key}[7] eq 'ON' || $$hash{$key}[11] eq 'ON'){
+               #check if servicegroup or service
+               if($$hash{$key}[14] eq 'cust_srv'){
                        return &fwlib::get_srv_prot($$hash{$key}[15]);
-                       
                }elsif($$hash{$key}[14] eq 'cust_srvgrp'){
                        return &fwlib::get_srvgrp_prot($$hash{$key}[15]);
+               }elsif (($$hash{$key}[10] ne '' || $$hash{$key}[15] ne '') && $$hash{$key}[8] eq ''){ #when ports are used and prot set to "all"
+                       return "TCP,UDP";
+               }elsif (($$hash{$key}[10] ne '' || $$hash{$key}[15] ne '') && ($$hash{$key}[8] eq 'TCP' || $$hash{$key}[8] eq 'UDP')){ #when ports are used and prot set to "tcp" or "udp"
+                       return "$$hash{$key}[8]";
+               }elsif (($$hash{$key}[10] eq '' && $$hash{$key}[15] eq '') && $$hash{$key}[8] ne 'ICMP'){ #when ports are NOT used and prot NOT set to "ICMP"
+                       return "$$hash{$key}[8]";
+               }else{
+                       return "$$hash{$key}[8]";
                }
        }
        #DNAT
        if ($SRC_TGT eq '' && $$hash{$key}[31] eq 'dnat' && $$hash{$key}[11] eq '' && $$hash{$key}[12] ne ''){
-               return "$$hash{$key}[12]";
+               return "$$hash{$key}[8]";
        }
 }
 sub get_port
@@ -574,10 +569,6 @@ sub get_port
                                        return ":$$hash{$key}[10]";
                                }
                        }
-               }elsif($$hash{$key}[9] ne '' && $$hash{$key}[9] ne 'All ICMP-Types'){
-                       return "--icmp-type $$hash{$key}[9] ";
-               }elsif($$hash{$key}[9] eq 'All ICMP-Types'){
-                       return;
                }
        }elsif($$hash{$key}[11] eq 'ON' && $SRC_TGT eq ''){
                if($$hash{$key}[14] eq 'TGT_PORT'){
@@ -593,10 +584,6 @@ sub get_port
                                                 return ":$$hash{$key}[15]";
                                         }
                                }
-                       }elsif($$hash{$key}[13] ne '' && $$hash{$key}[13] ne 'All ICMP-Types'){
-                               return "--icmp-type $$hash{$key}[13] ";
-                       }elsif($$hash{$key}[13] ne '' && $$hash{$key}[13] eq 'All ICMP-Types'){
-                               return;
                        }
                }elsif($$hash{$key}[14] eq 'cust_srv'){
                        if ($prot ne 'ICMP'){
@@ -605,10 +592,8 @@ sub get_port
                                }else{
                                        return "--dport ".&fwlib::get_srv_port($$hash{$key}[15],1,$prot);
                                }
-                       }elsif($prot eq 'ICMP' && $$hash{$key}[15] ne 'All ICMP-Types'){
+                       }elsif($prot eq 'ICMP' && $$hash{$key}[11] eq 'ON'){        #When PROT is ICMP and "use targetport is checked, this is an icmp-service
                                return "--icmp-type ".&fwlib::get_srv_port($$hash{$key}[15],3,$prot);
-                       }elsif($prot eq 'ICMP' && $$hash{$key}[15] eq 'All ICMP-Types'){
-                               return;
                        }
                }elsif($$hash{$key}[14] eq 'cust_srvgrp'){
                        if      ($prot ne 'ICMP'){
@@ -619,4 +604,12 @@ sub get_port
                        }
                }
        }
+       #CHECK ICMP
+       if ($$hash{$key}[7] ne 'ON' && $$hash{$key}[11] ne 'ON' && $SRC_TGT eq ''){
+               if($$hash{$key}[9] ne '' && $$hash{$key}[9] ne 'All ICMP-Types'){
+                       return "--icmp-type $$hash{$key}[9] ";
+               }elsif($$hash{$key}[9] eq 'All ICMP-Types'){
+                       return;
+               }
+       }
 }