Desvendando as regras de Firewall Linux Iptables

Este artigo tem como objetivo de mostrar o funcionamento do firewall mais utilizado e famoso do mundo Linux. Iremos descrever o funcionamento das chains, o encaminhamento dos pacotes e descrever como acontece o mascaramento do endereço IP (Nat), tanto de entrada (chega a um IP válido e vai para um IP interno), quanto de saída (de um endereço interno para um endereço válido).

[ Hits: 149.572 ]

Por: Armando Martins de Souza em 12/04/2010


Sintaxe iptables e suas opções



A seguir mostraremos a sintaxe iptables e suas opções, tratando somente pacotes de dados da tabela filter, criando regras para liberar, bloquear ou rejeitar os pacotes de dados de trafego normal, sem a utilização de mascaramento (tabela NAT).

Sintaxe: iptables -t [tabela] <ordem> <chain> [condições] -j <ação>

Tabela: Nesse caso estamos tratando da tabela filter, como já falamos anteriormente, esta tabela é a padrão e não é necessário explicitá-la.

Ordem:

a. -I --> Insere a regra no início da chain.
b. -A --> Insere a regra no final da chain.

PS: O chain é analisada da primeira regra para a última, isso quer dizer que a analise da regra é feita do inicio da chain para o final, essa análise se segue até encontrar uma regra se enquadre ao pacote. Ao localizar essa regra ele entra e é processado, deixando as regras subsequentes sem serem analisadas. Por isso é importante tratar as regras da mais restritiva para a menos restritiva.

Abaixo colocamos 3 regras, a primeira regra coloca a política da chain INPUT como DROP, isso quer dizer que só passa um pacote se ele estiver explicito em uma regra. A segunda regra libera acesso a porta 22 para a rede 10.0.0.0/24 e a terceira libera acesso do host 10.0.0.49 a porta 22 do host.

Exemplo:

# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp -s 10.0.0.49 --dport 22 -j ACCEPT


No exemplo acima a terceira regra nunca fará match (nenhum pacote irá utilizá-la), pois a segunda regra fará match (regra mais genérica) caso o host de IP 10.0.0.49 tente acessar o host na porta 22.

Chain:

Iremos dizer a que chain a regra se refere (INPUT, OUTPUT, FORWARD).

Condição (match):
  • -p = protocolo (all, tcp, udp, icmp etc)
  • --sport = porta origem
  • --dport = porta destino
  • -s = IP origem
  • -d = IP destino
  • -i = interface de entrada
  • -o = interface de saída
  • -m = match

Ação: É onde informamos o que devemos fazer com o pacote, ignorar (DROP), aceitar (ACCEPT) ou rejeitar (REJECT).

Abaixo colocamos alguns exemplos de regras:

Bloquear o protocolo icmp (ping):

# iptables -A INPUT -p icmp --icmp-type ping -j DROP

Só vai liberar o acesso via ssh para o host 10.3.4.11, avisando que o pacote foi rejeitado para os outros hosts:

# iptables -A INPUT -p tcp --dport 22 -s ! 10.3.4.11 -j REJECT
PS: O símbolo de "!" significa uma exceção a regra. Em nosso exemplo ele esta tratando o host de IP 10.3.4.11 como exceção a regra. Isso quer dizer que o único host que pode acessar o "firewall" é o 10.3.4.11. A regra irá rejeitas qualquer outro host.

Só vai liberar o protocolo icmp (ping) para o host 10.3.1.10. Ignorando o ping para qualquer outro host:

# iptables -A INPUT -p icmp --icmp-type ping -s ! 10.3.1.10 -j DROP

Exemplo de liberação do smtp (tcp 25) e-mail, impedir que um servidor de e-mail interno envie e-mail para fora da empresa. Normalmente isso evita que spammers, que por algum motivo tenham conseguido "acesso" a um de seus servidores, instale um servidor de e-mail e o utilize para enviar spam.

# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT

Essa regra se traduz em: os pacotes tcp que tiverem vierem através da interface eth1 e destino de saída a eth0 porta 25 deverão ser rejeitados.

No caso de duas redes:
Basta incluir as interfaces referentes a segunda rede:

# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 25 -j REJECT
# iptables -A FORWARD -i eth2 -o eth0 -p tcp --dport 25 -j REJECT


Bloquear acesso através do endereço físico da placa de rede (MAC):

# iptables -A FORWARD -m mac --mac-source 00:00:AA:BB:11:12 -p tcp --dport 80 -j DROP

Se você tem alguma dúvida para saber o endereço MAC do host basta seguir o seguinte procedimento: dar um ping IP que você precisa saber o MAC e depois o dar comando o "arp".

Match (condição) OUTPUT:
Não deixa o host acessar a porta 80:

# iptables -A OUTPUT -p tcp --dport 80 -j REJECT

Libera somente o superuser (root) para fazer testes via icmp (ping):

# iptables -A OUTPUT -p icmp --icmp-type ping -m owner ! --uid-owner root -j REJECT

Esses foram alguns exemplos do que podemos fazer com o iptables, no que se refere aos pacotes de dados de tráfego normal (sem utilização de mascaramento - NAT). Ainda existem inúmeras formas de filtrarmos os pacotes, contudo são formas mais pontuais, normalmente não utilizaremos nada a mais que essas para esse tipo de filtro.

Página anterior     Próxima página

Páginas do artigo
   1. Iptables / firewall / tabelas básicas
   2. Políticas de acesso / DROP e REJECT
   3. Sintaxe iptables e suas opções
   4. NAT - Network Address Translation
   5. Script básico de firewall
Outros artigos deste autor

Como gerenciar permissões no Linux

Como gerenciar usuários e grupos

Leitura recomendada

Incremente o iptables com patch-o-matic

Revisão atualizada de instalação do Iptables com Layer7

Criando um Firewall transparente com Bridges no Debian Etch

Mandrake Firewall - Firewall com interface amigável

Squid/IPtables - Bloqueando Facebook e personalizando IP de acesso irrestrito (definitivo)

  
Comentários
[1] Comentário enviado por meinhardt_jgbr em 12/04/2010 - 11:32h

Armando,

Muito bom e elucidativo seu artigo. Parabéns!!

Os diagramas incluídos facilitam também em muito a assimilação do conteúdo. Deve ter dado bastante trabalho a preparação dos mesmos.

Apenas uma modesta observação quanto ao uso dos parâmetros DROP e REJECT.

Ao dar preferência ao uso do parâmetro DROP em vez do REJECT, o usuário estará colocando o seu sistema em modo "Fantasma" ou seja sem dar sinais de sua existência ou presença na rede. Com isto qualquer potencial invasor não receberá indicações de que no endereço IP alvo as portas x, y, z, etc estão bloqueadas, portanto existem e pertencem a determinada máquina. O DROP que apenas descarta o sinal não mostra a presença.

Embora não seja nenhum expert no assunto, estou repassando informação sobre a configuração julgada ideal por um expert no assunto, conforme apresentado no site do mesmo (www.grc.com) no teste de vulnerabilidade online Shields-Up.

Publiquei anteriormente um artigo sobre o uso desta ferramenta confiável de teste em:

http://www.vivaolinux.com.br/artigo/Teste-a-vulnerabilidade-de-seu-PC/

Sds

[2] Comentário enviado por amsouza em 12/04/2010 - 11:46h

meinhardt,

Muito obrigado pelo comentário! E sua colocação referente ao DROP e REJECT realmente foi muito feliz, agradeço a contribuição. Apesar de ter explicado a diferença entre os dois, acredito sinceramente que seu exemplo foi muito bem construído.

Um grande abraço,

Armando

Ps.: Gostei muito de seu artigo: Teste a vulnerabilidade de seu PC

[3] Comentário enviado por leandrobrunoo em 12/04/2010 - 13:07h

Amigo, muito explicativo seu artigo, agora eu queria ver com voce se tem como vc me ajudar a abri as porta 9000:9090 no meu firewall.
quando eu digito no terminal, nmap localhost me aparece o seguinte,
9001/tcp closed unknown
9002/tcp closed unknown
9003/tcp closed unknown
9009/tcp closed unknown
9010/tcp closed unknown
9011/tcp closed unknown
9040/tcp closed tor-trans
9050/tcp closed tor-socks
9071/tcp closed unknown
9080/tcp closed unknown
9081/tcp closed unknown
9090/tcp closed zeus-admin

[4] Comentário enviado por amsouza em 12/04/2010 - 13:33h

Olá Leandro,

Para abrir este range de portas você terá que trabalhar com a chain INPUT, acredito que o comando abaixo resolva seu problema:

iptables -A INPUT -p tcp --dport 9000:9090 -j ACCEPT

Ps.: Se tiver as regras abaixo em seu firewall, provavelmente não precisará mexer em mais nada. Essas regras são para liberar o acesso no caso de você ter um match em uma de suas regras. Exemplo se tenho o INPUT liberado para as portas acima, o OUTPUT vai deixar estabelecer. Em alguns casos você terá que explicitar o OUTPUT também, para isso basta digitar:

iptables -A OUTPUT -p tcp --sport 9000:9090 -j ACCEPT


# Libera conexão estabilizada
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Grande abraço e espero ter ajudado,

Armando

[5] Comentário enviado por irado em 12/04/2010 - 16:39h

muito bom realmente o artigo, como já mencionado, é bem completo. Apenas vou colocar uma observação que não é diretamente relacionada ao artigo, mas a uma dificuldade que tive não há muito tempo atrás:

trampei numa empresa em que o admin anterior devia ser extremamente bisonho/vagabundo, que substituiu o script regular com regras por aquele absurdo de iptables-restore < firewall.txt; ora, isso elimina qualquer possibilidade de vc ter tudo bem organizado :(

então era um tal de, a cada momento em que se precisasse incluir/alterar regra, tinha que se analisar o txt ENORME, pra saber onde ia o que (rs).

vc nem imagina o trabalho que deu para restabelecer o firewall original a partir do firewall.txt. Só experimente: em um fwll cujas regras te sejam desconhecidas, complicadas (vários redirecionamentos para servidores internos, várias exceções e conexões vpn), tente recuperar as regras originais (risos)

mas isso de forma alguma deslustra seu excelente artigo. Foi pros meus guardados, obrigado :)

[6] Comentário enviado por amsouza em 12/04/2010 - 16:54h

Olá Irado,

Concordo plenamente no que se refere ao iptables-save/iptables-retore, por isso mesmo coloquei um modelo de script para as regras. Mas como o intuito do artigo prover informações sobre a ferramenta, tive realmente que comentar sobre o iptables-save.

Muito obrigado pelo comentário.

Armando

[7] Comentário enviado por eltondhiego em 14/04/2010 - 19:50h

Armando, Parabéns pelo artigo. Muito bem explicado.

Você poderia me explicar melhor para que serve a parte de "Liberar conexões já estabilizadas/estabelecidas."??
O que isso implica na configuração do firewall?

Valeu!!

[8] Comentário enviado por amsouza em 15/04/2010 - 11:46h

Olá eltondhiego,
Primeiramente muito obrigado pelo comentário.

Agora vou tentar detalhar melhor as vantagens de termos as conexões estabilizadas liberadas.
Vamos analisar o trafego de pacotes da seguinte maneira. Quando liberamos uma regra de INPUT estamos liberando um endereço “IP” ou um “range de IPs”, incluindo as porta(s) necessária(s) para que algum serviço possa ser acessado. Como você esta fazendo a liberação da entrada (INPUT) do pacote em seu host (Firewall), mas lembre-se que você tem que ter em mente que esse pacote de ter liberada sua saída, isto implica em fazer a liberação na chain OUTPUT (saída dos pacotes ou retorno, no caso de acesso a um serviço). Quando falamos em liberar conexões estabilizadas, estamos evitando incluir uma regra de OUTPUT para que isso aconteça, bastando apenas inserirmos, como já demonstrado a regra abaixo:

# Libera conexões já estabilizadas.
# Para regras de INPUT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Para regras de OUTPUT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Para regras de FORWARD
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Espero ter esclarecido sua dúvida, se ainda não ficou claro, me escreva que tento melhorar minha colocação.

Grande abraço,

Armando

[9] Comentário enviado por tecnicodiegorato em 16/04/2010 - 08:20h

Excelente Artigo, trabalho com IPtables há 3 anos, e muita coisa aprendi em artigos com essa qualidade e conteúdo, excelente trabalho parabéns.

[10] Comentário enviado por amsouza em 16/04/2010 - 08:38h

Olá ratolastehara,

Obrigado pelo comentário e são esses tipos de comentários que me incentivam na criação de novos artigos.

Abraços,

Armando

[11] Comentário enviado por julio_hoffimann em 18/04/2010 - 17:23h

Parabéns pelo ótimo artigo Armando, o título foi bem escolhido (desvendando...). Fixei muitos conceitos.

Abraço.

[12] Comentário enviado por amsouza em 19/04/2010 - 09:22h

Olá Júlio,

Primeiramente obrigado pelo comentário! =) .... É muito importante saber que de alguma forma estou contribuindo para a comunidade.

Abraços,

Armando

[13] Comentário enviado por italo-jrjr em 01/05/2010 - 14:40h

Olá Armando,

Muito bom o seu artigo. Estou entrando para o mundo Linux e aprendendo na prática sobre iptables na faculdade ( na materia de Segurança de redes). Está ajudando bastante. Você utiliza uma linguagem muito simples, ideal para que esta começando, como eu . Estou aprendendo mais com você do que na faculdade.

Um abraço,

Italo Barreto

[14] Comentário enviado por amsouza em 03/05/2010 - 09:33h

Olá Italo,

Muito obrigado pelo comentário, acredito que daqui a mais algum tempo, as Faculdades/Univercidades deveram criar uma cadeira para a matéria, pois hoje normalmente o Linux esta incluso em uma cadeira e conseguentemente divide a carga horária com vários outros assuntos. Realmente o professor não tem como detalhar a matéria como deveria.

Abraços,

Armando

[15] Comentário enviado por grandmaster em 03/05/2010 - 17:16h

Muito bom mesmo o artigo. Está guardado paa consultas futuras e dúvidas.

--
Renato de Castro Henriques
ITILv3 Foundation Certified
CobiT Foundation 4.1 Certified ID: 90391725
http://www.renato.henriques.nom.br

[16] Comentário enviado por amsouza em 03/05/2010 - 17:24h

Olá Renato,

Muito obrigado pelo comentário.

Abraços,

Armando

[17] Comentário enviado por debianwoman em 25/11/2010 - 12:03h

Olá,

Continue postando seus artigos, por favor!
Você tem didática e uma excelente metodologia de ensino, eu adorei.
Preciso que continue falando sobre o firewall me ajudou muito a compreender os comandos, mas como é uma ferramenta robusta e cheia de funções continue nos ajudando com seus artigos.

PARABÉNS!!!

[18] Comentário enviado por fabioeduardo em 05/04/2012 - 00:48h

Gostei muito do artigo!!!

Só um detalhe referente o seguinte comando:

1. Criar um link simbólico do arquivo que acabamos de criar para dentro de /etc/init.d/:

# ln -s /etc/init.d/firewall /etc/firewall/firewall.sh

O correto é:

# ln -s /etc/firewall/firewall.sh /etc/init.d/firewall

[19] Comentário enviado por armando_2000 em 05/04/2012 - 10:00h

Olá Fábio,

Muito obrigado por seu comentário e realmente o comando esta errado, vou solicitar correção ao moderador do Viva o Linux.

abs,

Armando

[20] Comentário enviado por adnam em 20/06/2014 - 12:39h

Preciso de uma ajuda.

Tenho um firewall configurado na empresa onde eu trabalhoa versão do Linux que eu tenho aqui é Ubuntu Linux 10.04, quero configurar um servidor FTP mas não sei onde eu possa configurar as regras para que eu possa acessar no navegador o FTP. Alguém poderia me ajudar.

Lembrando possuo active directory configurado e gostaria que alguns usuários acessem da rede com login e senha da própria rede e possivel?

Tentei realizar essas configurações mas não sei se preciso editar algum arquivo usando o VI para que essas configurações sejam executadas

iptables -t nat -A PREROUTING -d 200.200.10.104/32 -p tcp -m tcp --dport 21 -j DNAT --to-destination 10.0.0.10:21
iptables -t nat -A POSTROUTING -d 10.0.0.10/32 -p tcp -m tcp --dport 21 -j SNAT --to-source 200.200.10.104
iptables -A FORWARD -d 10.0.0.10/32 -j ACCEPT

[21] Comentário enviado por frodopuc em 06/04/2015 - 13:16h


excelente post, deu para ter uma noção muito boa de como funciona todo o processo de firewall.. gostaria de saber se pode me ajudar na seguinte situaçao:
Preciso fazer uma configuração de NAT de um IP válido para o IP da minha central. As portas utilizadas serão a 5060 até a 5070 TCP/UDP para sinalização SIP e portas UDP 8766 até 35000 - audio RTP.
Outra situaçao é: Tenho 3 interfaces (eth0 local, eth1 link1, eth2 link2), preciso fazer que um computar IP fixo saia somente pelo link1. Nao tenho mto conhecimento sobre loadbalance, etc... e sou novato em linux. Estou tentando entender os funcionamentos.
Vlw


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts