Dominando o Iptables (parte 2)
No artigo anterior entendemos como as regras de firewall são tratadas no kernel, criando uma base mais sólida para a compreensão real do Iptables. Agora vamos começar a entender como construí-las em nossos scripts.
Parte 2: Entendendo os parâmetros de filtragem
Como vimos anteriormente, usamos dois parâmetros para a filtragem dos pacotes, foram eles: "-p" para especificar o protocolo utilizado e "-s" para especificar o endereço de origem. No manual do Iptables temos uma longa versão desta parte, que vou reduzir para facilitar a leitura, dividindo em tópicos, fazendo uma pequena descrição e incluindo uma regra exemplo para melhorar o entendimento:
Usamos dois parâmetros diferentes para especificar o endereço origem e o endereço destino. São eles:
É muito importante conhecer as características de manipulação de valores aceitos pra estes parâmetros. Veja abaixo:
# iptables -A FORWARD -s 10.38.11.10 -d 10.38.5.100 -j DROP
Os pacotes de origem em 10.38.11.10 destinados a 10.38.5.100 serão descartados.
# iptables -A FORWARD -s 10.38.11.0/24 -d 10.38.5.100 -j DROP
Os pacotes de origem em 10.38.11.0 ate 10.38.11.255 destinados a 10.38.5.100 serão descartados. Podemos usar valores também como www.microsoft.com, localhost e etc nas nossas regras, veja abaixo.
# iptables -A FORWARD -d ! www.microsoft.com.br -j ACCEPT
Nesta regra usamos o "!" para realizar uma inversão desta forma todos os endereços estão liberados apenas o site da Microsoft estará proibido.
Usamos o parâmetro '-p' (ou `--protocol') para especificar o protocolo envolvido. Como exemplo temos: `TCP', `UDP' ou `ICMP', neste caso não faz diferença digitar 'UDP' ou 'udp'. Os protocolos podem ser especificados também pelo seu número, que você encontra em /etc/protocols. Vejamos:
# iptables -A FORWARD -p tcp --dport 80 -j DROP
Nesta regra temos que os pacotes relacionados com o protocolo 'tcp' e destinados à porta 80 devem ser descartados. Não se preocupe com o parâmetro '--dport'. No futuro iremos tratar dele com mais detalhes. Esta regra é muito útil quando usamos um Squid, por exemplo, para impedir que usuário acesse websites sem a configuração de proxy, obrigando ele ir pela porta 3128 (padrão) do Squid para ter acesso a websites. Veja minha dica em relação a isso com mais detalhes neste link:
Usamos dois parâmetros para manipular o fluxo dos dados pelas interfaces (eth0, eth1, etc) são eles:
O -i não pode ser utilizado com a chain OUTPUT, assim como -o não pode ser utilizado com a chain INPUT. Apenas pacotes passando pela chain FORWARD têm interfaces de entrada e saída. Vejamos:
# iptables -A FORWARD -i ! eth0 -j DROP
Nesta regra temos que os pacotes que entram pela interface eth0 serão aceitos, o mesmo não vai acontecer com todas as outras interfaces. Fiquem atentos à inversão "!". Quando queremos criar regras do Iptables para interfaces que ainda não existem, como a ppp0, fazemos da mesma forma como para as existentes, sendo que as regras só começarão a funcionar quando a interface existir. Podemos também usar a opção eth+ para aplicar as regras em todas as interfaces com uma única linha de código:
# iptables -A FORWARD -i eth+ -j DROP
Nesta regra todos os pacotes que entram pelas interfaces, eth0, eth1, eth2 e etc serão negados.
Muitas flags podem ter seus argumentos precedidos de "!" para associar-se com partes diferentes aos passados na opção. É interessante compreender bem o uso do "!" pois, na prática, ele é bastante usado. Para evitar dúvidas na compreensão de scripts firewall grandes, sempre comente seu código, pois detalhes assim podem confundir outro administrador de redes mais desatento.
Endereços
Usamos dois parâmetros diferentes para especificar o endereço origem e o endereço destino. São eles:
- -s, --source, --src: Origem;
- -d, --destination, --dst: Destino.
É muito importante conhecer as características de manipulação de valores aceitos pra estes parâmetros. Veja abaixo:
# iptables -A FORWARD -s 10.38.11.10 -d 10.38.5.100 -j DROP
Os pacotes de origem em 10.38.11.10 destinados a 10.38.5.100 serão descartados.
# iptables -A FORWARD -s 10.38.11.0/24 -d 10.38.5.100 -j DROP
Os pacotes de origem em 10.38.11.0 ate 10.38.11.255 destinados a 10.38.5.100 serão descartados. Podemos usar valores também como www.microsoft.com, localhost e etc nas nossas regras, veja abaixo.
# iptables -A FORWARD -d ! www.microsoft.com.br -j ACCEPT
Nesta regra usamos o "!" para realizar uma inversão desta forma todos os endereços estão liberados apenas o site da Microsoft estará proibido.
Protocolos
Usamos o parâmetro '-p' (ou `--protocol') para especificar o protocolo envolvido. Como exemplo temos: `TCP', `UDP' ou `ICMP', neste caso não faz diferença digitar 'UDP' ou 'udp'. Os protocolos podem ser especificados também pelo seu número, que você encontra em /etc/protocols. Vejamos:
# iptables -A FORWARD -p tcp --dport 80 -j DROP
Nesta regra temos que os pacotes relacionados com o protocolo 'tcp' e destinados à porta 80 devem ser descartados. Não se preocupe com o parâmetro '--dport'. No futuro iremos tratar dele com mais detalhes. Esta regra é muito útil quando usamos um Squid, por exemplo, para impedir que usuário acesse websites sem a configuração de proxy, obrigando ele ir pela porta 3128 (padrão) do Squid para ter acesso a websites. Veja minha dica em relação a isso com mais detalhes neste link:
Interfaces
Usamos dois parâmetros para manipular o fluxo dos dados pelas interfaces (eth0, eth1, etc) são eles:
- -i, --in-interface: interface por onde os pacotes vieram;
- -o, --out-interface: interface por onde os pacotes estão saindo.
O -i não pode ser utilizado com a chain OUTPUT, assim como -o não pode ser utilizado com a chain INPUT. Apenas pacotes passando pela chain FORWARD têm interfaces de entrada e saída. Vejamos:
# iptables -A FORWARD -i ! eth0 -j DROP
Nesta regra temos que os pacotes que entram pela interface eth0 serão aceitos, o mesmo não vai acontecer com todas as outras interfaces. Fiquem atentos à inversão "!". Quando queremos criar regras do Iptables para interfaces que ainda não existem, como a ppp0, fazemos da mesma forma como para as existentes, sendo que as regras só começarão a funcionar quando a interface existir. Podemos também usar a opção eth+ para aplicar as regras em todas as interfaces com uma única linha de código:
# iptables -A FORWARD -i eth+ -j DROP
Nesta regra todos os pacotes que entram pelas interfaces, eth0, eth1, eth2 e etc serão negados.
Inversão
Muitas flags podem ter seus argumentos precedidos de "!" para associar-se com partes diferentes aos passados na opção. É interessante compreender bem o uso do "!" pois, na prática, ele é bastante usado. Para evitar dúvidas na compreensão de scripts firewall grandes, sempre comente seu código, pois detalhes assim podem confundir outro administrador de redes mais desatento.
http://www.vivaolinux.com.br/comunidades/verComunidade.php?codigo=40
:P