SharpKnocking.NetfilterFirewall es el namespace donde están todas las clases que he realizado para interactual con iptables.

El siguiente fragmento de código es usado para insertar al principio de la cadena input una regla que redirija todos los paquetes a una cadena llamada SharpKnocking-INPUT donde están las reglas que aceptarín o denegarán el paquete en función de si le hemos dado acceso o no. Es un ejemplo de como usar la librería para alterar las reglas del firewall.

            //Create rule for adding a new chain
            NetfilterRule rule = new NetfilterRule();
           
            //Create new chain command
            NewChainCommand cmd = new NewChainCommand();
            cmd.ChainName = this.chainName;
           
            //Set in the rule
            rule.Command = cmd;
           
            //Execute
            FirewallManager.instance.ApplyRule(rule);
            //Execute in default table named filter
            this.ruleSet.ExecRule(rule);
           
            //Create insert rule to redirect INPUT packets to our chain
            rule = new NetfilterRule();
           
            //Create insert command
            InsertRuleCommand iCmd = new InsertRuleCommand();
            iCmd = new InsertRuleCommand();
            iCmd.RuleNum = 1;
            iCmd.ChainName = "INPUT";
           
            rule.Command = iCmd;
           
            //Create jump option to redirect to our chain
            JumpOption jopt = new JumpOption();
            jopt.Target = RuleTargets.CustomTarget;
            jopt.CustomTarget = CustomRuleTargets.UserDefinedChain;
            jopt.CustomTargetName = this.chainName;
            //Add to rule
            rule.Options.Add(jopt);
           
            //Execute
            FirewallManager.instance.ApplyRule(rule);
            //Execute in default table named filter
            this.ruleSet.ExecRule(rule);
           
            //Create rule
            rule = new NetfilterRule();
           
            //Create append rule command
            AppendRuleCommand acmd = new AppendRuleCommand();
            acmd.ChainName = this.chainName;
            //Set in the rule
            rule.Command = acmd;
           
            //Create option to accept loopback traffic
            InInterfaceOption inOpt = new InInterfaceOption();
            inOpt.Interface = "lo";
            //Add to rule
            rule.Options.Add(inOpt);
           
            //Create jump option with accept target
            jopt = new JumpOption();
            jopt.Target = RuleTargets.Accept;
            //Add to rule
            rule.Options.Add(jopt);
           
            //Execute
            FirewallManager.instance.ApplyRule(rule);
            //Execute in default table named filter
            this.ruleSet.ExecRule(rule);
           
            //Create rule to accept new or related connections
            rule = new NetfilterRule();
           
            //Create append rule command
            acmd = new AppendRuleCommand();
            acmd.ChainName = this.chainName;
            //set in the rule
            rule.Command = acmd;
           
            //Load state extension with -m option
            MatchExtensionOption meop = new MatchExtensionOption();
            meop.Extension = MatchExtensions.State;
            //Add to rule
            rule.Options.Add(meop);

            //The previous option causes the extension to be instantiated
            //and added. We add the parameter directly.
            rule.LoadedExtensions[meop.Extension].AddParameter(
                                                                             "state",
                                                                             "RELATED,ESTABLISHED");

            //Create jump option to ACCEPT
            jopt = new JumpOption();
            jopt.Target = RuleTargets.Accept;
            //Add to rule
            rule.Options.Add(jopt);

            //Execute
            FirewallManager.instance.ApplyRule(rule);
            //Execute in default table named filter
            this.ruleSet.ExecRule(rule);
           
            //Create rule to drop anything else
            rule = new NetfilterRule();
           
            //Create append rule command
            acmd = new AppendRuleCommand();
            acmd.ChainName = this.chainName;
            //Set in the rule
            rule.Command = acmd;
           
            //Create jump option with drop target
            jopt = new JumpOption();
            jopt.Target = RuleTargets.Drop;
            //Add to rule
            rule.Options.Add(jopt);
           
            //Execute
            FirewallManager.instance.ApplyRule(rule);
            //Execute in default table named filter
            this.ruleSet.ExecRule(rule);
 

De tal modo que al ejecutar un programa con ese trozo de código para inicializar las líneas nos quedaría el siguiente conjunto de reglas (muestro la salida del comando iptables-save):

# Generated by iptables-save v1.3.5 on Fri Mar 23 18:06:53 2007
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
: OUTPUT ACCEPT [0:0]
:SharpKnocking-INPUT - [0:0]
-A INPUT -j SharpKnocking-INPUT
-A SharpKnocking-INPUT -i lo -j ACCEPT
-A SharpKnocking-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A SharpKnocking-INPUT -j DROP
COMMIT
# Completed on Fri Mar 23 18:06:53 2007
 

Así es como vamos a dejar las reglas del cortafuegos al inicio (también podríamos conservar las existentes e insertar nuestra cadena delante de las existentes). Sobre la marcha podremos ir añadiendo las ips aceptadas antes del drop final de la cadena y puede que incluyamos la opción de insertar nuestrar reglas sin eliminar las existentes.

mangelp | General | 22 Marzo, 10:55am
rss
atom

Main

Julio 2008
Dom Lun Mar Mie Jue Vie Sab
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2

Categorías

Posts Recientes

Archivos de Blog

The mono project