===== Iptables =====
==== Tipos de Tabelas ====
* Filter
* Nat
* Mangle
* Raw
Para listar as "chains" que cada tabela possui use a sinxtaxe:
# iptables -L -t
==== 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
#!/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
#!/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
#!/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
#!/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>
# 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