version 1.17, 2019/05/07 21:18:24
|
version 1.24, 2021/12/21 13:57:47
|
Line 42 sub uses_firewalld {
|
Line 42 sub uses_firewalld {
|
if ($distro eq '') { |
if ($distro eq '') { |
$distro = &get_distro(); |
$distro = &get_distro(); |
} |
} |
my ($inuse,$checkfirewalld,$zone); |
my ($inuse,$checkfirewalld); |
if ($distro =~ /^(suse|sles)([\d\.]+)$/) { |
if ($distro =~ /^(suse|sles)([\d\.]+)$/) { |
if (($1 eq 'sles') && ($2 >= 15)) { |
if (($1 eq 'sles') && ($2 >= 15)) { |
$checkfirewalld = 1; |
$checkfirewalld = 1; |
Line 51 sub uses_firewalld {
|
Line 51 sub uses_firewalld {
|
if ($1 >= 18) { |
if ($1 >= 18) { |
$checkfirewalld = 1; |
$checkfirewalld = 1; |
} |
} |
} elsif ($distro =~ /^(?:centos|rhes|scientific)(\d+)/) { |
} elsif ($distro =~ /^(?:centos|rhes|scientific|oracle|rocky|alma)(\d+)/) { |
if ($1 >= 7) { |
if ($1 >= 7) { |
$checkfirewalld = 1; |
$checkfirewalld = 1; |
} |
} |
Line 72 sub uses_firewalld {
|
Line 72 sub uses_firewalld {
|
} |
} |
if (($loaded eq 'loaded') || ($active eq 'active')) { |
if (($loaded eq 'loaded') || ($active eq 'active')) { |
$inuse = 1; |
$inuse = 1; |
my $cmd = 'firewall-cmd --get-default-zone'; |
|
if (open(PIPE,"$cmd |")) { |
|
my $result = <PIPE>; |
|
chomp($result); |
|
close(PIPE); |
|
if ($result =~ /^\w+$/) { |
|
$zone = $result; |
|
} |
|
} |
|
} |
} |
} |
} |
return ($inuse,$zone); |
return $inuse; |
} |
} |
|
|
sub firewall_open_port { |
sub firewall_open_port { |
my ($iptables,$fw_chains,$lond_port,$iphost,$ports) = @_; |
my ($iptables,$fw_chains,$lond_port,$iphost,$ports,$firewalld) = @_; |
return 'inactive firewall' if (!&firewall_is_active()); |
return 'inactive firewall' if (!&firewall_is_active()); |
return 'port number unknown' if !$lond_port; |
return 'port number unknown' if !$lond_port; |
return 'invalid firewall chain' unless (ref($fw_chains) eq 'ARRAY'); |
return 'invalid firewall chain' unless (ref($fw_chains) eq 'ARRAY'); |
my (@opened,@chains,@badchains,@okchains); |
my (@opened,@okchains,$zone); |
foreach my $chain (@{$fw_chains}) { |
if ($firewalld) { |
if ($chain =~ /^([\w\-]+)$/) { |
$zone = &get_default_zone(); |
push(@okchains,$1); |
return 'invalid zone' if ($zone eq ''); |
} else { |
} else { |
push(@badchains,$chain); |
my @badchains; |
|
foreach my $chain (@{$fw_chains}) { |
|
if ($chain =~ /^([\w\-]+)$/) { |
|
push(@okchains,$1); |
|
} else { |
|
push(@badchains,$chain); |
|
} |
|
} |
|
if (!@okchains) { |
|
return 'None of the chain names has the expected format.'."\n"; |
} |
} |
} |
|
if (!@okchains) { |
|
return 'None of the chain names has the expected format.'."\n"; |
|
} |
} |
if (ref($ports) ne 'ARRAY') { |
if (ref($ports) ne 'ARRAY') { |
return 'List of ports to open needed.'; |
return 'List of ports to open needed.'; |
} |
} |
my ($firewalld,$zone) = &uses_firewalld(); |
|
foreach my $portnum (@{$ports}) { |
foreach my $portnum (@{$ports}) { |
my $port = ''; |
my $port = ''; |
if ($portnum =~ /^(\d+)$/) { |
if ($portnum =~ /^(\d+)$/) { |
Line 123 sub firewall_open_port {
|
Line 119 sub firewall_open_port {
|
@lond_port_curropen); |
@lond_port_curropen); |
if (ref($iphost) eq 'HASH') { |
if (ref($iphost) eq 'HASH') { |
if (keys(%{$iphost}) > 0) { |
if (keys(%{$iphost}) > 0) { |
|
my $count = scalar(keys(%{$iphost})); |
|
if ($count > 1) { |
|
print "Please be patient. Checking $count IPs.\n"; |
|
} |
my %curropen; |
my %curropen; |
foreach my $fw_chain (@okchains) { |
if ($firewalld) { |
&firewall_close_anywhere($iptables,$fw_chain,$port); |
&firewall_close_anywhere($iptables,$zone,$port,$firewalld); |
my $current = &firewall_is_port_open($iptables,$fw_chain,$port,$lond_port,$iphost,\%curropen); |
my $current = &firewall_is_port_open($iptables,$zone,$port, |
|
$lond_port,$iphost,\%curropen, |
|
$firewalld); |
|
} else { |
|
foreach my $fw_chain (@okchains) { |
|
&firewall_close_anywhere($iptables,$fw_chain,$port); |
|
my $current = &firewall_is_port_open($iptables,$fw_chain,$port, |
|
$lond_port,$iphost,\%curropen); |
|
} |
} |
} |
|
my $countok = 0; |
foreach my $key (keys(%{$iphost})) { |
foreach my $key (keys(%{$iphost})) { |
my $ip = ''; |
my $ip = ''; |
if ($key =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) { |
if ($key =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) { |
Line 144 sub firewall_open_port {
|
Line 153 sub firewall_open_port {
|
if ($curropen{$ip}) { |
if ($curropen{$ip}) { |
push(@lond_port_curropen,$ip); |
push(@lond_port_curropen,$ip); |
} else { |
} else { |
foreach my $fw_chain (@okchains) { |
if ($firewalld) { |
if ($firewalld) { |
my $cmd = 'firewall-cmd --zone='.$zone.' --add-rich-rule \'rule family="ipv4" source address="'.$ip.'/32" port port="'.$port.'" protocol="tcp" accept\''; |
my $cmd = 'firewall-cmd --zone='.$zone.' --add-rich-rule \'rule family="ipv4" source address="'.$ip.'/32" port port="'.$port.'" protocol="tcp" accept\''; |
if (open(PIPE,"$cmd |")) { |
if (open(PIPE,"$cmd |")) { |
my $result = <PIPE>; |
my $result = <PIPE>; |
chomp($result); |
chomp($result); |
close(PIPE); |
close(PIPE); |
if ($result eq 'success') { |
if ($result eq 'success') { |
push(@lond_port_open,$ip); |
push(@lond_port_open,$ip); |
|
last; |
|
} else { |
|
push (@port_error,$ip); |
|
} |
|
} else { |
} else { |
push (@port_error,$ip); |
push(@port_error,$ip); |
} |
} |
} else { |
} |
|
} else { |
|
foreach my $fw_chain (@okchains) { |
my $firewall_command = |
my $firewall_command = |
"$iptables -I $fw_chain -p tcp -s $ip -d 0/0 --dport $port -j ACCEPT"; |
"$iptables -I $fw_chain -p tcp -s $ip -d 0/0 --dport $port -j ACCEPT"; |
system($firewall_command); |
system($firewall_command); |
my $return_status = $?>>8; |
my $return_status = $?>>8; |
if ($return_status == 1) { |
if ($return_status == 1) { |
unless(grep(/^\Q$ip\E$/,@port_error)) { |
unless(grep(/^\Q$ip\E$/,@port_error)) { |
push (@port_error,$ip); |
push(@port_error,$ip); |
} |
} |
} elsif ($return_status == 2) { |
} elsif ($return_status == 2) { |
push(@{$command_error{$fw_chain}},$ip); |
push(@{$command_error{$fw_chain}},$ip); |
Line 178 sub firewall_open_port {
|
Line 184 sub firewall_open_port {
|
} |
} |
} |
} |
} |
} |
|
if ($count > 1) { |
|
$countok ++; |
|
print '.'; |
|
if ($countok%40 == 0) { |
|
print "\n"; |
|
} |
|
} |
|
} |
|
if ($count > 1) { |
|
if ($countok%40) { |
|
print "\n"; |
|
} |
} |
} |
} else { |
} else { |
print "no key found in $iphost hash ref\n"; |
print "no key found in \$iphost hash ref.\n". |
|
"Domain Name Service (DNS) may not be available.\n". |
|
"If this LON-CAPA node is standalone, then you can fix this issue by modifying /etc/hosts.\n". |
|
"Use a text editor to add: IPaddress Hostname\n"; |
} |
} |
} else { |
} else { |
print "$iphost is not a reference to a hash\n"; |
print "\$iphost is not a reference to a hash\n"; |
} |
} |
if (@lond_port_curropen) { |
if (@lond_port_curropen) { |
unless (grep(/^\Q$port\E$/,@opened)) { |
unless (grep(/^\Q$port\E$/,@opened)) { |
Line 212 sub firewall_open_port {
|
Line 233 sub firewall_open_port {
|
} |
} |
} |
} |
} else { |
} else { |
my (@port_errors,%command_errors); |
if ($firewalld) { |
foreach my $fw_chain (@okchains) { |
my ($port_error); |
if ($firewalld) { |
my $cmd = 'firewall-cmd --zone='.$zone.' --add-rich-rule \'rule family="ipv4" port port="'.$port.'" protocol="tcp" accept\''; |
my $cmd = 'firewall-cmd --zone='.$zone.' --add-rich-rule \'rule family="ipv4" port port="'.$port.'" protocol="tcp" accept\''; |
if (open(PIPE,"$cmd |")) { |
if (open(PIPE,"$cmd |")) { |
my $result = <PIPE>; |
my $result = <PIPE>; |
chomp($result); |
chomp($result); |
close(PIPE); |
close(PIPE); |
if ($result eq 'success') { |
if ($result eq 'success') { |
push(@opened,$port); |
push(@opened,$port); |
|
last; |
|
} else { |
|
push(@port_errors,$fw_chain); |
|
} |
|
} else { |
} else { |
push(@port_errors,$fw_chain); |
$port_error = $port; |
} |
} |
} else { |
} else { |
|
$port_error = $port; |
|
} |
|
if ($port_error) { |
|
print "Error opening port: $port\n"; |
|
} |
|
} else { |
|
my (@port_errors,%command_errors); |
|
foreach my $fw_chain (@okchains) { |
my $firewall_command = |
my $firewall_command = |
"$iptables -I $fw_chain -p tcp -d 0/0 --dport $port -j ACCEPT"; |
"$iptables -I $fw_chain -p tcp -d 0/0 --dport $port -j ACCEPT"; |
system($firewall_command); |
system($firewall_command); |
Line 267 sub firewall_open_port {
|
Line 291 sub firewall_open_port {
|
} |
} |
|
|
sub firewall_is_port_open { |
sub firewall_is_port_open { |
my ($iptables,$fw_chain,$port,$lond_port,$iphost,$curropen) = @_; |
my ($iptables,$fw_chain,$port,$lond_port,$iphost,$curropen,$firewalld) = @_; |
# for lond port returns number of source IPs for which firewall port is open |
# for lond port returns number of source IPs for which firewall port is open |
# for other ports returns 1 if the firewall port is open, 0 if not. |
# for other ports returns 1 if the firewall port is open, 0 if not. |
# |
# if firewalld is in use, checks for rich rules only. |
# check if firewall is active or installed |
|
return if (! &firewall_is_active()); |
|
my $count = 0; |
my $count = 0; |
if (open(PIPE,"$iptables -L $fw_chain -n |")) { |
# check if firewall is active or installed |
|
return $count if (! &firewall_is_active()); |
|
if ($firewalld) { |
|
my $zone = &get_default_zone(); |
|
return $count if ($zone eq ''); |
|
if ($port eq $lond_port) { |
|
if (open(PIPE,"firewall-cmd --zone=$zone --list-rich-rules |")) { |
|
while(<PIPE>) { |
|
chomp(); |
|
if (/\Qrule family="ipv4" source address="\E([\d.]+)\Q\/32" port port="$port" protocol="tcp" accept\E/) { |
|
my $ip = $1; |
|
if ($iphost->{$ip}) { |
|
$count ++; |
|
if (ref($curropen) eq 'HASH') { |
|
$curropen->{$ip} ++; |
|
} |
|
} |
|
} |
|
} |
|
close(PIPE); |
|
} |
|
} else { |
|
if (open(PIPE,"firewall-cmd --zone=$zone --list-rich-rules |")) { |
|
while(<PIPE>) { |
|
if (/\Qrule family="ipv4" port port="$port" protocol="tcp" accept\E/) { |
|
$count ++; |
|
last; |
|
} |
|
} |
|
close(PIPE); |
|
} |
|
} |
|
} elsif (($fw_chain =~ /^[\w-]+$/) && (open(PIPE,"$iptables -L $fw_chain -n |"))) { |
while(<PIPE>) { |
while(<PIPE>) { |
if ($port eq $lond_port) { |
if ($port eq $lond_port) { |
if (ref($iphost) eq 'HASH') { |
if (ref($iphost) eq 'HASH') { |
Line 288 sub firewall_is_port_open {
|
Line 342 sub firewall_is_port_open {
|
} |
} |
} |
} |
} |
} |
} else { |
} elsif (/tcp dpt\:\Q$port\E/) { |
if (/tcp dpt\:\Q$port\E/) { |
$count ++; |
$count ++; |
last; |
last; |
|
} |
|
} |
} |
} |
} |
close(PIPE); |
close(PIPE); |
Line 314 sub firewall_is_active {
|
Line 366 sub firewall_is_active {
|
close(PIPE); |
close(PIPE); |
} |
} |
} |
} |
|
unless ($status) { |
|
$status = &uses_firewalld(); |
|
} |
return $status; |
return $status; |
} |
} |
|
|
sub firewall_close_port { |
sub firewall_close_port { |
my ($iptables,$fw_chains,$lond_port,$iphost,$ports) = @_; |
my ($iptables,$fw_chains,$lond_port,$iphost,$ports,$firewalld) = @_; |
return 'inactive firewall' if (!&firewall_is_active()); |
return 'inactive firewall' if (!&firewall_is_active()); |
return 'port number unknown' if !$lond_port; |
return 'port number unknown' if !$lond_port; |
return 'invalid firewall chain' unless (ref($fw_chains) eq 'ARRAY'); |
return 'invalid firewall chain' unless (ref($fw_chains) eq 'ARRAY'); |
my (@opened,@chains,@badchains,@okchains); |
my (@okchains,$zone); |
foreach my $chain (@{$fw_chains}) { |
if ($firewalld) { |
if ($chain =~ /^([\w\-]+)$/) { |
$zone = &get_default_zone(); |
push(@okchains,$1); |
return 'no default zone' if ($zone eq ''); |
} else { |
} else { |
push(@badchains,$chain); |
my @badchains; |
|
foreach my $chain (@{$fw_chains}) { |
|
if ($chain =~ /^([\w\-]+)$/) { |
|
push(@okchains,$1); |
|
} else { |
|
push(@badchains,$chain); |
|
} |
|
} |
|
if (!@okchains) { |
|
return 'None of the chain names has the expected format.'."\n"; |
} |
} |
} |
|
if (!@okchains) { |
|
return 'None of the chain names has the expected format.'."\n"; |
|
} |
} |
if (ref($ports) ne 'ARRAY') { |
if (ref($ports) ne 'ARRAY') { |
return 'List of ports to close needed.'; |
return 'List of ports to close needed.'; |
} |
} |
my ($firewalld,$zone) = &uses_firewalld(); |
|
foreach my $portnum (@{$ports}) { |
foreach my $portnum (@{$ports}) { |
my $port = ''; |
my $port = ''; |
if ($portnum =~ /^(\d+)$/) { |
if ($portnum =~ /^(\d+)$/) { |
Line 348 sub firewall_close_port {
|
Line 408 sub firewall_close_port {
|
print "Closing firewall access on port $port.\n"; |
print "Closing firewall access on port $port.\n"; |
if (($port ne '') && ($port eq $lond_port)) { |
if (($port ne '') && ($port eq $lond_port)) { |
my $output; |
my $output; |
foreach my $fw_chain (@okchains) { |
if ($firewalld) { |
my (@port_error,@command_error,@lond_port_close); |
my (%to_close,@port_error,@lond_port_close); |
my %to_close; |
my $cmd = 'firewall-cmd --list-rich-rules'; |
if (open(PIPE, "$iptables -n -L $fw_chain |")) { |
if (open(PIPE,"$cmd |")) { |
while (<PIPE>) { |
while(<PIPE>) { |
chomp(); |
if (/\Qrule family="ipv4" source address="\E([\d.]+)\Q\/32" port port="$port" protocol="tcp" accept\E/) { |
next unless (/dpt:\Q$port\E/); |
|
if (/^ACCEPT\s+tcp\s+\-{2}\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+/) { |
|
my $ip = $1; |
my $ip = $1; |
my $keepopen = 0; |
my $keepopen = 0; |
if (ref($iphost) eq 'HASH') { |
if (ref($iphost) eq 'HASH') { |
if (exists($iphost->{$ip})) { |
if (exists($iphost->{$ip})) { |
$keepopen = 1; |
$keepopen = 1; |
} |
} |
} |
} |
unless ($keepopen) { |
unless ($keepopen) { |
Line 371 sub firewall_close_port {
|
Line 429 sub firewall_close_port {
|
close(PIPE); |
close(PIPE); |
} |
} |
if (keys(%to_close) > 0) { |
if (keys(%to_close) > 0) { |
foreach my $ip (keys(%to_close)) { |
foreach my $ip (sort(keys(%to_close))) { |
if ($firewalld) { |
my $cmd = 'firewall-cmd --zone='.$zone.' --remove-rich-rule \'rule family="ipv4" source address="'.$ip.'/32" port port="'.$port.'" protocol="tcp" accept\''; |
my $cmd = 'firewall-cmd --zone='.$zone.' --remove-rich-rule \'rule family="ipv4" source address="'.$ip.'/32" port port="'.$port.'" protocol="tcp" accept\''; |
if (open(PIPE,"$cmd |")) { |
if (open(PIPE,"$cmd |")) { |
my $result = <PIPE>; |
my $result = <PIPE>; |
chomp($result); |
chomp($result); |
close(PIPE); |
close(PIPE); |
if ($result eq 'success') { |
if ($result eq 'success') { |
push(@lond_port_close,$ip); |
push(@lond_port_close,$ip); |
|
} else { |
|
push(@port_error,$ip); |
|
} |
|
} else { |
} else { |
push(@port_error,$ip); |
push(@port_error,$ip); |
} |
} |
} else { |
} else { |
|
push(@port_error,$ip); |
|
} |
|
} |
|
} |
|
if (@lond_port_close) { |
|
$output .= "Port closed for ".scalar(@lond_port_close)." IP addresses.\n"; |
|
} |
|
if (@port_error) { |
|
$output .= "Error closing port for following IP addresses: ".join(', ',@port_error)."\n"; |
|
} |
|
} else { |
|
foreach my $fw_chain (@okchains) { |
|
my (%to_close,@port_error,@command_error,@lond_port_close); |
|
if (open(PIPE, "$iptables -n -L $fw_chain |")) { |
|
while (<PIPE>) { |
|
chomp(); |
|
next unless (/dpt:\Q$port\E/); |
|
if (/^ACCEPT\s+tcp\s+\-{2}\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+/) { |
|
my $ip = $1; |
|
my $keepopen = 0; |
|
if (ref($iphost) eq 'HASH') { |
|
if (exists($iphost->{$ip})) { |
|
$keepopen = 1; |
|
} |
|
} |
|
unless ($keepopen) { |
|
$to_close{$ip} = $port; |
|
} |
|
} |
|
} |
|
close(PIPE); |
|
} |
|
if (keys(%to_close) > 0) { |
|
foreach my $ip (keys(%to_close)) { |
my $firewall_command = |
my $firewall_command = |
"$iptables -D $fw_chain -p tcp -s $ip -d 0/0 --dport $port -j ACCEPT"; |
"$iptables -D $fw_chain -p tcp -s $ip -d 0/0 --dport $port -j ACCEPT"; |
system($firewall_command); |
system($firewall_command); |
my $return_status = $?>>8; |
my $return_status = $?>>8; |
if ($return_status == 1) { |
if ($return_status == 1) { |
push (@port_error,$ip); |
push(@port_error,$ip); |
} elsif ($return_status == 2) { |
} elsif ($return_status == 2) { |
push(@command_error,$ip); |
push(@command_error,$ip); |
} elsif ($return_status == 0) { |
} elsif ($return_status == 0) { |
Line 400 sub firewall_close_port {
|
Line 488 sub firewall_close_port {
|
} |
} |
} |
} |
} |
} |
} |
if (@lond_port_close) { |
if (@lond_port_close) { |
$output .= "Port closed for ".scalar(@lond_port_close)." IP addresses.\n"; |
$output .= "Port closed for ".scalar(@lond_port_close)." IP addresses.\n"; |
} |
} |
if (@port_error) { |
if (@port_error) { |
$output .= "Error closing port for following IP addresses: ".join(', ',@port_error)."\n"; |
$output .= "Error closing port for following IP addresses: ".join(', ',@port_error)."\n"; |
} |
} |
if (@command_error) { |
if (@command_error) { |
$output .= "Bad command error opening port for following IP addresses: ". |
$output .= "Bad command error opening port for following IP addresses: ". |
join(', ',@command_error)."\n". |
join(', ',@command_error)."\n". |
'Command was: "'."$iptables -D $fw_chain -p tcp -s ".'$ip'." -d 0/0 --dport $port -j ACCEPT".'", where $ip is IP address'."\n"; |
'Command was: "'."$iptables -D $fw_chain -p tcp -s ".'$ip'." -d 0/0 --dport $port -j ACCEPT".'", where $ip is IP address'."\n"; |
} |
} |
} |
} |
} |
if ($output) { |
if ($output) { |
Line 419 sub firewall_close_port {
|
Line 507 sub firewall_close_port {
|
print "No IP addresses required discontinuation of access.\n"; |
print "No IP addresses required discontinuation of access.\n"; |
} |
} |
} else { |
} else { |
foreach my $fw_chain (@okchains) { |
if ($firewalld) { |
my (@port_error,@command_error,@lond_port_close); |
|
my $to_close; |
my $to_close; |
if (open(PIPE, "$iptables -n -L $fw_chain |")) { |
if (open(PIPE,"firewall-cmd --list-rich-rules |")) { |
while (<PIPE>) { |
while(<PIPE>) { |
chomp(); |
next unless (/\Qrule family="ipv4" port port="$port" protocol="tcp" accept\E/); |
next unless (/dpt:\Q$port\E/); |
|
$to_close = 1; |
$to_close = 1; |
|
last; |
} |
} |
close(PIPE); |
close(PIPE); |
} |
} |
if ($to_close) { |
if ($to_close) { |
if ($firewalld) { |
my $cmd = 'firewall-cmd --zone='.$zone.' --remove-rich-rule \'rule family="ipv4" port port="'.$port.'" protocol="tcp" accept\''; |
my $cmd = 'firewall-cmd --zone='.$zone.' --remove-rich-rule \'rule family="ipv4" port port="'.$port.'" protocol="tcp" accept\''; |
if (open(PIPE,"$cmd|")) { |
if (open(PIPE,"$cmd|")) { |
my $result = <PIPE>; |
my $result = <PIPE>; |
chomp($result); |
chomp($result); |
close(PIPE); |
close(PIPE); |
if ($result eq 'success') { |
if ($result eq 'success') { |
print "Port: $port closed in zone: $zone.\n"; |
print "Port closed for chain $fw_chain.\n"; |
|
} else { |
|
print "Error closing port for chain: $fw_chain.\n"; |
|
} |
|
} else { |
} else { |
print "Error closing port for chain: $fw_chain.\n"; |
print "Error closing port: $port in zone: $zone.\n"; |
} |
} |
} else { |
} else { |
|
print "Error closing port: $port in zone: $zone.\n"; |
|
} |
|
} |
|
} else { |
|
foreach my $fw_chain (@okchains) { |
|
my (@port_error,@command_error,@lond_port_close); |
|
my $to_close; |
|
if (open(PIPE, "$iptables -n -L $fw_chain |")) { |
|
while (<PIPE>) { |
|
chomp(); |
|
next unless (/dpt:\Q$port\E/); |
|
$to_close = 1; |
|
last; |
|
} |
|
close(PIPE); |
|
} |
|
if ($to_close) { |
my $firewall_command = |
my $firewall_command = |
"$iptables -D $fw_chain -p tcp -d 0/0 --dport $port -j ACCEPT"; |
"$iptables -D $fw_chain -p tcp -d 0/0 --dport $port -j ACCEPT"; |
system($firewall_command); |
system($firewall_command); |
my $return_status = $?>>8; |
my $return_status = $?>>8; |
if ($return_status == 1) { |
if ($return_status == 1) { |
# Error |
# Error |
print "Error closing port for chain: $fw_chain.\n"; |
print "Error closing port: $port for chain: $fw_chain.\n"; |
} elsif ($return_status == 2) { |
} elsif ($return_status == 2) { |
# Bad command |
# Bad command |
print "Bad command error closing port. Command was\n". |
print "Bad command error closing port. Command was\n". |
Line 469 sub firewall_close_port {
|
Line 569 sub firewall_close_port {
|
} |
} |
|
|
sub firewall_close_anywhere { |
sub firewall_close_anywhere { |
my ($iptables,$fw_chain,$port) = @_; |
my ($iptables,$fw_chain,$port,$firewalld) = @_; |
my ($firewalld,$zone) = &uses_firewalld(); |
my $zone; |
if (open(PIPE, "$iptables --line-numbers -n -L $fw_chain |")) { |
if ($firewalld) { |
|
$zone = &get_default_zone(); |
|
if ($zone eq '') { |
|
print 'no default zone'; |
|
return; |
|
} |
|
} else { |
|
unless ($fw_chain =~ /^([\w\-]+)$/) { |
|
print 'invalid chain'; |
|
return; |
|
} |
|
} |
|
if ($firewalld) { |
|
my $to_close; |
|
my $cmd = 'firewall-cmd --list-ports'; |
|
if (open(PIPE,"$cmd |")) { |
|
my $currports = <PIPE>; |
|
close(PIPE); |
|
chomp($currports); |
|
if (grep(/^\Q$port\E\/tcp/,split(/\s+/,$currports))) { |
|
$to_close = 1; |
|
} |
|
} |
|
if ($to_close) { |
|
my $cmd = 'firewall-cmd --zone='.$zone.' --remove-port='.$port.'/tcp'; |
|
if (open(PIPE,"$cmd |")) { |
|
my $result = <PIPE>; |
|
chomp($result); |
|
close(PIPE); |
|
if ($result eq 'success') { |
|
print 'Port '.$port.' closed for source "anywhere"'."\n"; |
|
} else { |
|
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
|
} |
|
} else { |
|
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
|
} |
|
} |
|
} elsif (open(PIPE, "$iptables --line-numbers -n -L $fw_chain |")) { |
while (<PIPE>) { |
while (<PIPE>) { |
next unless (/dpt:\Q$port\E/); |
next unless (/dpt:\Q$port\E/); |
chomp(); |
chomp(); |
if (/^(\d+)\s+ACCEPT\s+tcp\s+\-{2}\s+0\.0\.0\.0\/0\s+0\.0\.0\.0\/0/) { |
if (/^(\d+)\s+ACCEPT\s+tcp\s+\-{2}\s+0\.0\.0\.0\/0\s+0\.0\.0\.0\/0/) { |
if ($firewalld) { |
my $firewall_command = "$iptables -D $fw_chain $1"; |
my $cmd = 'firewall-cmd --remove-port='.$port.'/tcp'; |
system($firewall_command); |
if (open(PIPE,"$cmd |")) { |
my $return_status = $?>>8; |
my $result = <PIPE>; |
if ($return_status == 1) { |
chomp($result); |
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
close(PIPE); |
} elsif ($return_status == 2) { |
if ($result eq 'success') { |
print 'Bad command error closing port '.$port.' for source "anywhere". Command was'."\n". |
print 'Port '.$port.' closed for source "anywhere"'."\n"; |
' '.$firewall_command."\n"; |
} else { |
|
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
|
} |
|
} else { |
|
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
|
} |
|
} else { |
} else { |
my $firewall_command = "$iptables -D $fw_chain $1"; |
print 'Port '.$port.' closed for source "anywhere"'."\n"; |
system($firewall_command); |
|
my $return_status = $?>>8; |
|
if ($return_status == 1) { |
|
print 'Error closing port '.$port.' for source "anywhere".'."\n"; |
|
} elsif ($return_status == 2) { |
|
print 'Bad command error closing port '.$port.' for source "anywhere". Command was'."\n". |
|
' '.$firewall_command."\n"; |
|
} else { |
|
print 'Port '.$port.' closed for source "anywhere"'."\n"; |
|
} |
|
} |
} |
} |
} |
} |
} |
Line 531 sub get_fw_chains {
|
Line 653 sub get_fw_chains {
|
my @fw_chains; |
my @fw_chains; |
my $suse_config = "/etc/sysconfig/SuSEfirewall2"; |
my $suse_config = "/etc/sysconfig/SuSEfirewall2"; |
my $ubuntu_config = "/etc/ufw/ufw.conf"; |
my $ubuntu_config = "/etc/ufw/ufw.conf"; |
my ($firewalld,$zone) = &uses_firewalld($distro); |
my $firewalld = &uses_firewalld($distro); |
if ($firewalld) { |
if ($firewalld) { |
if ($zone ne '') { |
my ($dist,$version) = ($distro =~ /^([\D]+)(\d+)(?:|\-stream)$/); |
push(@fw_chains,'IN_'.$zone.'_allow'); |
if (((($dist eq 'rhes') || ($dist eq 'centos') || ($dist eq 'rocky') || ($dist eq 'alma')) && |
|
($version >= 8)) || (($dist eq 'oracle') && ($version >= 7))) { |
|
push(@fw_chains,'INPUT'); |
} else { |
} else { |
push(@fw_chains,'IN_public_allow'); |
my $zone = &get_default_zone(); |
} |
if ($zone ne '') { |
|
push(@fw_chains,'IN_'.$zone.'_allow'); |
|
} else { |
|
push(@fw_chains,'IN_public_allow'); |
|
} |
|
} |
} elsif (-e $suse_config) { |
} elsif (-e $suse_config) { |
push(@fw_chains,'input_ext'); |
push(@fw_chains,'input_ext'); |
} else { |
} else { |
Line 547 sub get_fw_chains {
|
Line 676 sub get_fw_chains {
|
} else { |
} else { |
if ($distro =~ /^(debian|ubuntu|suse|sles)/) { |
if ($distro =~ /^(debian|ubuntu|suse|sles)/) { |
@posschains = ('INPUT'); |
@posschains = ('INPUT'); |
} elsif ($distro =~ /^(fedora|rhes|centos|scientific)(\d+)$/) { |
} elsif ($distro =~ /^(fedora|rhes|centos|scientific|oracle|rocky|alma)(\d+)(?:|\-stream)$/) { |
if ((($1 eq 'fedora') && ($2 > 15)) || (($1 ne 'fedora') && ($2 >= 7))) { |
if ((($1 eq 'fedora') && ($2 > 15)) || (($1 ne 'fedora') && ($2 >= 7))) { |
@posschains = ('INPUT'); |
@posschains = ('INPUT'); |
} else { |
} else { |
Line 560 sub get_fw_chains {
|
Line 689 sub get_fw_chains {
|
print("Unable to find iptables file containing static definitions.\n"); |
print("Unable to find iptables file containing static definitions.\n"); |
} |
} |
} |
} |
if ($distro =~ /^(fedora|rhes|centos|scientific)(\d+)$/) { |
if ($distro =~ /^(fedora|rhes|centos|scientific|oracle|rocky|alma)(\d+){?:|\-stream)$/) { |
unless ((($1 eq 'fedora') && ($2 > 15)) || (($1 ne 'fedora') && ($2 >= 7))) { |
unless ((($1 eq 'fedora') && ($2 > 15)) || (($1 ne 'fedora') && ($2 >= 7))) { |
push(@fw_chains,'RH-Firewall-1-INPUT'); |
push(@fw_chains,'RH-Firewall-1-INPUT'); |
} |
} |
Line 592 sub get_fw_chains {
|
Line 721 sub get_fw_chains {
|
return @fw_chains; |
return @fw_chains; |
} |
} |
|
|
|
sub get_default_zone { |
|
my $cmd = 'firewall-cmd --get-default-zone'; |
|
my $zone; |
|
if (open(PIPE,"$cmd |")) { |
|
my $result = <PIPE>; |
|
chomp($result); |
|
close(PIPE); |
|
($zone) = ($result =~ /^(\w+)$/); |
|
} |
|
return $zone; |
|
} |
|
|
sub get_pathto_iptables { |
sub get_pathto_iptables { |
my $iptables; |
my $iptables; |
if (-e '/sbin/iptables') { |
if (-e '/sbin/iptables') { |
Line 653 The following methods are available:
|
Line 794 The following methods are available:
|
|
|
=over 4 |
=over 4 |
|
|
=item LONCAPA::Firewall::firewall_open_port( $iptables,$fw_chains,$lond_port,$iphost,$port ); |
=item LONCAPA::Firewall::firewall_open_port( $iptables,$fw_chains,$lond_port,$iphost,$ports,$firewalld ); |
|
|
=back |
=back |
|
|
=over 4 |
=over 4 |
|
|
=item LONCAPA::Firewall::firewall_close_port( $iptables,$fw_chains,$lond_port,$iphost,$ports ); |
=item LONCAPA::Firewall::firewall_close_port( $iptables,$fw_chains,$lond_port,$iphost,$ports,$firewalld ); |
|
|
=back |
=back |
|
|
=over 4 |
=over 4 |
|
|
=item LONCAPA::Firewall::firewall_is_port_open( $iptables,$fw_chain,$port,$lond_port,$iphost,$curropen ); |
=item LONCAPA::Firewall::firewall_is_port_open( $iptables,$fw_chain,$port,$lond_port,$iphost,$curropen,$firewalld ); |
|
|
=back |
=back |
|
|
Line 677 The following methods are available:
|
Line 818 The following methods are available:
|
|
|
=over 4 |
=over 4 |
|
|
=item LONCAPA::Firewall::firewall_close_anywhere( $iptables,$fw_chain,$port ); |
=item LONCAPA::Firewall::firewall_close_anywhere( $iptables,$fw_chain,$port,$firewalld ); |
|
|
=back |
=back |
|
|