Mas, o que é um firewall? Como o próprio nome já diz, "Fire" + "Wall", ou seja, parede de fogo, onde só vai passar o que você quer.
Vamos imaginar que as informações são escritas em papel e são feitas em forma de bola, para que sua informação chegue até o destino, ela precisa passar por uma grande parede, essa parede contém algumas regras.
Sua informação será "arremessada", então a parede vai conferir suas regras, se a sua informação está na regra com a permissão de "passar", então a parede vai "abaixar" para sua informação passar, e depois vai subir.
Outro conceito válido é um pouco mais técnico, é que o firewall é um servidor que contém determinadas regras e os pacotes que contém informações serão enviados para o destino, passando por ele, se a regra conferir, dizendo que o seu pacote pode passar, então o firewall irá direcionar a sua informação para o destino.
Tendo o conceito básico de firewall, vamos avançar para a parte prática do iptables, mas antes precisamos entender como o iptables funciona.
O iptables tem chains e tables:
- Chains: Local onde as regras são armazenadas. Cada chain tem uma funcionalidade, como por exemplo o chain INPUT, que armazena pacotes que chegam a máquina, de fora para dentro.
- Tables: as tabelas armazenam os chains. Cada tabela possui uma média de 3 (três) chains. A tabela mais utilizada é a Filter, que contém apenas 3 (três) chains: INPUT, OUTPUT, FORWARD.
Os chains são os locais onde as regras são armazenadas. Existem dois tipos de chains, os embutidos e os criados pelos próprios usuários. Sim, isso mesmo! Você pode criar o seu chain, definir o nome para ele e a sua funcionalidade.
Neste artigo vamos trabalhar mais com os chains INPUT, OUTPUT e FORWARD da tabela Filter.
Veja as tabelas existentes e seus chains:
Tabela: FILTER
Descrição: É a tabela padrão, ela não precisa ser especificada na sintaxe do iptables. Chains:
- INPUT - Consultado para dados que chegam à máquina;
- OUTPUT - Consultado para dados que saem da máquina ;
- FORWARD - Consultado para dados que são redirecionados para outra interface de rede ou outra máquina.
Exemplo: iptables -A FORWARD -i eth0 -o eth2 -m pkttype --pkt-type multicast -j DROP
Tabela: NAT
Descrição: Usada para dados que geram outra conexão (masquerading, source nat, destination nat, port forwarding, proxy transparente são alguns exemplos).
Chains:
- PREROUTING - Consultado quando os pacotes precisam ser modificados logo que chegam;
- OUTPUT - Consultado quando os pacotes gerados localmente precisam ser modificados antes de serem roteados;
- POSTROUTING - Consultado quando os pacotes precisam ser modificados após o tratamento de roteamento.
Exemplo: iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth0 -j SNAT --to 200.200.217.40
Tabela: MANGLE
Descrição: Utilizada para alterações especiais de pacotes, ele trabalha com TOS (Type Of Service), faz o controle da prioridade dos pacotes.
Chains:
- INPUT - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain INPUT da tabela filter;
- FORWARD - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain FORWARD da tabela filter;
- PREROUTING - Consultado quando os pacotes precisam ser modificados antes de ser enviados para o chain PREROUTING da tabela nat;
- POSTROUTING - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain POSTROUTING da tabela nat;
- OUTPUT - Consultado quando os pacotes precisam ser modificados antes de serem enviados para o chain OUTPUT da tabela nat.
Exemplo: iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 20 -j TOS --set-tos 8
Vamos criar o nosso chain, mas antes vamos ver a sintaxe do iptables:
Sintaxe:
iptables [-t tabela] [opção] [chain] [dados] -j [ação]
Exemplo:
# iptables -t filter -A INPUT -d 192.168.1.6 -j DROP
Caso você não especifique a tabela, o iptables usa a padrão, a tabela filter, por exemplo:
# iptables -A INPUT -d 192.168.1.6 -j DROP
Criando chain
Então vamos criar o nosso próprio chain, utilizando a opção -N:iptables [-t tabela] [-N nomedochain]
Exemplo:
# iptables -t filter -N internet
Inserindo regra no novo chain "internet":
# iptables -t filter -A internet -s 192.168.0.102 -j DROP
# iptables -t filter -A INPUT -j internet
Obs.: Note que o colocamos como o "alvo".
Bem, vamos entender como um novo chain funciona, na verdade ele faz um redirecionamento, veja:
Na tabela INPUT temos apenas uma regra e agora temos a segunda regra, que é a do nosso chain:
- -s 192.168.0.102 -j DROP
- -j INTERNET -> -s 192.168.0.102 -j DROP
Então, criamos o chain internet, incluímos uma regra nele, e então adicionamos ele a outro chain, especificando-o como alvo.
Por que isso!? Bem, todo chain tem uma especificação, por exemplo, o chain INPUT aceita ou não pacotes de fora para dentro, e o nosso chain "internet" não tem função, então usamos o conhecido "pulo do gato", dizendo que ele tem a função de INPUT, incluindo ele dentro do chain INPUT.
Eu não acho correto, essa expressão "criar um chain", na verdade não estamos criando um chain com uma funcionalidade nova para o iptables na tabela que queremos, mas ele pode nos ajudar, um exemplo disso é quando temos muitas regras, criando os próprios chains faz a organização ficar ainda melhor.
Renomeando chain
Caso você tenha criado um chain e deseja renomeá-lo, podemos usar a opção -E:iptables [-t tabela] -E chain-antigo chain-novo
Exemplo:
# iptables -t filter -E internet teste
Assim, mudei o nome do chain de "internet" para "teste".
Apagando chain
Podemos apagar o chain com a opção -X:iptables [-t tabela] -X [chain]
Exemplo:
# iptables -t filter -X teste
Uma observação importante é que os chains embutidos (que já vem por default no iptables, como o INPUT, OUTPUT) não podem ser apagados pelo usuário.
No próximo passo vamos realmente entender as regras, passo a passo, então essa página serviu para que você entenda qual a funcionalidade dos chains e os ganhos que teremos ao criar o nosso próprio chain. Também precisamos entender que cada tabela possui os seus chains e note que o chain INPUT da tabela filter é diferente do INPUT da tabela mangle.
Veja a sintaxe do iptables, porque vamos começar a criar as nossas regras.
Regras e parâmetros
Agora que vimos os chains e tabelas e ainda temos a sintaxe do iptables, nos resta entender como as regras funcionam para podemos implementar as nossas próprias regras.Todas regras possuem um "alvo", existem alguns tipos de alvos que podem ser listados dessa maneira:
- ACCEPT - Aceita o pacote;
- DROP - "Dropa", ou simplesmente não aceita o pacote;
- REJECT - Rejeita o pacote, enviando uma mensagem;
- LOG - Envia uma mensagem ao syslog caso a regra confira;
- RETURN - Para o processamento do chain atual, e retorna;
- QUEUE - Passa para o processamento de programas externos.
Os alvos, ficam na última parte do "comando", ou da linha do iptables, veja:
# iptables -t filter -A INPUT -d 192.168.1.6 -j DROP
Então podemos ver que o DROP é o alvo, que tem a ação de "dropa", ou simplesmente não aceitar o pacote.
Agora, para finalizar a formação de uma regra, precisamos entender os seus parâmetros e opções.
O que são regras
Uma regra pode ser definida como o espaço para o usuário implementar o que deseja que o firewall faça, ou ainda, uma regra pode ser um comando passado ao iptables para que ele interprete e realize uma determinada ação.Obs.: As regras são armazenadas dentro dos chains e processadas na ordem que são inseridas.
Agora vamos entender os parâmetros e opções que usamos nas regras, como por exemplo:
# iptables -A INPUT -s 200.222.256.63 -j DROP
Por que esse "-s"? Por que "-A"? Vamos ver isso agora!
Adicionando regras
Opção -A:As regras são executadas em ordem "crescente", ou seja, na ordem que são inseridas. Com a opção -A a regra é inserida no final da lista de regras. Se eu tenho 4 regras e adiciono mais uma com a opção -A, a minha nova regra, será inserida na quinta posição.
Sintaxe: iptables [-t tabela] -A [chain] [dados] -j [ação]
Opção -I:
Com opção -I inserimos a regra no topo, assim, se temos 4 regras e vamos adicionar uma nova regra utilizando a opção -I, essa minha nova regra será a primeira a ser executada.
Sintaxe: iptables [-t tabela] -I [chain] [dados] -j [ação]
Listando regras
Opção -L:Com essa opção podemos listar todas as regras inseridas até o momento e podemos fazer isso de várias maneiras, exibindo o número de cada regra, exibindo o endereço das máquinas e muito mais.
Opções:
- -v - Exibe mais detalhes sobre as regras criadas nos chains;
- -n - Exibe endereços de máquinas/portas como números;
- -x - Exibe números exatos. Mostra a faixa de portas de uma regra;
- --line-numbers - Exibe o número da posição da regra.
Sintaxe: iptables [-t tabela] -L [chain] [opções]
Exemplo:
# iptables -t filter -L INPUT --line-numbers
Apagando uma regra
Pode apagar todas as regras usando iptables -F, porém, se queremos apagar apenas uma regra e não todas, podemos utilizar a opção -D.Opção -D:
Sintaxe:
iptables [-t tabela] -D [chain] [posição]
iptables [-t tabela] -D [chain] [dados] -j [ação]
Exemplos:
# iptables -t filter -D INPUT 1
# iptables -t filter -D INPUT -d 127.0.0.1 -j DROP
Substituindo uma regra
Podemos substituir uma regra já existente, ou seja, podemos "editar".Opção -R:
Sintaxe: iptables [-t tabela] -R [chain] [posição] [regra] -j [ação]
Exemplo:
# iptables -R INPUT 1 -d 127.0.0.1 -p icmp -j DROP
Limpando uma regra
Aprendemos a deletar uma única regra, mas podemos limpar todas as regras de um chain utilizando a opção -F.Opção -F:
Sintaxe: iptables [-t tabela] -F [chain]
Exemplo:
# iptables -F (como não foi especificado a tabela, ele irá limpar as regras da tabela filter)
# iptables -t filter -F INPUT
Parâmetros
Parâmetro -s:Usado para especificar endereços de origem. Também é usado como --src ou --source.
Parâmetro -d:
Usado para especificar endereços de destino. Também usado como --dst e --destination
Exemplo:
# iptables -t filter -A INPUT -s 192.168.0.104 -d 192.168.0.102 -p icmp -j DROP
Parâmetro -i:
Usado para especificar a interface de entrada.
Parâmetro -o:
Usado para especificar a interface de saída
Exemplo:
# iptables -t filter -A INPUT -s 192.168.0.104 -i ppp+ -j DROP
Exemplo2:
# iptables -A FORWARD -i ppp0 -o eth1 -j DROP
Obs.: O sinal de "+" funciona como um coringa, assim a regra terá efeito em qualquer interface de ppp0 a ppp9.
Parâmetro -p:
Usado para especificar um protocolo. Podem ser especificados os procolos TCP, UDP e ICMP.
Exemplo:
# iptables -A INPUT -s 192.168.0.104 -p icmp -j DROP
Parâmetro --dport:
Especifica uma porta ou faixa de portas de destino.
Exemplo:
# iptables -A OUTPUT -d 200.200.200.200 -p tcp --dport :1023 -j DROP
IP Masquerade, SNAT e DNAT
O IP Masquerading é um tipo especial de SNAT usado para conectar a sua rede interna a internet quando você recebe um IP dinâmico de seu provedor (como em conexões ppp).Exemplo:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
Obs.: Todas as operações de IP Masquerading são realizadas no chain POSTROUTING.
DNAT (Destination nat - nat no endereço de destino) consiste em modificar o endereço de destino das máquinas clientes. O destination nat é muito usado para fazer redirecionamento de pacotes, proxys transparentes e balanceamento de carga.
Exemplo:
# iptables -t nat -A PREROUTING -s 200.200.217.40 -i eth0 -j DNAT --to 192.168.1.2
Obs.: Toda operação de DNAT é feita no chain PREROUTING.
SNAT (source nat - nat no endereço de origem) consiste em modificar o endereço de origem das máquinas clientes antes dos pacotes serem enviados. A máquina roteadora é inteligente o bastante para lembrar dos pacotes modificados e reescrever os endereços assim que obter a resposta da máquina de destino, direcionando os pacotes ao destino correto.
Exemplo:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 200.200.217.40-200.200.217.50
Obs.: SNAT faz a operação inversa do DNAT.
Agradecimentos e referências
Todo o texto desse artigo foi extraído do meu trabalho "Segurança com iptables", apresentado no Debian festival 4.0 em Maceió - AL.Todo o material foi feito baseado na referência:
Qualquer leitor que tiver dúvida, pode ler o Guia Foca Linux (link acima) ou pode perguntar, que logo que possível irei responder.
Espero ter esclarecido algumas dúvidas sobre o iptables e o conceito de firewall.
2 comentários:
Gueri Gueri Down!
como eu assino o feed rss do teu blog ? me manda o link ?
Postar um comentário