Alisson Machado
07 June 2016

Iptables: Regras básicas e bloqueio por string

Ae galera! Todo Sysadmin Linux um dia precisou fazer uma regra de Iptables, nesse post vou mostrar alguns comandos básicos de sobrevivência. O primeiro passo é entender as tabelas do iptables, existem basicamente 5 tabelas. - Filter - NAT - Mangle - Security - Raw Mas vamos focar somente nas tabelas Filter e NAT que são as principais. O primeiro passo é entender a tabela Filter, essa tabela faz o controle do que entra e sai da máquina, que pode ser tanto um firewall de borda como a sua máquina local. Dentro de uma tabela nos temos as famosas CHAINS. Uma CHAIN é uma sequência de regras de firewall que decidem se uma conexão vai ser bloqueada, liberada ou redirecionada para um outro lugar, o mais importante a se saber é quais são essas CHAINS, para que elas servem e quando usa-las. Na tabela FILTER, temos 3 CHAINS, sendo elas: - INPUT - FORWARD - OUTPUT A chain INPUT serve para você colocar as regras referente as conexões que vão com destino a sua máquina. A chain FORWARD serve para você colocar as regras que vão passar através do seu firewall, quando você é um administrador de redes, é muito comum ter um firewall de borda na rede que faz o controle de tudo que entre e que sai através da rede, mas que não necessariamente tem destino ao firewall, mas sim à uma máquina dentro da rede e atrás do firewall. A chain OUTPUT serve para controlar o tráfego de tudo que sai da sua máquina, então por exemplo, na chain INPUT você consegue liberar ou bloquear o que via com destino a sua máquina, e na chain OUTPUT você consegue bloquear as conexões que saem com origem da sua máquina. Para adicionar uma regra, é necessário informar qual é a tabela e qual é a CHAIN em que essa regra vai ser adicionada. Por exemplo, imagine que você quer bloquear as conexões da porta 80 que vão com destino ao seu firewall, para isso você irá digitar a seguinte regra:
iptables -t filter -A INPUT -d 192.168.0.1 -p tcp --dport 80 -j DROP
O que a regra acima faz? Após o parâmetro -t é esperado o nome de uma tabela que no nosso caso é tabela filter. Logo na sequência temos o parâmetro -A que significa append, ou seja, ele vai adicionar a regra ao final da CHAIN que for específicada na sequência, que no nosso caso é INPUT, a CHAIN INPUT controla o trafego de tudo que vai com DESTINO ao firewall. O parâmetro -d que está na sequência, significa destination, esse destino sempre será o IP do Firewall. Depois temos o parâmetro -p que significa protocol que foi definido como tcp e na sequência --dport que significa destination port, no nosso caso é a porta 80 ( HTTP ). E a última parte da regra sempre vai ser o que chamados de TARGET, Target é ação que o iptables vai tomar quando cair nessa regra, para definir esse TARGET é passado o parâmetro -j que significa JUMP e na sequência o target literalmente, que no nosso caso é DROP, isso significa que a conexão será bloqueada, se eu quisesse liberar colocaria ACCEPT. Caso eu queria bloquear a saída do meu firewall pela porta 25, que no caso representa o SMTP eu poderia incluir uma regra da seguinte maneira:
iptables -t filter -A OUTPUT -s 192.168.0.1 -p tcp --dport 25 -j DROP
Note que foi trocada a CHAIN de INPUT para OUTPUT e ao invés de ter o parâmetro -d de destination, temos o parâmetro -s de source, então no caso de regras na CHAIN OUTPUT a origem sempre vai ser o próprio firewall. Agora um último exemplo pela chain FORWARD, que serve para passar o tráfego através do firewall, então podemos construir uma regra da seguinte maneira:
iptables -t filter -A FORWARD -s 0.0.0.0/0 -d 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT
Na regra acima, foi liberado o acesso a partir de qualquer origem, que tenha como destino alguma máquina da minha rede interna e somente se a porta de destino for 80, no caso HTTP. As regras de iptables podem até parecer estranhas de inicio, mas o mais difícil de se pensar é o fluxo das conexões, por onde elas entram, por onde elas saem, qual é o ip de origem e o de destino e as portas de entrada e saída, uma vez que isso foi entendido escrever as regras é simples. Por exemplo, imagine que eu queira fazer uma regra e ao invés de utilizar endereços de IP eu queria bloquear por nome. Pode ser inserida a seguinte regra:
iptables -t filter -A INPUT -m string --algo bm  \
--string intranet.responsus.com.br -p tcp --dport 80 -j DROP
Assim eu estou bloqueando qualquer conexão que possua o texto intranet.responsus.com.br e que tenha como destino a porta 80. Agora explicando os novos parâmetros: -m string - esses parâmetros definem que vamos importar um módulo do iptables chamado string, o que permite fazermos regras com nome. --algo bm - é o parâmetro que define qual será o algoritmo utlizado para encontrar a string, nesse caso foi definido o algorito Booyer-Moore, esse algoritmo procura um padrão e não string exatamente, então se intranet.responsus.com.br fizer parte de uma outra string a conexão também será bloqueada. --string - é a própria string que você quer encontrar dentro da conexão. E o restante dos parâmetros são os mesmos vistos acima. Agora que sabemos alguma coisa sobre iptables, vou postar uma lista de regras como exemplo. Usando módulo multiport para bloquear várias portas na mesma regra.
iptables -t filter -A INPUT -m multiport --dport 80,443 -j DROP
Usando módulo de comentário para comentar uma regra.
iptables -t filter -A INPUT -m comment -p tcp --dport 25 --comment 'Bloqueando SMTP' -j DROP
Mudando politica padrão para DROP.
iptables -t filter -P INPUT DROP
Bloqueando acesso a porta 8080.
iptables -t filter -A INPUT -p tcp --dport 8080 -j DROP
Bom, então é isso, até mais (=