A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Filtragem de pacotes no Linux 2.4

Qui

26

Abr

2007


17:47

(3 votos, média 3.67 de 5) 


Especificações do alvo

Agora que sabemos como examinar pacotes, precisamos de um método para dizer o que fazer com os pacotes localizados pelos testes. Isto é chamado de alvo da regra.

Existem dois alvos internos muito simples: DROP e ACCEPT. Já tivemos o prazer de conhecê-los. Se a regra flagrar um pacote e seu alvo é um destes dois, nenhuma outra regra será consultada: o destino do pacote está selado smile

Existem outros dois tipos de alvo diferentes dos internos: extensões e cadeias definidas pelo usuário.

Cadeias definidas pelo usuário

Uma das características mais poderosas que o iptables herdou do ipchains é a possibilidade do usuário criar cadeias para ampliar as cadeias básicas INPUT, FORWARD e OUTPUT. Convencionou-se que as cadeias definidas pelo usuário recebam nomes em letras minúsculas para deferenciá-las (a criação de novas cadeias definidas pelo usuário será descrita em 'Operações em Toda uma Cadeia').

Quando um pacote atende uma regra cujo alvo é uma cadeia definida pelo usuário, este pacote começa a atravessar as regras da cadeia definida pelo usuário. Se esta cadeia não decidir o que deve ser feito com ele, quando a ela tiver sido percorrida, a travessia continua na próxima regra da cadeia que a acionou.

Mais um pouquinho de arte ASCII. Considere duas cadeias (bobinhas): INPUT e teste (uma cadeia definida pelo usuário):

         `INPUT'                         `teste'
        ----------------------------    ----------------------------
        | Regra1: -p ICMP -j DROP   |    | Regra1: -s 192.168.1.1    |
        |---------------------------|    |---------------------------|
        | Regra2: -p TCP -j teste   |    | Regra2: -d 192.168.1.1    |
        |---------------------------|    ----------------------------
        | Regra3: -p UDP -j DROP    |
        ----------------------------

Imagine um pacote TCP chegando de 192.168.1.1, indo para 1.2.3.4. Ele entra na cadeia INPUT e é testado pela Regra1 - passa. A Regra2 se aplica e seu alvo é 'teste', portanto a próxima regra aplicada é o início de 'teste'. A Regra1 em teste se aplica, mas não indica o alvo - como não há um alvo especificado, a próxima regra é aplicada. A Regra2 de teste não se aplica e o pacote chega no fim da cadeia. Retorna então à cadeia INPUT, onde a Regra2 acabou de atuar. Segue então para a Regra3, que também não se aplica.

O caminho do pacote foi:

                                v    __________________________
         `INPUT'                |   /    `teste'               v
        ----------------------|--/    -----------------------|----
        | Regra1                | /|    | Regra1               |   |
        |-----------------------|/-|    |----------------------|---|
        | Regra2                /  |    | Regra2               |   |
        |--------------------------|    -----------------------v----
        | Regra3                /--+___________________________/
        ------------------------|---
                                v

Cadeias definidas pelo usuário podem saltar para outras cadeias definidas pelo usuário (mas não fazem loops: o pacote será descartado se for encontrado num loop).

Extensões do iptables: novos Alvos

Um outro tipo de extensão é um alvo. Uma extensão de alvo é um módulo do kernel e uma extensão opcional do iptables que fornece novas opcções de linha de comando. Existem várias extensões na distribuição default do netfilter:

  • LOG: este módulo possibilita que o kernel faça log de pacotes selecionados. Ele fornece as seguintes opções adicionais:
    --log-level: seguida por um nível numérico ou um nome. Nomes válidos são (em maiúsculo ou minúsculo) 'debug', 'info', 'notice', 'warning', 'err', 'crit', 'alert' e 'emerg', correspondendo aos números de 7 até 0. Veja a página man syslog.conf para explicações sobre estes níveis. O default é 'warning'.
    --log-prefix: seguida por uma string de até 29 caracteres, esta mensagem é enviada no início da mensagem de log para que o log possa ser identificado.
    Este módulo tem maior utilidade depois que um limite é atingido - serve para impedir que os arquivos de log inchem demais.
  • REJECT: este módulo atua da mesma forma que o DROP, só que o remetente recebe uma mensagem de erro de porta não alcançável (port unreachable). Saiba que a mensagem de erro ICMP não é enviada se (veja a RFC 1122):
    • O pacote filtrado era uma mensagem de erro ICMP ou de um tipo ICMP desconhecido.
    • O pacote filtrado era um fragmento sem cabeçalho.
    • Mensagens de erro ICMP foram enviadas em número excessivo para este destino recentemente (veja /proc/sys/net/ipv4/icmp_ratelimit).
    REJECT também pode ter o argumento opcional `--reject-with', o qual altera o pacote de resposta usado (veja a página do manual).
Alvos internos especiais

Existem dois alvos internos especiais: RETURN e QUEUE.

RETURN tem o mesmo efeito que chegar ao fim de uma cadeia: para uma regra de uma cadeia interna a política da cadeia é executada. Para uma regra de uma cadeia definida pelo usuário, a travessia continua pela cadeia anterior logo depois da regra que gerou o salto para esta cadeia.

QUEUE é um alvo especial que coloca o pacote numa fila para processamento no espaço do usuário. Para que seja útil, dois componentes adicionais são requeridos:

  • um manipulador de fila (queue handler) que trata da mecânica da passagem de pacotes entre o kernel e o espaço do usuário e
  • um aplicativo no espaço do usuário para receber, possivelmente manipular e determinar o veredito dos pacotes.

O manipulador de fila padrão para o iptables IPv4 é o módulo ip_queue, distribuído juntamente com o kernel e marcado como experimental.

O seguinte é um exemplo rápido de como usar iptables para colocar pacotes na fila para processamento no espaço do usuário:

    # modprobe iptable_filter
    # modprobe ip_queue
    # iptables -A OUTPUT -p icmp -j QUEUE

Com esta regra, os pacotes ICMP de saída gerados localmente (como os criados, digamos, pelo ping) são passados pelo módulo ip_queue que tenta entregá-los para o espaço do usuário. Se não houver um aplicativo esperando por eles, os pacotes são descartados.

Para criar um aplicativo para o espaço do usuário, use a API libipq. Ela é distribuída com o iptables. Exemplos de código podem ser encontrados nas ferramentas testsuite (por exemplo, redirect.c) no CVS.

O status do ip_queue pode ser checado através de

    /proc/net/ip_queue

O comprimento máximo da fila (isto é, o número de pacotes entregues ao espaço do usuário sem que seja dado um veredito) pode ser controlado através de

    /proc/sys/net/ipv4/ip_queue_maxlen

O valor default do comprimento máximo da fila é 1024. Quando este limite é alcançado, novos pacotes serão descartados até que a fila fique novamente abaixo do limite. Protocolos simpáticos, como é o caso do TCP, interpretam pacotes descartados como congestionamento e certamente farão uma contenção quando a fila estiver entupida. Entretanto, determinar o comprimento máximo de uma fila numa determinada situação quando o valor default for muito pequeno requer algumas tentativas.

Informações adicionais