ipfw/ipfw3 - Add pre-load sysctl to default filter to accept
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 13 Mar 2015 01:08:56 +0000 (18:08 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 13 Mar 2015 01:12:24 +0000 (18:12 -0700)
* Add sysctl and tunable 'net.filters_default_to_accept', which defaults
  to off.  If this variable is set to non-zero prior to loading the ipfw
  or ipfw3 modules, IPFW will default to allowing all packets through instead
  of denying all packets.

* It is necessary to use this feature for netbooted systems with NFS roots
  as the system will not be able to load the rules table after kldloading
  the related module(s) otherwise.

sys/net/ipfw/ip_fw2.c
sys/net/ipfw3/ip_fw3.c
sys/net/pfil.c
sys/net/pfil.h

index 0afc943..12455ea 100644 (file)
@@ -4378,7 +4378,10 @@ ipfw_ctx_init_dispatch(netmsg_t nmsg)
 #ifdef IPFIREWALL_DEFAULT_TO_ACCEPT
        def_rule->cmd[0].opcode = O_ACCEPT;
 #else
-       def_rule->cmd[0].opcode = O_DENY;
+       if (filters_default_to_accept)
+               def_rule->cmd[0].opcode = O_ACCEPT;
+       else
+               def_rule->cmd[0].opcode = O_DENY;
 #endif
 
        def_rule->refcnt = 1;
index 7a513a4..357a15a 100644 (file)
@@ -1906,7 +1906,10 @@ ipfw_ctx_init_dispatch(netmsg_t nmsg)
 #ifdef IPFIREWALL_DEFAULT_TO_ACCEPT
        def_rule->cmd[0].opcode = O_BASIC_ACCEPT;
 #else
-       def_rule->cmd[0].opcode = O_BASIC_DENY;
+       if (filters_default_to_accept)
+               def_rule->cmd[0].opcode = O_BASIC_ACCEPT;
+       else
+               def_rule->cmd[0].opcode = O_BASIC_DENY;
 #endif
 
        /* Install the default rule */
index 5160a5d..8353f9c 100644 (file)
@@ -37,6 +37,7 @@
 #include <sys/systm.h>
 #include <sys/proc.h>
 #include <sys/queue.h>
+#include <sys/sysctl.h>
 
 #include <net/if.h>
 #include <net/pfil.h>
@@ -92,6 +93,12 @@ static struct packet_filter_hook *
 static void            pfil_remove_hook_dispatch(netmsg_t);
 static void            pfil_add_hook_dispatch(netmsg_t);
 
+int filters_default_to_accept = 0;
+SYSCTL_INT(_net, OID_AUTO, filters_default_to_accept, CTLFLAG_RW,
+    &filters_default_to_accept, 0,
+    "cause ipfw* modules to not block by default");
+TUNABLE_INT("net.filters_default_to_accept", &filters_default_to_accept);
+
 /*
  * pfil_run_hooks() runs the specified packet filter hooks.
  */
index 0265d90..e99801d 100644 (file)
@@ -83,6 +83,8 @@ int   pfil_head_unregister(struct pfil_head *);
 
 struct pfil_head *pfil_head_get(int, u_long);
 
+extern int filters_default_to_accept;
+
 /*
  * Used for a quick shortcut around the pfil routines if no hooks have been
  * installed.