Manual do IPtables - Comentários e sugestões de regras

Tradução do manual do IPtables com alguns comentários, explicações e sugestões de algumas regras.

[ Hits: 97.504 ]

Por: Buckminster em 11/03/2013


Introdução



Manual do iptables: IPtables (8) - Manual do IPtables
Nome: iptables - Ferramenta de administração para filtragem de pacotes IPv4 e NAT
Nota do tradutor: Para pacotes IPv6 deve-se utilizar ip6tables.

Sinopse:

iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]


Descrição

O iptables é utilizado para configurar, manter e inspecionar as tabelas de regras de filtragem de pacotes IPv4 no kernel do Linux. Várias tabelas diferentes podem ser definidas. Cada tabela contém um número de chains (correntes, cadeias) internas e também pode conter chains definidas pelo usuário.

Cada chain é uma lista de regras que podem combinar com um conjunto de pacotes. Cada regra especifica o que fazer com um pacote que combina com a regra. Isto é chamado de target, que pode ser um salto na mesma tabela para uma chain definida pelo utilizador.

Alvos (Targets)

Uma regra de firewall especifica os critérios para um pacote e um alvo. Se o pacote não corresponder, a regra seguinte na chain é examinada e, se o pacote for igual, então a próxima regra é especificada pelo valor do alvo, o que pode ser o nome de uma chain definida pelo utilizador ou por um dos valores especiais ACCEPT, DROP, QUEUE ou RETURN:
  • ACCEPT: significa deixar o pacote passar.
  • DROP: significa descartar o pacote.
  • QUEUE: significa passar o pacote para o userspace - espaço do usuário - (o modo como o pacote será recebido por um processo de userspace difere de acordo como determinada fila é manipulada. Os kernels 2.4.x e 2.6.x até 2.6.13, incluem o manipulador de fila "ip_queue". Kernels 2.6.14 e posteriores, incluem o manipulador de fila "nfnetlink_queue". Pacotes com um alvo de fila serão enviados para a fila número '0'. Consulte também o alvo NFQUEUE descrito posteriormente nesta página do manual).
  • RETURN: significa parar de atravessar a chain e continuar na próxima regra da chain anterior. Se o final de uma chain "built-in" (embutida) for alcançado ou uma regra de uma chain "built-in" com alvo RETURN for correspondida, o alvo especificado pela política da chain determina o destino do pacote.

Tabelas (Tables)

Geralmente, há três tabelas independentes (as tabelas que estão presentes em qualquer momento dependem das configurações do kernel e dos módulos que estão presentes).

-t, --table table :: Esta opção especifica a tabela correspondente ao pacote que o comando deve executar. Se o kernel estiver configurado com módulo de carga automático, uma tentativa será feita para carregar o módulo apropriado para essa tabela, se ele já não estiver carregado.

As tabelas são, como se segue:

filter :: Esta é a tabela padrão (se a opção "-t" não definir outra tabela, será utilizada esta tabela). Ela contém a chain "built-in INPUT" (entrada - para pacotes destinados a sockets locais, pacotes destinados para a própria máquina), FORWARD (para pacotes sendo roteados através da máquina, pacotes que passam pela máquina) e OUTPUT (para pacotes gerados localmente, pacotes oriundos da própria máquina com destino para fora dela).

* Nota do tradutor: "máquina" significa o servidor ou o desktop no qual o iptables estiver instalado e configurado. O iptables vem em praticamente todas as distribuições GNU/Linux e para configurá-lo, basta somente criar um arquivo em modo texto, dar permissão de execução e colocá-lo para iniciar junto com o sistema.

A seguir, para os preguiçosos de plantão, três sugestões de ferramentas gráficas (onde aparecem as janelinhas bonitinhas para sair clicando feito um maluco) para administração do iptables:
O iptables lê as regras de cima para baixo, de acordo com cada tabela, ou seja, se uma regra bloquear tudo numa determinada tabela, as exceções (liberações) devem ser colocadas acima desta regra.

Exemplo:

iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j DROP

A primeira regra libera, a segunda rejeita e a terceira regra, nega o acesso. A primeira regra é que terá o privilégio, então, o acesso na porta 443 será liberado para todos, mesmo rejeitando e negando o acesso nas regras subsequentes.

Caso queiramos negar o acesso à porta 443 somente para alguns IPs, por exemplo, devemos colocar essas regras ACIMA da primeira regra.

Lembrando que nas regras acima não foi determinada nenhuma tabela (-t), então, elas serão aplicadas somente na tabela padrão, a filter, e, no caso, somente na chain INPUT.

Lembrando também, que o iptables é um módulo do kernel do Linux, portanto, deve estar sendo executado pelo sistema para que possa funcionar. Ou seja, no início do script do iptables deve constar modprobe: "e_o_nome_do_módulo_o_qual_se_quer_levantar".

Caso você compilar um novo kernel, uma boa prática é colocar o módulo "IP:netfilter configuration" e suplementares (IPv4 NAT, MASQUERADE target support, NETMAP target support, REDIRECT target support etc) como "built-in (*)".

* As chains devem ser sempre colocadas em letras maiúsculas.

nat :: Esta tabela é consultada quando for encontrado um pacote que criou uma nova conexão. É composta de três built-ins: PREROUTING (para alterar pacotes no momento que eles chegam, antes do roteamento ou compartilhamento.), OUTPUT (para alterar pacotes gerados localmente antes do roteamento ou compartilhamento), POSTROUTING (para alterar pacotes quando eles estão prestes a sair, depois do roteamento ou compartilhamento).

mangle :: Esta tabela é usada para a alteração especializada do pacote. Até o kernel 2.4.17 tinha duas chains: PREROUTING (para alterar pacotes recebidos antes do roteamento) e OUTPUT (para alterar pacotes gerados localmente antes do roteamento). Desde o kernel 2.4.18, outras três chains embutidas também são suportadas: INPUT (para pacotes entrando na própria máquina), FORWARD (para alterar pacotes sendo roteados/compartilhados através da máquina), POSTROUTING (para alterar pacotes quando eles estão prestes a sair depois do roteamento/compartilhamento).

raw :: Esta tabela é usada principalmente para a configuração de isenções de rastreamento de conexões em combinação com o alvo NOTRACK. Ela registra os ganchos netfilter com maior prioridade e é chamada pelo ip_conntrack, ou quaisquer outras tabelas IP.

Ela oferece as seguintes chains:
  • PREROUTING: Para pacotes que chegam através de qualquer interface de rede.
  • OUTPUT: Para pacotes gerados por processos locais.

Opções: As opções que são reconhecidas pelo iptables, podem ser divididas em vários grupos diferentes.

Comandos

Estas opções especificam a ação que se quer executar. Apenas uma delas pode ser especificada na linha de comando, a menos que seja indicado de outra forma abaixo no script do iptables.

Para versões longas dos nomes de comandos e opções, você precisa usar apenas letras suficientes para garantir que o iptables pode diferenciá-los de todas as outras opções.

-A, --append chain rule-specification :: Anexa uma ou mais regras para o final da chain. Quando a origem e/ou nomes de destino resolverem mais de um endereço, uma regra será adicionada para cada combinação de endereços possíveis.

-D, --delete chain rule-specification
-D, --delete chain rulenum
:: Exclui uma ou mais regras da chain especificada. Existem duas versões deste comando: a regra pode ser especificada como um número na chain (rulenum - começando em 1 para a primeira regra) ou o nome da regra para combinar (rule-specification).

-I, --insert chain [rulenum] rule-specification :: Insire uma ou mais regras na chain especificada, pode ser um número para determinada regra. Assim, se o número da regra é um, a regra ou as regras serão inseridas no topo da chain. Este é o padrão se nenhum número de regra for especificado.

-R, --replace chain rulenum rule-specification :: Substitui uma regra na chain especificada. Se a fonte e/ou nomes de destino resolvem vários endereços, o comando irá falhar. As regras são numeradas a partir de 1.

-L, --list [chain] :: Lista todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão listadas. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é o padrão).

Então, as regras NAT serão listadas por:

# iptables -t nat -n -L

Note que é geralmente usado com a opção "-n" a fim de evitar longas consultas de DNS reverso. É interessante especificar a opção "-Z" (zero), daí a(s) chain(s) serão atomicamente listadas e zeradas. A saída exata é afetada pelos outros argumentos utilizados.

As regras exatas são então suprimidas até utilizar:

# iptables -L -v

-S, --list-rules [chain] :: Mostra todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão mostradas como o comando iptables-save. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é a padrão).

-F, --flush [chain] :: Limpa a chain especificada (limpa todas as chains da tabela se não for passado nenhum argumento). Isto é equivalente a apagar todas as regras, uma por uma.

-Z, --zero [chain [rulenum]] :: Zera os contadores de pacotes e bytes em todas as chains, ou apenas na chain de dados, ou apenas na regra dada em uma chain. É aconselhável usar a opção -L, --list para ver os contadores imediatamente antes das regras serem apagadas (veja acima).

-N, --new-chain chain :: Cria uma nova chain definida pelo usuário. Não deve haver nenhuma chain com o mesmo nome.

-X, --delete-chain [chain] :: Elimina uma específica chain criada pelo usuário. Não deve haver referências na chain. Se houver, você deve excluir ou substituir as regras referentes antes da chain ser excluída. A chain deve estar vazia, ou seja, não pode conter quaisquer regras. Se nenhum argumento for passado, o comando tentará apagar cada chain não embutida na tabela.

-P, --policy chain target

Define a política da chain para o alvo especificado. Veja seção TARGETS para os alvos possíveis. Apenas chains "built-in" (não definidas pelo usuário) podem ter políticas. Chains definidas pelo usuário não podem ser alvo de políticas.

-E, --rename-chain old-chain new-chain :: Muda o nome da chain especificada pelo usuário para um novo nome. Trata-se de uma perfumaria e não tem efeito sobre a estrutura da tabela.

-h :: Ajuda. Dá uma descrição (geralmente muito breve) da sintaxe do comando.

Parâmetros

Os parâmetros a seguir, constituem uma especificação de regras (são utilizados como os comandos: add, delete, insert, replace e append).

[!] -p, --protocol protocol :: Especifica o protocolo da regra ou do pacote. O protocolo especificado pode ser:
  • tcp,
  • udp,
  • udplite,
  • icmp,
  • esp,
  • ah,
  • sctp,
  • all.

Ou, pode ser um valor numérico representando um destes protocolos ou um outro protocolo. Um nome de protocolo do arquivo /etc/protocols também é permitido. O argumento "!", antes do protocolo, inverte a regra. O número zero é equivalente a "all". O protocolo "all" combina todos os protocolos e é tomado como padrão quando esta opção for omitida.

[!] -s, --source address[/mask][,...] :: Especificação da origem. "Address" pode ser um nome de rede, um host, um endereço IP de rede (com "/mask", máscara), ou um endereço IP simples.

Os hostnames serão resolvidos apenas uma vez antes da regra ser apresentada ao kernel. Note que especificar qualquer nome a ser resolvido com uma consulta remota, como ao DNS, é uma ideia muito ruim.

A máscara pode ser uma máscara de uma rede ou um número simples especificando o número no lado esquerdo da máscara de rede. Assim, uma máscara "/24" é equivalente a 255.255.255.0.

O argumento "!" antes da especificação de endereço, inverte a regra. A flag "--src" é um alias para esta opção. Vários endereços podem ser especificados, mas isso vai se expandir para várias regras (quando for acrescentado "-A") ou causará várias regras a serem excluídas (com "-D").

[!] -d, --destination address[/mask][,...] :: Especificação do destino. Ver a descrição do sinalizador "-s" (source, origem) para uma descrição detalhada da sintaxe. A flag (bandeira) "-dst" é um alias para essa opção.

-j, --jump target :: Especifica o alvo da regra, isto é, o que fazer se o pacote combinar com a regra. O alvo pode ser uma chain definida pelo usuário, pode ser um dos alvos embutidos especiais (chains que vem por padrão) que decidem o destino do pacote imediatamente ou pode ser uma extensão (ver EXTENSIONS abaixo).

Se esta opção for omitida em uma regra (e "-g" não for usado com a regra) não terá efeito sobre o destino do pacote, mas os contadores sobre a regra serão incrementados.

-g, --goto chain :: Especifica que o processamento deve continuar em uma chain especificada. Ao contrário da opção "--jump", não vai continuar o processamento nesta chain, mas sim na chain que chamou via "--jump".

[!] -i, --in-interface name :: Nome de uma interface através da qual um pacote foi recebido (somente para pacotes que entram nas chains INPUT, FORWARD e PREROUTING).

Quando o argumento "!" for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em "+", então qualquer interface que começa com o mesmo nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

Nota do tradutor: "eth+" refere-se a eth0, eth1, eth2, etc. Ou seja, a todas as placas de rede da máquina que começam com eth. Wireless seria "wlan+".

[!] -o, --out-interface name :: Nome de uma interface através da qual um pacote vai ser enviado (para pacotes que entram nas chains OUTPUT, FORWARD e POSTROUTING).

Quando o argumento "!" for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em "+", então qualquer interface que começa com este nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

[!] -f, --fragment :: Significa que a regra se refere ao segundo fragmento em diante dos pacotes fragmentados. Como não há maneira de dizer as portas de origem ou destino de um tal pacote (tipo ICMP), tal pacote não irá corresponder a todas as regras especificadas.

Quando o argumento "!" precede a flag "-f", a regra só vai coincidir com o cabeçalho dos fragmentos ou dos pacotes não fragmentados.

-c, --set-counters packets bytes :: Isso permite que o administrador inicialize os contadores de pacotes e os bytes de uma regra (durante as operações INSERT, APPEND e REPLACE).

    Próxima página

Páginas do artigo
   1. Introdução
   2. Outras opções / Match Extensions
   3. Match Extensions (Parte 1)
   4. Match Extensions (Parte 2)
   5. Extensões alvo
   6. Diagnósticos / Compatibilidade / Autores
Outros artigos deste autor

Compilação do Squid 3 no Debian Wheezy

Manual traduzido do Squid - Parte 2

Instalação do PostgreSQL com Apache 2, PHP 5, OpenSSL no Debian Wheezy 7.7 64 bits com systemd e chroot

kernel Linux otimizado - Compilação e teste

O Kernel Linux

Leitura recomendada

Firewall com Iptables: direto ao assunto (RHEL5 e Fedora)

Instalação do Layer7 no Debian Etch

Zentyal 2.0 - Solução completa de segurança open source

Incremente o iptables com patch-o-matic

Firewall para o dia a dia

  
Comentários
[1] Comentário enviado por danniel-lara em 11/03/2013 - 19:59h

Parabéns ,
Ficou Bagual mesmo o Artigo
já esta nos favoritos , assim o dia que vir um Manolo querendo saber sobre Iptables
já tenho uma boa referencia de leitura para o vivente

[2] Comentário enviado por Buckminster em 11/03/2013 - 20:35h

Obrigado, tchê!

[3] Comentário enviado por l0g1in em 12/03/2013 - 01:16h

Parabéns ficou massa, tudo bem explicadinho e de facil compreensão belo manual e parabéns por disponibilizar seu tempo e seu conhecimento para galera do VOL, o mundo Software Livre agradece! [];

[4] Comentário enviado por Buckminster em 12/03/2013 - 02:14h

Grato. Estamos aí, fuçando no Linux.

[5] Comentário enviado por cruzeirense em 12/03/2013 - 10:37h

Parabens cara! Algo muito útil...

[6] Comentário enviado por Buckminster em 12/03/2013 - 15:41h

Grato. Estamos aí.

[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h

Muito bom !!! Parabéns.

[8] Comentário enviado por Buckminster em 13/03/2013 - 12:58h


[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h:

Muito bom !!! Parabéns.


Obrigado.

[9] Comentário enviado por phrich em 15/03/2013 - 16:48h

Excelente artigo!

[10] Comentário enviado por Buckminster em 15/03/2013 - 23:41h


[9] Comentário enviado por phrich em 15/03/2013 - 16:48h:

Excelente artigo!


Obrigado.


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.

[12] Comentário enviado por Buckminster em 02/04/2013 - 14:54h


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h:

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.


Obrigado. A intenção foi essa mesma.

[13] Comentário enviado por IgorBruttal em 24/08/2013 - 06:58h

Muito bom, parabéns!

[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!

[15] Comentário enviado por Buckminster em 27/09/2013 - 02:24h


[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h:

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!


Cria uma VPN entre as redes e depois tendo os servidores pingando as estações da rede remota através da VPN, faça o masquerade via Iptables da matriz para as filais.

Mais ou menos assim:

iptables -t nat -A POSTROUTING -s 172.16.16.0/xx -o tun0 -j MASQUERADE << Iptables Matriz


Depois libera a comunicação no FORWARD do servidor da Matriz e Filiais


Iptables Matriz:

iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.17.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.18.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.19.0/xx -j ACCEPT

iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.16.0 -p icmp -j ACCEPT

Iptables Filiais (essas duas regras abaixo você coloca em cada Iptables das filiais mudando os endereços de rede para cada filial):

iptables -A FORWARD -s 172.16.17.0/xx -d 172.16.16.0/xx -j ACCEPT
iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.17.0/xx -p icmp -j ACCEPT

É mais ou menos isso. De repente você precise acrescentar uma regra ou outra, mas acredito que assim já dá para você ter uma boa idéia.

E como teu Squid não é transparente é só setar o proxy da matriz nos navegadores e redirecionar para ele no servidor da matriz com Iptables.

[16] Comentário enviado por removido em 18/11/2013 - 14:46h

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.

[17] Comentário enviado por Buckminster em 30/11/2013 - 01:19h


[16] Comentário enviado por tropper em 18/11/2013 - 14:46h:

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.


Obrigado.

[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h

Tu é o cara! Parabéns novamente!

[19] Comentário enviado por Buckminster em 16/12/2013 - 13:10h


[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h:

Tu é o cara! Parabéns novamente!


Obrigado!

[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!

[21] Comentário enviado por Buckminster em 10/01/2014 - 10:48h


[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h:

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!


Obrigado.

O Google Tradutor é uma ótima ferramenta. Eu uso sempre quando estou com preguiça de traduzir um texto grande, depois é só ajeitar algumas coisas na tradução.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts