]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/misc-progs/wirelessctrl.c
Merge branch 'master' into fifteen
[people/teissler/ipfire-2.x.git] / src / misc-progs / wirelessctrl.c
index 51f3f254d20e4ad6776fb6229479014d4d874212..e3a1107c2bff927bb2aa6e6b4d49bcb0e51ff8db 100644 (file)
@@ -4,8 +4,6 @@
  * Licence.  See the file COPYING for details.
  *
  * (c) Alan Hourihane, 2003
- * 
- * $Id: wirelessctrl.c,v 1.2.2.5 2005/07/11 10:56:47 franck78 Exp $
  *
  */
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <signal.h>
+#include <errno.h>
+
 #include "setuid.h"
+#include "netutil.h"
 
 FILE *fd = NULL;
 char blue_dev[STRING_SIZE] = "";
 char command[STRING_SIZE];
 
-void exithandler(void)
-{
-       if(strlen(blue_dev))
-       {
-               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -j LOG_DROP", blue_dev);
+void exithandler(void) {
+       /* added comment mark to the drop rules to be able to collect the bytes by the collectd */
+       if (strlen(blue_dev) > 0) {
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -j DROP -m comment --comment 'DROP_Wirelessinput'", blue_dev);
                safe_system(command);
-               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -j LOG_DROP", blue_dev);
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -j DROP -m comment --comment 'DROP_Wirelessforward'", blue_dev);
                safe_system(command);
        }
 
@@ -38,8 +38,7 @@ void exithandler(void)
                fclose(fd);
 }
 
-int main(void)
-{
+int main(void) {
        char green_dev[STRING_SIZE] = "";
        char buffer[STRING_SIZE];
        char *index, *ipaddress, *macaddress, *enabled;
@@ -58,49 +57,74 @@ int main(void)
        kv=initkeyvalues();
 
        /* Read in the current values */
-       if (!readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings"))
-       {
+       if (!readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings")) {
                fprintf(stderr, "Cannot read ethernet settings\n");
                exit(1);
        }
 
-       /* Get the GREEN interface details */
-       if(!findkey(kv, "GREEN_DEV", green_dev))
-       {
-               fprintf(stderr, "Cannot read GREEN_DEV\n");
+       /* Read in the firewall values */
+       if (!readkeyvalues(kv, CONFIG_ROOT "/optionsfw/settings")) {
+               fprintf(stderr, "Cannot read optionsfw settings\n");
                exit(1);
        }
-       if (!VALID_DEVICE(green_dev))
-       {
-               fprintf(stderr, "Bad GREEN_DEV: %s\n", green_dev);
-               exit(1);
+
+       /* Get the GREEN interface details */
+       if (findkey(kv, "GREEN_DEV", green_dev) > 0) {
+               if (!VALID_DEVICE(green_dev)) {
+                       fprintf(stderr, "Bad GREEN_DEV: %s\n", green_dev);
+                       exit(1);
+               }
        }
+
        /* Get the BLUE interface details */
-       if(!findkey(kv, "BLUE_DEV", blue_dev))
-       {
-               fprintf(stderr, "Cannot read BLUE_DEV\n");
-               exit(1);
-       }
-       if (strlen(blue_dev) && !VALID_DEVICE(blue_dev))
-       {
-               fprintf(stderr, "Bad BLUE_DEV: %s\n", blue_dev);
-               exit(1);
+       if (findkey(kv, "BLUE_DEV", blue_dev) > 0) {
+               if ((strlen(blue_dev) > 0) && !VALID_DEVICE(blue_dev)) {
+                       fprintf(stderr, "Bad BLUE_DEV: %s\n", blue_dev);
+                       exit(1);
+               }
        }
-       if(! strlen(blue_dev) > 0)
-       {
-               fprintf(stderr, "No BLUE interface\n");
+
+       if (strlen(blue_dev) == 0) {
                exit(0);
        }
 
+       if ((fd = fopen(CONFIG_ROOT "/wireless/nodrop", "r")))
+               return 0;
+
        /* register exit handler to ensure the block rule is always present */
        atexit(exithandler);
 
-       if (!(fd = fopen(CONFIG_ROOT "/wireless/config", "r")))
-       {
+       if (!(fd = fopen(CONFIG_ROOT "/wireless/config", "r"))) {
                exit(0);
        }
-       while (fgets(buffer, STRING_SIZE, fd))
-       {
+
+       /* restrict blue access tp the proxy port */
+       if (findkey(kv, "DROPPROXY", buffer) && strcmp(buffer, "on") == 0) {
+               /* Read the proxy values */
+               if (!readkeyvalues(kv, CONFIG_ROOT "/proxy/settings") || !(findkey(kv, "PROXY_PORT", buffer))) {
+                       fprintf(stderr, "Cannot read proxy settings\n");
+                       exit(1);
+               }
+
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -p tcp  ! --dport %s -j DROP -m comment --comment 'DROP_Wirelessforward'", blue_dev, buffer);
+               safe_system(command);
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -p tcp  ! --dport %s -j DROP -m comment --comment 'DROP_Wirelessinput'", blue_dev, buffer);
+               safe_system(command);
+       }
+
+       /* not allow blue to acces a samba server running on local fire*/
+       if (findkey(kv, "DROPSAMBA", buffer) && strcmp(buffer, "on") == 0) {
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -p tcp -m multiport --ports 135,137,138,139,445,1025 -j DROP -m comment --comment 'DROP_Wirelessforward'", blue_dev);
+               safe_system(command);
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -p tcp -m multiport --ports 135,137,138,139,445,1025 -j DROP -m comment --comment 'DROP_Wirelessinput'", blue_dev);
+               safe_system(command);
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -p udp -m multiport --ports 135,137,138,139,445,1025 -j DROP -m comment --comment 'DROP_Wirelessforward'", blue_dev);
+               safe_system(command);
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -p udp -m multiport --ports 135,137,138,139,445,1025 -j DROP -m comment --comment 'DROP_Wirelessinput'", blue_dev);
+               safe_system(command);
+       }
+
+       while (fgets(buffer, STRING_SIZE, fd)) {
                buffer[strlen(buffer) - 1] = 0;
 
                index = strtok(buffer, ",");
@@ -108,40 +132,43 @@ int main(void)
                macaddress = strtok(NULL, ",");
                enabled = strtok(NULL, ",");
 
-               if (!strncmp(enabled, "on", 2)) {
-               
+               if (strcmp(enabled, "on") == 0) {
                        /* both specified, added security */
-                       if ((strlen(macaddress) == 17) && 
-                           (VALID_IP(ipaddress))) {
+                       if ((strlen(macaddress) == 17) && (VALID_IP_AND_MASK(ipaddress))) {
                                snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -m mac --mac-source %s -s %s -i %s -j ACCEPT", macaddress, ipaddress, blue_dev);
                                safe_system(command);
-                               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -s %s -i %s -o ! %s -j ACCEPT", macaddress, ipaddress, blue_dev, green_dev);
-                               safe_system(command);
-                               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -s %s -i %s -j DMZHOLES", macaddress, ipaddress, blue_dev);
+                               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -s %s -i %s -j RETURN", macaddress, ipaddress, blue_dev);
                                safe_system(command);
                        } else {
-
                                /* correctly formed mac address is 17 chars */
                                if (strlen(macaddress) == 17) {
                                        snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -m mac --mac-source %s -i %s -j ACCEPT", macaddress, blue_dev);
                                        safe_system(command);
-                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -i %s -o ! %s -j ACCEPT", macaddress, blue_dev, green_dev);
-                                       safe_system(command);
-                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -i %s -j DMZHOLES", macaddress, blue_dev);
+                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -m mac --mac-source %s -i %s -j RETURN", macaddress, blue_dev);
                                        safe_system(command);
                                }
 
-                               if (VALID_IP(ipaddress)) {
+                               if (VALID_IP_AND_MASK(ipaddress)) {
                                        snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -s %s -i %s -j ACCEPT", ipaddress, blue_dev);
                                        safe_system(command);
-                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -s %s -i %s -o ! %s -j ACCEPT", ipaddress, blue_dev, green_dev);
-                                       safe_system(command);
-                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -s %s -i %s -j DMZHOLES", ipaddress, blue_dev);
+                                       snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -s %s -i %s -j RETURN", ipaddress, blue_dev);
                                        safe_system(command);
                                }
                        }
                }
        }
 
+       /* with this rule you can disable the logging of the dropped wireless input packets*/
+       if (findkey(kv, "DROPWIRELESSINPUT", buffer) && strcmp(buffer, "on") == 0) {
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSINPUT -i %s -j LOG --log-prefix 'DROP_Wirelessinput'", blue_dev);
+               safe_system(command);
+       }
+
+       /* with this rule you can disable the logging of the dropped wireless forward packets*/
+       if (findkey(kv, "DROPWIRELESSFORWARD", buffer) && strcmp(buffer, "on") == 0) {
+               snprintf(command, STRING_SIZE-1, "/sbin/iptables -A WIRELESSFORWARD -i %s -j LOG --log-prefix 'DROP_Wirelessforward'", blue_dev);
+               safe_system(command);
+       }
+
        return 0;
 }