Informática Numaboa - Linux
Filtragem de pacotes no Linux 2.4
Qui 26 Abr 2007 17:47 |
- Detalhes
- Categoria: Como fazer configurações
- Atualização: Quinta, 01 Janeiro 2009 03:06
- Autor: vovó Vicki
- Acessos: 10244
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
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).
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.