Um pouco sobre IPtables

IPtables é um firewall a nível de pacotes e funciona baseado no endereço/porta de origem/destino do pacote, prioridade etc. Ele funciona através da comparação de regras para saber se um pacote tem ou não permissão para passar. Em firewalls mais restritivos, o pacote é bloqueado e registrado para que o administrador do sistema tenha conhecimento sobre o que está acontecendo em seu sistema.

[ Hits: 63.473 ]

Por: Douglas Q. dos Santos em 08/12/2012 | Blog: http://wiki.douglasqsantos.com.br


Adicionando e inserindo regras



Adicionando uma regra

"-A" ou "--append" → Esta ação insere uma nova regra no controle do firewall na sequência da cadeia.

Vamos ver um exemplo do uso da ação "-A". Na regra abaixo, vamos efetuar a liberação do acesso à porta 22 SSH, as regras sempre vão seguir o padrão informado abaixo:

# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT

Explicando: Aqui adicionamos uma regra na tabela de filtragem "filter" na chain "INPUT", que é a chain que controla o tráfego de entrada. No protocolo TCP, na porta 22, que é a porta padrão de SSH e com a opção "-j" nós informamos ao IPtables o que deve ser feito, ou seja, DROP bloqueia o acesso.

Obs.: Na regra acima utilizamos a tabela filter, que é para a filtragem de pacotes, especificamos ela para o IPtables com a opção "-t filter", porém, se não informarmos a tabela com a opção "-t filter", o IPtables assume por padrão que a tabela a ser utilizada vai ser a filter, no caso de que seja necessário a utilização de outra tabela, temos que especificar para o IPtables a tabela com a opção "-t nome_tabela".

Agora vamos listar a nossa regra do IPtables:

# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source        destination
1    ACCEPT     tcp  --  0.0.0.0/0     0.0.0.0/0           tcp dpt:22

Como pode ser notado, a nossa regra tem o número 1, agora vamos criar mais uma regra para bloquear o acesso SSH:

# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

Agora, vamos listar novamente as nossas regras:

# iptables -L INPUT-n --line-numbers
Chain INPUT (policy ACCEPT)
um  target     prot opt source       destination
1    ACCEPT    tcp  --  0.0.0.0/0    0.0.0.0/0     tcp dpt:22
2    DROP      tcp  --  0.0.0.0/0    0.0.0.0/0     tcp dpt:22

Como pode ser notado, a regra de bloqueio recebeu o número 2. Com isso, o acesso vai ser liberado, pois o IPtables sempre vai ler a cadeia por ordem numérica.

Agora vamos fazer um teste de acesso SSH:

ssh localhost
The authenticity of host '10.0.0.31 (::1)' can't be established.
RSA key fingerprint is a0:71:05:10:1c:b9:f1:5c:ff:50:c1:30:09:0d:2e:4c.
Are you sure you want to continue connecting (yes/no)?
Como pode ser notado, a segunda regra não adiantou. Vamos refazer o nosso teste, mas antes vamos limpar as regras que já criamos:

# iptables -F

Agora vamos criar primeiro a regra de bloqueio e depois a regra de liberação:

# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT


Vamos listar as nossas regras novamente:

# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target   prot opt source       destination
1    DROP     tcp  --  0.0.0.0/0    0.0.0.0/0           tcp dpt:22
2    ACCEPT   tcp  --  0.0.0.0/0    0.0.0.0/0           tcp dpt:22

Então, agora é para o firewall bloquear o acesso à porta 22 de SSH e a segunda regra vai ser ignorada, pois ele sempre vai ler as regras em ordem numérica. Vamos fazer um teste de acesso SSH:

ssh 10.0.0.31
ssh: connect to host 10.0.0.31 port 22: Connection timed out

A conexão vai dar timeout, pois o IPtables vai bloquear o acesso.

Obs.: A conexão vai ser aceita se você acessar "ssh localhost", que é o endereço de loopback da máquina, caso seja a mesma máquina que você está implementando as regras e efetuando o acesso dela para ela mesma.

Inserindo uma regra

"-I" ou "--insert" → Insere uma regra no começo de nossa lista de regras ou na linha que for especificada.

Limpe as regras do IPtables novamente com:

# iptables -F

Agora vamos efetuar alguns testes com a opção "-I". No primeiro teste, a regra será inserida na primeira linha da cadeia INPUT:

# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT

Vamos listar agora as nossas regras:

# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target   prot opt source        destination
1    ACCEPT   tcp  --  0.0.0.0/0   0.0.0.0/0      tcp dpt:22

Como pode ser notado na listagem do IPtables, nossa regra teve o número 1, agora vamos inserir mais uma regra de bloqueio de SSH:

# iptables -t filter -I INPUT -p tcp --dport 22 -j DROP

Vamos listar as regras novamente:

# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target   prot opt source         destination
1    DROP     tcp  --  0.0.0.0/0    0.0.0.0/0           tcp dpt:22
2    ACCEPT   tcp  --  0.0.0.0/0    0.0.0.0/0           tcp dpt:22

Note onde foi parar a nossa regra de DROP, ela está com o número 1, então, quando utilizarmos a ação "-I", a regra sempre vai ser colocada no início da cadeia.

Agora vamos inserir uma regra para bloquear a porta 80 na segunda posição da nossa chain:

# iptables -t filter -I INPUT 2 -p tcp --dport 80 -j DROP

Vamos listar agora as regras novamente:

# iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target   prot opt source         destination
1    DROP     tcp  --  0.0.0.0/0    0.0.0.0/0     tcp dpt:22
2    DROP     tcp  --  0.0.0.0/0    0.0.0.0/0     tcp dpt:80
3    ACCEPT   tcp  --  0.0.0.0/0    0.0.0.0/0     tcp dpt:22

Como pode ser notado, nós especificamos a posição da nossa regra na cadeia INPUT.

Página anterior     Próxima página

Páginas do artigo
   1. Um pouco de história
   2. Adicionando e inserindo regras
   3. Deletando e substituindo regra
   4. Listando e limpando regras
   5. Zerando contadores - Criando chain
   6. Renomeando e deletando chain - Política default
   7. Opções e parâmetros do IPtables
   8. Ações padrões
   9. Usando o IPtables
   10. NAT
   11. Utilizando MASQUERADING
Outros artigos deste autor

Apache em chroot + MySQL + PHP + mod_security + mod_evasive + vsftpd + Fail2ban + Debian Squeeze

Bind9 em chroot no Debian Lenny

Bind9 slave em chroot no Debian Lenny

IDS com Snort + Guardian + Debian Lenny

Debian + Postfix + MySQL + PostfixAdmin + MailScanner + Webmail + Quotas

Leitura recomendada

Dois links de ADSL em um mesmo servidor

Configurando firewall básico para compartilhar internet

IPset - Bloqueie milhares de IPs com o iptables

Script de Firewall com redirecionamento de portas em Linux Debian

Autenticação no Iptables

  
Comentários
[1] Comentário enviado por fabio em 08/12/2012 - 10:39h

Se esse aqui é "Um pouco sobre IPtables", fico imaginando como seria o artigo "Um muito sobre IPtables" :)

Meus parabéns, ótimo artigo!

[2] Comentário enviado por douglas_dksh em 10/12/2012 - 13:12h

Obrigado,

O pior que isso ai é a base para poder se virar com o iptables.

Tem muito mais que pode ser abordado :D

[3] Comentário enviado por removido em 10/12/2012 - 17:08h

Realmente @fabio, fico imaginando também. Está ótimo o artigo.

['s]

[4] Comentário enviado por phrich em 10/12/2012 - 19:16h

Muito bom o artigo, está de parabéns!

[5] Comentário enviado por thyagobrasileiro em 11/12/2012 - 10:19h

PQP, seu blog é do caralh$#$@#@#%@

Bem organizado e aborda tudo, bem limpo e sem propagandas!!!
http://www.douglas.wiki.br


Otimo artigo!!

[6] Comentário enviado por douglas_dksh em 11/12/2012 - 11:31h

Obrigado galera :D

[7] Comentário enviado por dalveson em 11/12/2012 - 13:03h

douglashx otimo artigo,
veja se vc poderia me da uma ajuda, tenho o seguinte:
meu sistema é web e tem o ip 1.2.3.4 e roda porta 443, queria utilizar o modulos TOS junto com MANGLE para dar prioridade a este ip antes de qualquer outra conexao na minha rede 192.168.0.0/24 para upload e download sabe dizer como faço isso pois ja tentei, pesquisei bastante e ainda nao consegui
abraços

[8] Comentário enviado por douglas_dksh em 11/12/2012 - 13:41h

E ai colega,

Tipo de Prioridade TOS

Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8
Máxima Confiança 0×04 ou 4
Custo Mínimo 0×02 ou 2
Prioridade Normal 0×00 ou 0

Conforme tabela acima, a Espera mínima tem a maior prioridade entre todos,

Se o servidor web estiver virado direto para a internet você pode fazer da seguinte forma

#Para Liberar o acesso na porta 443 com Máximo Processamento na entrada
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 8

#Para Liberar o acesso na porta 443 com Máximo Processamento na saída
iptables -t mangle -A POSTROUTING -p tcp --dport 443 -j TOS --set-tos 8


#Se o servidor web estiver atras de um fw no fw tem que configurar da seguinte forma

#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8


Caso você queira utilizar a espera miníma troque o --set-tos 8 por --set-tos 10


[9] Comentário enviado por andrericsouza em 11/12/2012 - 13:50h

ótimo artigo

[10] Comentário enviado por dalveson em 11/12/2012 - 15:12h


[8] Comentário enviado por douglashx em 11/12/2012 - 13:41h:

E ai colega,

Tipo de Prioridade TOS

Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8
Máxima Confiança 0×04 ou 4
Custo Mínimo 0×02 ou 2
Prioridade Normal 0×00 ou 0

Conforme tabela acima, a Espera mínima tem a maior prioridade entre todos,

Se o servidor web estiver virado direto para a internet você pode fazer da seguinte forma

#Para Liberar o acesso na porta 443 com Máximo Processamento na entrada
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 8

#Para Liberar o acesso na porta 443 com Máximo Processamento na saída
iptables -t mangle -A POSTROUTING -p tcp --dport 443 -j TOS --set-tos 8


#Se o servidor web estiver atras de um fw no fw tem que configurar da seguinte forma

#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8


Caso você queira utilizar a espera miníma troque o --set-tos 8 por --set-tos 10



*na realidade o servidor 1.2.3.4 nao ta minha rede interna, esta em 1 cidade diferente, entao bastaria eu usar?
#Para Liberar o acesso de origem da maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -s 1.2.3.4 -j TOS --set-tos 8

#Para Liberar o acesso de destino a maquina 1.2.3.4 na porta 443 com Máximo Processamento
iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

*outra coisa, não é necessario fazer referencia a chain INPUT o OUTPUT tambem?

*outra duvida se eu quero que o sistema com ip 1.2.3.4 me de respostas mais rapidas aos usuarios, eu devo configura-lo com qual dos parametros TOS:
Espera Mínima 0×10 ou 16
Máximo Processamento 0×08 ou 8

*e a ultima duvida como voce faz para saber que realmente o ip 1.2.3.4 esta com o TOS configurado corretamente?
aqui eu criava uma regra de log e começava a monitorar com cat e sempre me mostrava um TOS diferente do que eu tinha configurado, por isso sempre achei que tinha algo errado.

[11] Comentário enviado por douglas_dksh em 11/12/2012 - 15:32h

Você usaria com o FORWARD

e liberaria as regras na tabela filter para o FORWARD desse servidor de origem e destino, pois INPUT seria se fosse no servidor local, e OUTPUT saida do servidor local com isso você vai precisar somente da FORWARD para repasse.

iptables -t filter -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

dai a regra de mangle para priorizar os pacotes

iptables -t mangle -A FORWARD -p tcp --dport 443 -d 1.2.3.4 -j TOS --set-tos 8

A espera mínima o seu pacote vai entrar logo em processamento mais não vai ter prioridade de processamento sobre os outros, no 8 temos o processamento máximo possível.

Para saber se está configurado certo mande listar com as flags vão aparecer em hexadecimal.
iptables -t mangle -L -n -v

[12] Comentário enviado por danilotm em 12/12/2012 - 11:17h

Parabéns Douglas, agora que voltarei a utilizar o IPTABLES que tanto gostava me deparo com este artigo, muito bem explicado e organizado.
Obrigado e um grande abraç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