Table of Contents
Iptables
Tipos de Tabelas
- Filter
- Nat
- Mangle
- Raw
Para listar as “chains” que cada tabela possui use a sinxtaxe:
# iptables -L -t <tabela>
Tipos de Chain
Uma chain é local onde vão ser definidas as regras para o nosso firewall. Cada Tabela possui suas CHAINS.
Chais da tabela Filter:
- INPUT - Regras de entrada de pacotes;
- OUTPUT - Regras de saída de pacotes;
- FORWARD - Regras de passagem de pacotes pelo firewall.
Chais da tabela NAT:
- PREROUTING - Regras que serão processadas antes do roteamento dos pacotes nas interfaces do firewall;
- POSTROUTING - Regras que serão processadas pós roteamento dos pacotes nas interfaces do firewall;
- OUTPUT - Regras de saída de pacotes.
Políticas e as exceções
Políticas básicas:
- Negar todo o tráfego para as “chains” de “INPUT”, “OUTPUT” e “FORWARD”.
Exceções:
- Definir a relação dos serviços que devem ser liberados no “Firewall”.
Controles:
- O que não for oficialmente permitido já está expressa e previamente negado.
Sintaxe do Iptables
A sintaxe do comando iptables:
iptables [-t tabela] [opção] [chain] [dados] -j [alvo]
Exemplo para compartilhar a internet:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Parâmetros e alvos do Iptables
| Parâmetros | Descrição | |
|---|---|---|
| -P | –policy | Estabelece a politica de acesso de uma chain. |
| -t | –table | Seleciona uma tabela |
| -A | –append | Adiciona como ultima regra da sequencia de uma chain |
| -I | –insert | Insere como primeira regra da sequencia de uma chain |
| -N | –new-chain | Cria uma nova chain |
| -D | –delete | Remove uma regra |
| -X | –delete-chain | Elimina todas as regras presentes em chains de usuário |
| -F | –flush | Elimina todas as regras presentes em uma chain padrão |
| -s | -source | Determina a origem do pacote |
| -d | –destination | Determina o destino do pacote |
| –sport | –source-port | Define a porta de origem |
| –dport | –destination-port | Define a porta de destino |
| -i | –in-interface | Define a interface de entrada |
| -o | –out-interface | Define a interface de saida |
| -p | –protocol | Seleciona o protocolo (tcp, udp, icmp) |
| Alvo (target) | Descrição | |
| ACCEPT | O pacote é aceito | |
| REJECT | O pacote é rejeitado imediatamento | |
| DROP | O pacote é negado silenciosamente | |
Script para fechar as políticas básicas
Se estivermos aplicando as regras conectados por ssh é recomendado aplicar essas regras para não perdermos o acesso ao servidor:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Agora as regras de bloqueio:
# cat drop.sh
- drop.sh
#!/bin/bash IPT=$(which iptables) nega () { $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP } nega
Dê permissão de execução ao script, em seguida execute-o:
# chmod 755 drop.sh
# bash drop.sh
# iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain OUTPUT (policy DROP) target prot opt source destination
Script para limpar as políticas básicas
# cat limpa.sh
- limpa.sh
#!/bin/bash IPT=$(which iptables) limpa () { $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT } limpa
Dê permissão de execução ao script, em seguida execute-o:
# chmod 755 limpa.sh
# ./limpa.sh
# iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Script para liberar o acesso à interface loopback
Primeiro vamos fechar as políticas básicas
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ./drop.sh
Script para liberar a loopback
# cat loop.sh
- loop.sh
#!/bin/bash IPT=$(which iptables) LO="127.0.0.1" loop () { $IPT -A INPUT -i lo -d $LO -j ACCEPT $IPT -A OUTPUT -o lo -d $LO -j ACCEPT } loop
# bash loop.sh
# iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 127.0.0.1 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 127.0.0.1
Script para liberar a entrada de pacotes ICMP Echo Reply e a saída de pacotes ICMP Echo Request
# cat ping.sh
- ping.sh
#!/bin/bash IPT=$(which iptables) NET="0/0" FW="192.0.2.1" WAN1="203.0.113.1" WAN2="198.51.100.1" ping () { $IPT -A INPUT -p icmp --icmp-type 0 -s $NET -d $FW -j ACCEPT $IPT -A OUTPUT -p icmp --icmp-type 8 -s $FW -d $NET -j ACCEPT $IPT -A INPUT -p icmp --icmp-type 0 -s $NET -d $WAN1 -j ACCEPT $IPT -A OUTPUT -p icmp --icmp-type 8 -s $WAN1 -d $NET -j ACCEPT $IPT -A INPUT -p icmp --icmp-type 0 -s $NET -d $WAN2 -j ACCEPT $IPT -A OUTPUT -p icmp --icmp-type 8 -s $WAN2 -d $NET -j ACCEPT } ping
Dê permissão de execução ao script, em seguida execute-o:
# chmod 755 ping.sh # ./ping.sh
# iptables -n -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 127.0.0.1 ACCEPT icmp -- 0.0.0.0/0 192.0.2.1 icmp type 0 ACCEPT icmp -- 0.0.0.0/0 203.0.113.1 icmp type 0 ACCEPT icmp -- 0.0.0.0/0 198.51.100.1 icmp type 0 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT all -- 0.0.0.0/0 127.0.0.1 ACCEPT icmp -- 192.0.2.1 0.0.0.0/0 icmp type 8 ACCEPT icmp -- 203.0.113.1 0.0.0.0/0 icmp type 8 ACCEPT icmp -- 198.51.100.1 0.0.0.0/0 icmp type 8
Script para poder utilizar o programa mtr, que é um programa similar ao traceroute
# cat mtr.sh>
- mtr.sh
# cat mtr.sh #!/bin/bash IPT=$(which iptables) NET="0/0" WAN2="198.51.100.1" mtr () { $IPT -A INPUT -p icmp --icmp-type 11 -s $NET -d $WAN2 -j ACCEPT } mtr
Dê permissão de execução ao script, em seguida execute-o:
# chmod 755 mtr.sh # ./mtr.sh
# iptables -n -L --line-number Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 127.0.0.1 3 ACCEPT icmp -- 0.0.0.0/0 192.0.2.1 icmp type 0 4 ACCEPT icmp -- 0.0.0.0/0 203.0.113.1 icmp type 0 5 ACCEPT icmp -- 0.0.0.0/0 198.51.100.1 icmp type 0 6 ACCEPT icmp -- 0.0.0.0/0 198.51.100.1 icmp type 11 Chain FORWARD (policy DROP) num target prot opt source destination Chain OUTPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 127.0.0.1 3 ACCEPT icmp -- 192.0.2.1 0.0.0.0/0 icmp type 8 4 ACCEPT icmp -- 203.0.113.1 0.0.0.0/0 icmp type 8 5 ACCEPT icmp -- 198.51.100.1 0.0.0.0/0 icmp type 8
