Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
IPTables
As regras do Iptables so muitas vezes um desafio at mesmo para os administradores mais experientes.
Escrever regras de firewall quase como aprender um novo dialeto. Existem muitas combinaes possveis
entre os parmetros disponveis e "regras de concordncia", que determinam o que funciona e o que no.
Obs.: Devido ao UTF, os dois traos usados nos exemplos aparecem como "-" em muitos
navegadores. Ao us-los, lembre-se de substituir o "-" por dois traos (- -).
Aqui est um resumo dos parmetros do Iptables, que vai ajud-lo a escrever seus prprios scripts e entender
melhor os scripts de exemplo que encontrar pela web:
-A INPUT:Especifica que a regra se aplica a pacotes de entrada, ou seja, pacotes recebidos pelo servidor, em
qualquer interface.
-A FORWARD:Este parmetro usado ao compartilhar a conexo com a Internet, permitindo que os micros
da rede local acessem atravs do servidor. Os pacotes de outros micros, encaminhados pelo servidor, so
tratados como "FORWARD", diferentemente dos pacotes transmitidos pelo prprio servidor, que so tratados
como "OUTPUT". Voc pode definir regras diferentes para cada situao.
-p udp:Alguns servios usam tambm portas UDP. Um bom exemplo so os servidores DNS, que escutam
tanto na porta 53 TCP, quanto na porta 53 UDP. Este parmetro permite definir regras que se aplicam a estes
casos, abrindo ou fechando as portas UDP, como em:
A maioria das regras do Iptables exige que voc especifique o protocolo, fazendo com que voc tenha que
repetir a regra caso queira abrir uma porta simultaneamente para TCP e UDP. Ao executar algo como
"iptables -A INPUT --dport 53 -j ACCEPT" (sem especificar o protocolo), voc receber um erro como:
Nesses casos, voc pode usar o parmetro "-p ALL", que se aplica simultaneamente aos trs protocolos
(TCP, UDP e ICMP), sem que voc precise incluir uma regra separada para cada um, como no exemplo da
regra que bloqueia qualquer tipo de conexo proveniente de um determinado endereo:
Como as portas UDP tambm so usadas por alguns servios, muito comum bloquear as portas de 0 a 1023
UDP, autorizando apenas as portas que realmente devem ficar abertas, como em:
iptables -A INPUT -p udp --dport 53 -j ACCEPT
Note que voc nunca deve fechar todas as portas UDP, pois as portas altas so usadas aleatoriamente para
pacotes de resposta para DNS e diversos outros protocolos. Alguns administradores mais paranicos fecham
todas as portas UDP at a 32000, por exemplo. No existem muitos problemas em fechar uma faixa maior de
portas, desde que voc sempre deixe uma larga faixa de portas altas abertas, de forma a receber os pacotes de
resposta.
Ao contrrio do TCP, no possvel criar uma regra genrica para permitir todos os pacotes de resposta UDP
(como a "iptables -A INPUT -p tcp --syn -j DROP"), pois no UDP no so abertas conexes. Os pacotes so
simplesmente transmitidos diretamente, sem aviso prvio.
-p icmp:Alm do TCP e UDP, existe o protocolo ICMP, usado para pacotes de controle, pings e envio de
mensagens. Um exemplo de uso a regra para desativar a resposta a pings. Na verdade, ela atua bloqueando
o pedido de ping antes que ele seja repassado ao sistema:
-i eth0:A opo "-i" permite definir a interface onde os pacotes devem ser recebidos ou enviados. Por
exemplo, usar uma regra como:
simplesmente desconectaria seu micro da rede, pois bloquearia comunicaes em qualquer interface.
Porm, se voc especificasse a interface, ele bloquearia apenas pacotes recebidos atravs dela, como em:
O mesmo se aplica quando voc quer permitir conexes em determinadas portas, mas apenas a partir da
placa de rede local. Para permitir conexes via SSH apenas a partir da placa eth0, voc poderia usar:
-o eth0: similar ao parmetro "-i", mas especifica uma interface de sada. Este parmetro menos usado,
pois normalmente nos preocupamos em impedir que o firewall aceite conexes em determinadas portas, em
vez de tentar interceptar as respostas. Entretanto, esta opo pode ser til em casos em que voc precisa
fechar uma porta de sada apenas para determinada interface. Este um exemplo de uso, onde bloqueio
pacotes de sada na porta 1863 apenas para a placa eth1:
--dportou --destination-port:Especifica uma porta. O uso mais comum para esta opo para abrir portas
de entrada (e depois aplicar uma regra que fecha as demais), como na regra que abre para conexes na porta
22, que mostrei no exemplo anterior.
-s(source): O parmetro "-s" permite especificar um endereo IP ou domnio de origem, de forma a aceitar ou
recusar as conexes. Embora seja muito fcil forjar endereos IP dentro da rede local, as coisas so muito
mais complicadas na Internet. Permitir o acesso a determinadas portas (como a do SSH) apenas para
determinados endereos, ou faixas de endereos, uma medida de segurana interessante em muitas
situaes.
Este um exemplo de regra, que abre a porta 631 apenas para hosts dentro da faixa e mscara especificada:
-m mac --mac-source 00:11:D8:76:59:2E:Esta a regra que permite especificar endereos MAC dentro de
regras do Iptables que vimos h pouco. Ela uma forma de dificultar o uso de endereos IP falseados para
ganhar acesso ao servidor, pois permite relacionar o IP ao endereo MAC da placa instalada. Lembre-se,
porm, que ela s pode ser usada em rede local e que os endereos MAC so quase to fceis de falsear
quanto os endereos IP. Um exemplo de uso seria:
--syn:Cria uma regra vlida apenas para novas conexes, no impedindo que o outro micro responda a
conexes iniciadas pelo servidor, como em:
-j: usado no final de cada regra, especificando uma ao, que pode ser:
-j ACCEPT:Aceita o pacote. Ele encaminhado ao destino sem passar pelas demais regras.
-j REJECT :Rejeita educadamente o pacote, enviando um pacote de resposta ao emissor. Quando uma porta
est fechada em modo reject, o emissor recebe rapidamente uma resposta como "connect to host 192.168.1.1
port 22: Connection refused".
-j DROP:O DROP mais enftico. O pacote simplesmente descartado, sem aviso. O emissor fica um
longo tempo esperando, at que eventualmente recebe um erro de time-out.
-j LOG: Este ltimo parmetro permite logar conexes. interessante usar esta regra principalmente em
portas muito visadas, como a do SSH, pois assim voc tem uma lista de todos os endereos que acessaram
seu servidor na porta especificada. Para ativar o log, voc deve duplicar a regra que abre a porta, usando a
opo "-j LOG" na primeira e "-j ACCEPT" na segunda, como em:
No se assuste com o volume de informaes, pois o log inclui todas as tentativas de conexo. O fato de um
determinado IP ter aberto uma conexo com a porta 22 do seu servidor, no significa que o usurio realmente
obteve acesso ao SSH. Ele pode ter recebido o prompt para digitar a senha, mas isso no significa que ele
realmente conseguiu fazer login.
Note que alterar a ordem das regras altera o resultado. Em caso de duas regras conflitantes, vale a que vem
primeiro. Por exemplo, ao usar:
a porta 22 permanecer fechada, pois os pacotes sero descartados pela primeira regra, sem terem chance
de serem autorizados pela segunda. justamente por isso que sempre necessrio colocar as regras menos
restritivas primeiro, declarando as portas autorizadas, para s ento fechar as demais.
O mesmo se aplica ao logar transmisses. Se voc usar algo como:
o log no funcionar, pois os pacotes destinados porta 22 sero aceitos pela primeira regra e no
passaro pela segunda, que faz o log. As regras que fazem log devem sempre vir antes das regras que
autorizam as conexes.
Comments