[Chilli] [Layer3] Like uamallowed, but for source address - like macallowed but for IPs - ip source whitelist - server whitelist

Michele Bergonzoni bergonz at labs.it
Wed Nov 27 18:07:35 UTC 2013


In a Layer3 environment where there are servers and "special" devices in 
the same network as the guests, you might need to whitelist some source IPs.

I found no usable solution for this (an old thread in this list ends 
with a cron job that uses chilli_query, something that is not quite 
perfect), so I wrote the following. It defines a new configuration 
parameter and command-line switch ipsrcallowed, that you can control in 
chilli/config with HS_IPSRCALLOWED, with the same syntax as uamallowed: 
comma separated list of single IP addresses or IP prefixes (also domain 
names, but that is not intended to work nor tested and will probably break).

Clients with IPs in that list will not be redirected. Sessions will not 
be created, so you will not see them in "chilli_query list".

This patch is relative to current SVN, with EDNS and previous patch applied.

My first try was with a layer3 version of macauth, to query a RADIUS 
server with the IP address before redirecting, but it was too hard 
(Coovachilli in my opinion would benefit from some refactoring). If 
someone knows how to do that, please tell.

Regards,
				Bergonz

Index: conf/functions.in
===================================================================
--- conf/functions.in   (revision 485)
+++ conf/functions.in   (working copy)
@@ -179,6 +179,9 @@
      HS_UAMALLOW=$(echo $HS_UAMALLOW|sed 's/ /,/g')
      uamallow=${HS_UAMALLOW:+",$HS_UAMALLOW"}

+    HS_IPSRCALLOWED=$(echo $HS_IPSRCALLOWED|sed 's/ /,/g')
+    addconfig1 ${HS_IPSRCALLOWED:+"ipsrcallowed $HS_IPSRCALLOWED"}
+
      addconfig1 ${HS_MAXCLIENTS:+"maxclients $HS_MAXCLIENTS"}
      addconfig1 ${HS_RADIUSQSIZE:+"radiusqsize $HS_RADIUSQSIZE"}
      addconfig1 ${HS_DHCPHASHSIZE:+"dhcphashsize $HS_DHCPHASHSIZE"}
Index: src/options.h
===================================================================
--- src/options.h       (revision 485)
+++ src/options.h       (working copy)
@@ -302,6 +302,11 @@
    uint32_t regex_num_pass_throughs;
  #endif

+#ifdef ENABLE_LAYER3
+  pass_through ipsrc_pass_throughs[MAX_IPSRC_PASS_THROUGHS];
+  uint32_t ipsrc_num_pass_throughs;
+#endif
+
    char* uamdomains[MAX_UAM_DOMAINS];
    int uamdomain_ttl;

Index: src/cmdline.ggo
===================================================================
--- src/cmdline.ggo     (revision 485)
+++ src/cmdline.ggo     (working copy)
@@ -266,6 +266,7 @@
  option "uamdomainfile" - "Load uamdomains (regex) from file" string no

  option "layer3" - "Layer3 only" flag off
+option "ipsrcallowed"  - "List of allowed source IP addresses, for 
Layer3" string no multiple
  option "patricia" - "Use patricia tries for walled garden lookup" flag off
  option "redirdnsreq" - "Send DNS query on redirect to pick of DNS 
based walled garden" flag off

Index: src/dhcp.c
===================================================================
--- src/dhcp.c  (revision 485)
+++ src/dhcp.c  (working copy)
@@ -2503,6 +2503,23 @@
      found = 1;
  #endif

+#ifdef ENABLE_LAYER3
+  if (!found && _options.ipsrc_pass_throughs){
+    if (garden_check(_options.ipsrc_pass_throughs,
+                       &_options.ipsrc_num_pass_throughs, &pt,
+                       ipph, !dst
+#ifdef HAVE_PATRICIA
+                       , 0
+#endif
+                       )) {
+      found = 1;
+#if(_debug_ > 1)
+      log_dbg("Packet matches ipsrcallowed");
+#endif
+    }
+  }
+#endif
+
  #ifdef ENABLE_GARDENACCOUNTING
    if (_options.uamgardendata) {


Index: src/main-opt.c
===================================================================
--- src/main-opt.c      (revision 485)
+++ src/main-opt.c      (working copy)
@@ -724,6 +724,18 @@
  #endif
        );
    }
+#ifdef ENABLE_LAYER3
+  for (numargs = 0; numargs < args_info.ipsrcallowed_given; ++numargs) {
+    pass_throughs_from_string(_options.ipsrc_pass_throughs,
+                             MAX_IPSRC_PASS_THROUGHS,
+                             &_options.ipsrc_num_pass_throughs,
+                             args_info.ipsrcallowed_arg[numargs], 0, 0
+#ifdef HAVE_PATRICIA
+                             , 0
+#endif
+      );
+  }
+#endif

    _options.uamauthedallowed = args_info.uamauthedallowed_flag;
  #ifdef ENABLE_AUTHEDALLOWED
Index: src/chilli_limits.h
===================================================================
--- src/chilli_limits.h (revision 485)
+++ src/chilli_limits.h (working copy)
@@ -134,4 +134,12 @@
  #define RADIUS_QUEUE_PACKET_PTR 1
  #endif

+#ifdef ENABLE_LAYER3
+#ifdef ENABLE_LARGELIMITS
+#define MAX_IPSRC_PASS_THROUGHS               512 /* Max number of 
allowed IP source addresses, for Layer3 */
+#else
+#define MAX_IPSRC_PASS_THROUGHS               8 /* Max number of 
allowed IP source addresses, for Layer3 */
  #endif
+#endif
+
+#endif



More information about the Chilli mailing list