[2/2] firewall: Move dropping hostile networks to rules.pl.

Message ID 20220227134903.1828-2-stefan.schantl@ipfire.org
State Accepted
Commit 7b529f5417254c68b6bd33732f30578182893d34
Headers
Series [1/2] rules.pl: Allow dynamic destory of loaded but unused ipset sets. |

Commit Message

Stefan Schantl Feb. 27, 2022, 1:49 p.m. UTC
  Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
---
 config/firewall/rules.pl        | 33 +++++++++++++++++++++++++++++++++
 src/initscripts/system/firewall | 23 ++++++++---------------
 2 files changed, 41 insertions(+), 15 deletions(-)
  

Comments

Michael Tremer March 1, 2022, 1:23 p.m. UTC | #1
Reviewed-by: Michael Tremer <michael.tremer@ipfire.org>

> On 27 Feb 2022, at 13:49, Stefan Schantl <stefan.schantl@ipfire.org> wrote:
> 
> Signed-off-by: Stefan Schantl <stefan.schantl@ipfire.org>
> ---
> config/firewall/rules.pl        | 33 +++++++++++++++++++++++++++++++++
> src/initscripts/system/firewall | 23 ++++++++---------------
> 2 files changed, 41 insertions(+), 15 deletions(-)
> 
> diff --git a/config/firewall/rules.pl b/config/firewall/rules.pl
> index 7a7c8ed31..b12764d18 100644
> --- a/config/firewall/rules.pl
> +++ b/config/firewall/rules.pl
> @@ -59,6 +59,9 @@ my @PRIVATE_NETWORKS = (
> # MARK masks
> my $NAT_MASK = 0x0f000000;
> 
> +# Country code, which is used to mark hostile networks.
> +my $HOSTILE_CCODE = "XD";
> +
> my %fwdfwsettings=();
> my %fwoptions = ();
> my %defaultNetworks=();
> @@ -97,6 +100,9 @@ if (-e "$locationfile") {
> # Get all available locations.
> my @locations = &Location::Functions::get_locations();
> 
> +# Name or the RED interface.
> +my $RED_DEV = &General::get_red_interface();
> +
> my @log_limit_options = &make_log_limit_options();
> 
> my $POLICY_INPUT_ALLOWED   = 0;
> @@ -135,6 +141,9 @@ sub main {
> 	# Load Location block rules.
> 	&locationblock();
> 
> +	# Load rules to block hostile networks.
> +	&drop_hostile_networks();
> +
> 	# Reload firewall policy.
> 	run("/usr/sbin/firewall-policy");
> 
> @@ -676,6 +685,30 @@ sub locationblock {
> 	}
> }
> 
> +sub drop_hostile_networks () {
> +	# Flush the HOSTILE firewall chain.
> +	run("$IPTABLES -F HOSTILE");
> +
> +	# If dropping hostile networks is not enabled, we are finished here.
> +	if ($fwoptions{'DROPHOSTILE'} ne "on") {
> +		# Exit function.
> +		return;
> +	}
> +
> +	# Call function to load the network list of hostile networks.
> +	&ipset_restore($HOSTILE_CCODE);
> +
> +	# Setup rules to pass traffic which does not belong to a hostile network.
> +	run("$IPTABLES -A HOSTILE -i $RED_DEV -m set ! --match-set $HOSTILE_CCODE src -j RETURN");
> +	run("$IPTABLES -A HOSTILE -o $RED_DEV -m set ! --match-set $HOSTILE_CCODE dst -j RETURN");
> +
> +	# Setup logging.
> +	run("$IPTABLES -A HOSTILE -m limit --limit 10/second -j LOG  --log-prefix \"DROP_HOSTILE \"");
> +
> +	# Drop traffic from/to hostile network.
> +        run("$IPTABLES -A HOSTILE -j DROP -m comment --comment \"DROP_HOSTILE\"");
> +}
> +
> sub get_protocols {
> 	my $hash = shift;
> 	my $key = shift;
> diff --git a/src/initscripts/system/firewall b/src/initscripts/system/firewall
> index 22e3fae59..2c4d3163b 100644
> --- a/src/initscripts/system/firewall
> +++ b/src/initscripts/system/firewall
> @@ -169,21 +169,6 @@ iptables_init() {
> 	iptables -t nat -N CUSTOMPOSTROUTING
> 	iptables -t nat -A POSTROUTING -j CUSTOMPOSTROUTING
> 
> -	# Log and drop any traffic from and to networks known as being hostile, posing
> -	# a technical threat to our users (i. e. listed at Spamhaus DROP et al.)
> -	iptables -N HOSTILE
> -	if [ "$DROPHOSTILE" == "on" ]; then
> -		# Call ipset and load the list which contains the hostile networks.
> -		ipset restore < $IPSET_DB_DIR/CC_XD.ipset4
> -
> -		iptables -A HOSTILE -m limit --limit 10/second -j LOG  --log-prefix "DROP_HOSTILE "
> -		iptables -A INPUT   -i $IFACE -m set --match-set CC_XD src -j HOSTILE
> -		iptables -A FORWARD -i $IFACE -m set --match-set CC_XD src -j HOSTILE
> -		iptables -A FORWARD -o $IFACE -m set --match-set CC_XD dst -j HOSTILE
> -		iptables -A OUTPUT  -o $IFACE -m set --match-set CC_XD src -j HOSTILE
> -	fi
> -	iptables -A HOSTILE -j DROP -m comment --comment "DROP_HOSTILE"
> -
> 	# IPS (Guardian) chains
> 	iptables -N GUARDIAN
> 	iptables -A INPUT -j GUARDIAN
> @@ -274,6 +259,14 @@ iptables_init() {
> 		iptables -A OUTPUT -o "${BLUE_DEV}" -j DHCPBLUEOUTPUT
> 	fi
> 
> +	# Chains for networks known as being hostile, posing a technical threat to our users
> +	# (i. e. listed at Spamhaus DROP et al.)
> +	iptables -N HOSTILE
> +	iptables -A INPUT -i $IFACE -j HOSTILE
> +	iptables -A FORWARD -i $IFACE -j HOSTILE
> +	iptables -A FORWARD -o $IFACE -j HOSTILE
> +	iptables -A OUTPUT -o $IFACE -j HOSTILE
> +
> 	# Tor (inbound)
> 	iptables -N TOR_INPUT
> 	iptables -A INPUT -j TOR_INPUT
> -- 
> 2.30.2
>
  

Patch

diff --git a/config/firewall/rules.pl b/config/firewall/rules.pl
index 7a7c8ed31..b12764d18 100644
--- a/config/firewall/rules.pl
+++ b/config/firewall/rules.pl
@@ -59,6 +59,9 @@  my @PRIVATE_NETWORKS = (
 # MARK masks
 my $NAT_MASK = 0x0f000000;
 
+# Country code, which is used to mark hostile networks.
+my $HOSTILE_CCODE = "XD";
+
 my %fwdfwsettings=();
 my %fwoptions = ();
 my %defaultNetworks=();
@@ -97,6 +100,9 @@  if (-e "$locationfile") {
 # Get all available locations.
 my @locations = &Location::Functions::get_locations();
 
+# Name or the RED interface.
+my $RED_DEV = &General::get_red_interface();
+
 my @log_limit_options = &make_log_limit_options();
 
 my $POLICY_INPUT_ALLOWED   = 0;
@@ -135,6 +141,9 @@  sub main {
 	# Load Location block rules.
 	&locationblock();
 
+	# Load rules to block hostile networks.
+	&drop_hostile_networks();
+
 	# Reload firewall policy.
 	run("/usr/sbin/firewall-policy");
 
@@ -676,6 +685,30 @@  sub locationblock {
 	}
 }
 
+sub drop_hostile_networks () {
+	# Flush the HOSTILE firewall chain.
+	run("$IPTABLES -F HOSTILE");
+
+	# If dropping hostile networks is not enabled, we are finished here.
+	if ($fwoptions{'DROPHOSTILE'} ne "on") {
+		# Exit function.
+		return;
+	}
+
+	# Call function to load the network list of hostile networks.
+	&ipset_restore($HOSTILE_CCODE);
+
+	# Setup rules to pass traffic which does not belong to a hostile network.
+	run("$IPTABLES -A HOSTILE -i $RED_DEV -m set ! --match-set $HOSTILE_CCODE src -j RETURN");
+	run("$IPTABLES -A HOSTILE -o $RED_DEV -m set ! --match-set $HOSTILE_CCODE dst -j RETURN");
+
+	# Setup logging.
+	run("$IPTABLES -A HOSTILE -m limit --limit 10/second -j LOG  --log-prefix \"DROP_HOSTILE \"");
+
+	# Drop traffic from/to hostile network.
+        run("$IPTABLES -A HOSTILE -j DROP -m comment --comment \"DROP_HOSTILE\"");
+}
+
 sub get_protocols {
 	my $hash = shift;
 	my $key = shift;
diff --git a/src/initscripts/system/firewall b/src/initscripts/system/firewall
index 22e3fae59..2c4d3163b 100644
--- a/src/initscripts/system/firewall
+++ b/src/initscripts/system/firewall
@@ -169,21 +169,6 @@  iptables_init() {
 	iptables -t nat -N CUSTOMPOSTROUTING
 	iptables -t nat -A POSTROUTING -j CUSTOMPOSTROUTING
 
-	# Log and drop any traffic from and to networks known as being hostile, posing
-	# a technical threat to our users (i. e. listed at Spamhaus DROP et al.)
-	iptables -N HOSTILE
-	if [ "$DROPHOSTILE" == "on" ]; then
-		# Call ipset and load the list which contains the hostile networks.
-		ipset restore < $IPSET_DB_DIR/CC_XD.ipset4
-
-		iptables -A HOSTILE -m limit --limit 10/second -j LOG  --log-prefix "DROP_HOSTILE "
-		iptables -A INPUT   -i $IFACE -m set --match-set CC_XD src -j HOSTILE
-		iptables -A FORWARD -i $IFACE -m set --match-set CC_XD src -j HOSTILE
-		iptables -A FORWARD -o $IFACE -m set --match-set CC_XD dst -j HOSTILE
-		iptables -A OUTPUT  -o $IFACE -m set --match-set CC_XD src -j HOSTILE
-	fi
-	iptables -A HOSTILE -j DROP -m comment --comment "DROP_HOSTILE"
-
 	# IPS (Guardian) chains
 	iptables -N GUARDIAN
 	iptables -A INPUT -j GUARDIAN
@@ -274,6 +259,14 @@  iptables_init() {
 		iptables -A OUTPUT -o "${BLUE_DEV}" -j DHCPBLUEOUTPUT
 	fi
 
+	# Chains for networks known as being hostile, posing a technical threat to our users
+	# (i. e. listed at Spamhaus DROP et al.)
+	iptables -N HOSTILE
+	iptables -A INPUT -i $IFACE -j HOSTILE
+	iptables -A FORWARD -i $IFACE -j HOSTILE
+	iptables -A FORWARD -o $IFACE -j HOSTILE
+	iptables -A OUTPUT -o $IFACE -j HOSTILE
+
 	# Tor (inbound)
 	iptables -N TOR_INPUT
 	iptables -A INPUT -j TOR_INPUT