===== 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