Um poderoso firewall para a sua rede wireless com IP x MAC

Este firewall é dedicado exclusivamente para um provedor wireless, mas serve também para uma rede pequena de sua empresa. Além de amarrar IP ao MAC, pode restringir portas, serviços etc.

[ Hits: 41.882 ]

Por: FRANCISCO SOARES DA SILVA em 12/06/2008


Arquivo de iniciar, para e reiniciar o iptables



Para essas regras funcionarem, devemos certificar que temos o seguinte arquivo no diretório /etc/init.d/functions, sem este arquivo essas regras de iptables não funcionarão.

Criando o arquivo de iniciar:

# touch /etc/rc.d/rc.iptables
# chmod +x /etc/rc.d/rc.iptables


Segue o script:

#!/bin/sh
#
# Startup script to implement /etc/sysconfig/iptables pre-defined rules.
#
# chkconfig: 2345 08 92
#
# description: Automates a packet filtering firewall with iptables.
#
# by bero@redhat.com, based on the ipchains script:
# Script Author: Joshua Jensen <joshua@redhat.com>
#   -- hacked up by gafton with help from notting
# modified by Anton Altaparmakov <aia21@cam.ac.uk>:
# modified by Nils Philippsen <nils@redhat.de>
# modificado by Antonio Luiz <antoniol.ds@darte.com.br>
#
# config: /etc/sysconfig/iptables

# Source 'em up
. /etc/init.d/functions

IPTABLES_CONFIG=/etc/sysconfig/iptables
IPTABLES_BIN=/usr/sbin/iptables

if [ ! -x $IPTABLES_BIN ]; then
        exit 0
fi

KERNELMAJ=`uname -r | sed                   -e 's,\..*,,'`
KERNELMIN=`uname -r | sed -e 's,[^\.]*\.,,' -e 's,\..*,,'`

if [ "$KERNELMAJ" -lt 2 ] ; then
        exit 0
fi
if [ "$KERNELMAJ" -eq 2 -a "$KERNELMIN" -lt 3 ] ; then
        exit 0
fi

if  /sbin/lsmod 2>/dev/null |grep -q ipchains ; then
        # Don't do both
        exit 0
fi
iftable() {
        if fgrep -qsx $1 /proc/net/ip_tables_names; then
                $IPTABLES_BIN -t "$@"
        fi
}


start() {
        # don't do squat if we don't have the config file
        if [ -f $IPTABLES_CONFIG ]; then
            # If we don't clear these first, we might be adding to
            #  pre-existing rules.
            action $"Nivelando todas as regras do usuários - definido chains:" iptables -F
            action $"Cancelando todas as regras do usuários - definido chains:" iptables -X
            chains=`cat /proc/net/ip_tables_names 2>/dev/null`
            for i in $chains; do $IPTABLES_BIN -t $i -F; done && \
              success $"Nivelando todas as regras do usuários - definido chains:" || \
              failure $"Nivelando todas as regras do usuários - defined chains:"
            for i in $chains; do $IPTABLES_BIN -t $i -X; done && \
              success $"Cancelando todas as regras do usuários - defined chains:" || \
              failure $"Cancelando todas as regras do usuários - defined chains:"

            for i in $chains; do $IPTABLES_BIN -t $i -Z; done

            echo $"Aplicando regras do firewall dos iptables: "
                grep -v "^[[:space:]]*#" $IPTABLES_CONFIG | grep -v '^[[:space:]]*$' | /usr/sbin/iptables-restore -c && \
                    success $"Aplicando regras do firewall dos iptables:" || \
                    failure $"Aplicando regras do firewall dos iptables:"
            echo
            # Para permitir NAT e FTP através de NAT
            echo 1 > /proc/sys/net/ipv4/ip_forward 2>/dev/null
            insmod ip_nat_ftp > /dev/null 2>&1
            insmod ip_conntrack_ftp > /dev/null 2>&1
            touch /var/lock/subsys/iptables
        fi
}
stop() {
        chains=`cat /proc/net/ip_tables_names 2>/dev/null`
        for i in $chains; do $IPTABLES_BIN -t $i -F; done && \
                success $"Flushing all chains:" || \
                failure $"Flushing all chains:"
        for i in $chains; do $IPTABLES_BIN -t $i -X; done && \
                success $"Removing user defined chains:" || \
                failure $"Removing user defined chains:"
        echo -n $"Resetting built-in chains to the default ACCEPT policy:"
        iftable filter -P INPUT ACCEPT && \
           iftable filter -P OUTPUT ACCEPT && \
           iftable filter -P FORWARD ACCEPT && \
           iftable nat -P PREROUTING ACCEPT && \
           iftable nat -P POSTROUTING ACCEPT && \
           iftable nat -P OUTPUT ACCEPT && \
           iftable mangle -P PREROUTING ACCEPT && \
           iftable mangle -P OUTPUT ACCEPT && \
           success $"Resetting built-in chains to the default ACCEPT policy" || \
           failure $"Resetting built-in chains to the default ACCEPT policy"
        echo
        rm -f /var/lock/subsys/iptables
}

case "$1" in
  start)
        start
        ;;

  stop)
        stop
        ;;

  restart)
        # "restart" is really just "start" as this isn't a daemon,
        #  and "start" clears any pre-defined rules anyway.
        #  This is really only here to make those who expect it happy
        start
        ;;

  condrestart)
        [ -e /var/lock/subsys/iptables ] && start
        ;;

  status)
        tables=`cat /proc/net/ip_tables_names 2>/dev/null`
        for table in $tables; do
                echo $"Table: $table"
                $IPTABLES_BIN -t $table --list
        done
        ;;

  panic)
        echo -n $"Changing target policies to DROP: "
        iftable filter -P INPUT DROP && \
            iftable filter -P FORWARD DROP && \
            iftable filter -P OUTPUT DROP && \
            iftable nat -P PREROUTING DROP && \
            iftable nat -P POSTROUTING DROP && \
            iftable nat -P OUTPUT DROP && \
            iftable mangle -P PREROUTING DROP && \
            iftable mangle -P OUTPUT DROP && \
            success $"Changing target policies to DROP" || \
            failure $"Changing target policies to DROP"
        echo
        iftable filter -F INPUT && \
                iftable filter -F FORWARD && \
                iftable filter -F OUTPUT && \
                iftable nat -F PREROUTING && \
                iftable nat -F POSTROUTING && \
                iftable nat -F OUTPUT && \
                iftable mangle -F PREROUTING && \
                iftable mangle -F OUTPUT && \
                success $"Flushing all chains:" || \
                failure $"Flushing all chains:"
        iftable filter -X INPUT && \
                iftable filter -X FORWARD && \
                iftable filter -X OUTPUT && \
                iftable nat -X PREROUTING && \
                iftable nat -X POSTROUTING && \
                iftable nat -X OUTPUT && \
                iftable mangle -X PREROUTING && \
                iftable mangle -X OUTPUT && \
                success $"Removing user defined chains:" || \
   failure $"Removing user defined chains:"
        ;;

  save)
        echo -n $"Saving current rules to $IPTABLES_CONFIG: "
        touch $IPTABLES_CONFIG
        chmod 600 $IPTABLES_CONFIG
        /usr/sbin/iptables-save -c > $IPTABLES_CONFIG  2>/dev/null && \
          success $"Saving current rules to $IPTABLES_CONFIG" || \
          failure $"Saving current rules to $IPTABLES_CONFIG"
        echo
        ;;

  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status|panic|save}"
        exit 1
esac

exit 0

Página anterior     Próxima página

Páginas do artigo
   1. Configurando as placa de redes e rotas virtuais
   2. Criando arquivos e diretórios
   3. Script das regras do iptables
   4. Arquivo de iniciar, para e reiniciar o iptables
   5. Colocando restart automático
   6. Recapitulando, conclusão
Outros artigos deste autor

Monitoramento de pops para provedores

Leitura recomendada

Como construir um firewall de baixo custo para sua empresa (parte 2)

Utilizando a ferramenta Iptstate

IPCop Firewall - Uma ótima opção de proteção para sua rede ADSL

IPTABLES - Conceitos e aplicação

Balanceamento de link + redundância

  
Comentários
[1] Comentário enviado por elgio em 12/06/2008 - 18:20h

Pelo bem da humanidade, fico CAÇANDO estes terríveis equivocos:

# PROTEÇÃO CONTRA SYN-FLOODS
-A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

Tu ACABOU de tornar negação de serviço no teu servidor uma tarefa SUPER HIPER FÁCIL:
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7070

No mais, achei o artigo um mero despejo de configurações que se enquadram apenas no teu cenário e sem explicações do porque tu faz cada configuração (porque N interfaces virtuais por exemplo? Onde está o "Amarrando" o Mac que consta no resumo?)

Enfim...

[2] Comentário enviado por y2h4ck em 13/06/2008 - 10:11h


Concordo com Elgio (viu Elgio como não sou do contra ???rsrs).

Ficou tudo mto jogado no ar...

[3] Comentário enviado por elgio em 13/06/2008 - 10:56h

Puxa, Francisco!

Na boa, tira LOGO esta regra de Syn flood fajuta e liga syn cookie. Qualquer um MUITO FACILMENTE pode derrubar teu servidor com um simples comando:

hping3 --fast --rand-source -p 80 -S TEU-IP

Isto envia MUITO mais syns por segundo, lotando teu limit do iptables e fazendo com que o PROPRIO iptables tire teu servidor do para conexoes legitimas. E o --rand-source falsifica o Ip de origem. Além do --fast ainda tem o --flood que é ainda mais rápido, mas o --fast já é suficiente.

Cara, SYN FLOOD com sucesso só se o atacante tiver muitoas máquinas. Mas com esta idiotice do iptable bloquear, fica brincadeira de criança fazer. Fique alerta.

E y24ck: nunca te considerei do contra. Justamente o contrário, te admiro muito e li os teus artigos.

[4] Comentário enviado por fsoaress76 em 13/06/2008 - 13:07h

"elgio" sobre seu artigo ainda nao tinha visto, mais foi boa sua colocação.
quanto a amarração de ip+mac

na página "Script das regras do iptables" no final tem:



# CLIENTE_1
-A Users -m mac -s 10.100.1.2 -j RETURN --mac 00:00:ee:96:2d:8e
# CLIENTE_2
-A Users -m mac -s 10.100.2.2 -j RETURN --mac 00:15:ff:33:11:e1
# CLIENTE_3
-A Users -m mac -s 10.100.3.2 -j RETURN --mac 00:05:9e:88:55:3f
# CLIENTE_4
-A Users -m mac -s 10.100.4.2 -j RETURN --mac 00:0e:ee:aa:ee:57
#CLIENTE_5
-A Users -m mac -s 10.100.5.2 -j RETURN --mac 00:0a:22:00:44:bb

# CASO QUEIRA DEIXAR LIVRE O IP SEM AMARRAR COM A MAC
-A Users -s 10.100.6.2 -j RETURN

é bem mais simples do que outras regras que usam três linha só para liberá um ip.

[5] Comentário enviado por elgio em 13/06/2008 - 13:35h

Ok. Não tinha visto os macs porque não li todos os codigos do firewall.

Uma dica então: é sempre bom poder manter as regras iptables o minimo possível. Tu fizeste isto bem com o RETURN em uma lista separada (assim, se houverem 300 macs e um mac casar com a primeira, nao sera avaliada pelas outras 298, como acontece quando pessoas fazem isto assim:

-A FORWARD -m mac -s 10.100.5.2 --mac ! 00:0a:22:00:44:bb -j DROP
(dropando se nao for do MAC)

Ainda assim, eu acho muito mais eficiente fazer isto por ARP estatico. Porque?

porque ARP eh uma coisa que a maquina sempre fara. Como tu conhece o IP e mac, se for ESTATICO, ficara ainda MAIS RAPIDO, pois o roteador nao precisará perguntar via ARP broadcast quem é o IP:

arp -s 10.100.5.2 00:0a:22:00:44:bb

Para ARPS estaticos o roteador nunca pergunta o MAC, logo se vier do ip 10.100.5.2 com outro MAC o cara ficara OFF, pois o gateway sempre ira mapear 10.100.5.3 para 00:0a:22:00:44:bb. Eu ainda uso isto para evitar que alguns espertinhos usem ips livres:

# IP 10.100.5.55 nao esta alocado ainda!
arp -s 10.100.5.2 00:01:00:01:00:01 (arp INVALIDO)


[6] Comentário enviado por chikinho_fenix em 28/01/2009 - 19:53h

tentei entender seu artigo, mas confesso que nao achei em lugar algun referencia a esse topico

"Para essas regras funcionarem, devemos certificar que temos o seguinte arquivo no diretório /etc/init.d/functions, sem este arquivo essas regras de iptables não funcionarão"

o que conterá nesse arquivo.

[7] Comentário enviado por fsoaress76 em 28/01/2009 - 20:41h

chikinho_fenix

Este arquivo tem mais de 550 linhas nao da para colocar aqui.

mais no final ele retorna isso...

+- assim
O "OK" aparece em cor VERDE

Nivelando todas as regras do usuarios - definido chains: [ OK ]
verificando todas as regras do usuarios - definido chains: [ OK ]
Aplicando régras do firewall dos iptables: [ OK ]
firewall ativado [ OK ]

se tiver um erro diz qual é a linha, etc, etc


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts