IPTables
Comandos iptables
Por: Sílvio Garbes Lara
Iptables → Composto por: Tabela, Opção, Chain, Dados e Ação
Tipos de firewall
- Nível de aplicação → Analisa conteúdo do pacote
- Nível de pacotes → Analisa cabeçalho do pacote
Classe NAT
- Alterar endereço de origem (SNAT)
- Alterar endereço de destino (DNAT)
- Mascaramento
Tabelas (-t tabela) - Se não especificar, a tabela default será "filter"
- filter → Filtro de pacotes (INPUT, FORWARD, OUTPUT)
- nat → Regras de direcionamento, origem e destino (PREROUTING, OUTPUT, POSTROUTING)
- mangle → Marcação de pacotes, alterar prioridade do pacote, alterações especiais nos pacotes (INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING)
Aplicativos do iptables
- Iptables, Ip6tables → Principal para protocolo IPv4 e Ipv6
- Iptables-save, Ip6tables-save → Salvar regras da memória para um arquivo
- Iptables-restore, Ip6tables-restore → Carrega as regras de um arquivo para a memória
* Chains → Tratar as situações, regras definidas pelo usuário (Ex.: INPUT, OUTPUT e FORWARD)
Tabela filter
- INPUT → Pacotes de entrada e permanece no servidor
- FORWARD → Pacotes que passam pelo servidor
- OUTPUT → Pacotes que nascem e saem do servidor
Tabela nat
- PREROUTING → Modifica o pacote antes de ser roteado (DNAT e REDIRECT)
- OUTPUT → Gerado localmente, trata o pacote de saída antes de serem roteados
- POSTROUTING → Modifica o pacote depois de ser roteado (SNAT e MASQUERADE)
Tabela mangle
- INPUT → Trata o pacote antes de ser enviado para o chain INPUT da tabela "filter"
- FORWARD → Trata o pacote antes de ser enviado para o chain FORWARD da tabela "filter"
- PREROUTING → Trata o pacote antes de ser enviado para o chain PREROUTING da tabela "nat"
- POSTROUTING → Trata o pacote antes de ser enviado para o chain POSTROUTING da tabela "nat"
- OUTPUT → Trata o pacote antes de ser enviado para o chain OUTPUT da tabela "nat"
------- Sintaxe/Opções ----------
- iptables [-t tabela] -[comando][situação (chain)] especificação-da-regra [alvo]
- iptables [-t tabela] [opção] [chain] [dados] -j [ação]
// -I → Adiciona uma nova entrada no inicio da lista de regras ou numa posição especifica
# iptables -I OUTPUT
// -A → Adiciona uma nova entrada no fim da lista de regras
# iptables -A INPUT
// -D → Apaga uma regra especifica da lista
# iptables -D INPUT
// Apaga uma regra pelo numero (ex. 2) da lista
# iptables -D FORWARD 2
# iptables -t filter -D INPUT 1
# iptables -t filter -D INPUT -d 127.0.0.1 -j DROP
// -L → Lista as regras
# iptables -L FORWARD
// -P → Altera política padrão das chains. Todas iniciam setadas como ACCEPT
iptables [-t tabela] [-P chain] [ACCEPT/DROP]
# iptables -t filter -P FORWARD DROP
// -F → Remove todas as chains, sem alterar a política padrão
iptables [-t tabela] [-F chain]
# iptables -t filter -F
// Remover regras de OUTPUT
# iptables -t filter -F OUTPUT
// -R → Substitui uma regra por outra
// Ex. Alterar regra FORWARD de numero 2
# iptables -R FORWARD 2 -s 192.168.0.2 -d 192.168.1.0/24 -j DROP
// -N → Inserir/Criar uma chain numa tabela específica
# iptables -t filter -N internet
// -E → Renomeia uma chain customizada
# iptables -E internet INTERNET
// -X → Apaga uma chain customizada
iptables [-t tabela] [-X chain]
# iptables -t filter -X INTERNET
// Remove toads as chain customizadas
# iptables -X
// -h → mostra ajuda
# iptables -h
// -C → Checa as regras existentes
# iptables -C
// -Z → Zera o contador de bytes dos chains (pkts e bytes) (iptables -L -v)
iptables [-t tabela] [-Z chain] [-L]
# iptables -t filter -Z INPUT -L
# iptables -Z
-------- Regras/Dados ----------
// -j (--jump) alvo → Alvo dos pacotes que casarem com a regra
# iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT
// -p (--protocol) → Casa pacotes cujo protocolo utilizado seja o especificado
# iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT
# iptables -t filter -A INPUT -s 200.200.200.200 -p udp -j DROP
// -p tcp
// -p udp
/ -p icmp
// -s (--source, --src) → Casa pacotes usa origem seja o endereço especificado
# iptables -t filter -A INPUT -s 192.168.1.1/24 --dport 6112 -j DROP
# iptables -t filter -A INPUT -s host.dominio.com -d 210.21.1.3 -j DROP // A maquina local possui ip 210.21.1.3
// Endereco IP → (-s 192.168.1.1)
// Hostname → (-s ubuntu)
// Endereco fqdn → (-s www.ubuntu.com)
// par rede/mascara → (-s 200.200.200.0/255.255.255.0 ou -s 200.200.200.0/24)
// Caso não especificado o padrão é 0/0
// -d (--destination, --dst) → Casa pacotes cujo destino seja o especificado
# iptables -t filter -A INPUT -d 192.168.1.1/24 --dport 6112 -j DROP
# iptables -t filter -A OUTPUT -d 10.1.2.3 -j DROP
// --dport (--destination-port) → Casa pacotes cuja porta de destino seja a especificada (Trabalha junto com o protocolo)
# iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT
# iptables -t filter -A OUTPUT -d 200.200.200.200 -p tcp --dport 0:1024 -j DROP
# iptables -t filter -A OUTPUT -d 200.200.200.200 -p tcp --dport :1024 -j DROP // o valor 0 é assumido na origem
# iptables -t filter -A OUTPUT -d 200.200.200.200 -p tcp --dport 0: -j DROP // o valor 65535 é assumido no destino
// --sport (--source-port) → Casa pacotes cuja porta de origem seja a especificada. (Trabalha junto com o protocolo)
# iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 6881 -j DROP
// -i (--in-interface) → Interface de entrada do pacote
# iptables -t filter -A INPUT -i eth0 -j ACCEPT
// -i eth0
// -i eth1
// -i ppp0
// -i eth+
# iptables -t filter -A INPUT -s 200.123.123.10 -i ppp0 -j DROP
# iptables -t filter -A INPUT -s 200.123.123.10 -i ppp+ -j DROP
# iptables -t filter -A FORWARD -i ppp0 -o eth1 -j DROP
// -o (--out-interface) → Interface de saída do pacote
# iptables -t filter -A INPUT -o eth0 -j ACCEPT
// ! → Exclui determinado argumento (exceção)
# iptables -t filter -A INPUT -i !eth0 -j DROP
--------- Alvos/Ações -----------
ACCEPT → Aceita o pacote
DROP → Descarta o pacote
QUEQUE → Envia para uma fila de espera até que uma aplicação solicite o pacote, caso contrário é descartado
REJECT → Descarta o pacote e comunica o remetente
LOG → Loga o tráfego do pacote no syslog (/var/log/messages)
SNAT → Altera endereço de origem (--to-source) (NAT -> POSTROUTING)
DNAT → Altera endereço de destino (--to-destination) (NAT -> OUTPUT ou PREROUTING)
MASQUERADE → SNAT para conexões com IPs dinâmicos
REDIRECT → Redirecionamento de portas (--to-port)
TOS → Tipo de serviço
----- Aplicação da tabela NAT -------
// Habilitar forward no kernel
# echo "1" > /proc/sys/net/ipv/ip_forward
# echo "1" > /proc/sys/net/ipv4/ip_forward
SNAT usa POSTROUTING
DNAT usa PREROUTING
// SNAT → Alterar endereço de origem
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.223
// DNAT → Altera endereço de destino
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.223
// REDIRECT → Altera porta de destino no host
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
// MASQUERADE → Compartilhar internet via NAT
# iptables -t nat -A POSTROUTING -o lo -d 127.0.0.0/8 -j ACCEPT
# iptables -t nat -P POSTROUTING DROP
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
----- Aplicação da tabela MANGLE -------
TOS (Type of Service) (--set-tos) → Tipo de serviço, informação contidas no cabeçalho de cada pacote.
Espera Minima: Minimize-Delay, 16 ou 0x10
Máximo Processamento: Maximize-Throughput, 8 ou 0x08
Máxima Confiança: Maximize-Reliability, 4 ou 0x04
Custo Mínimo: Minimize-Cost, 2 ou 0x02
Prioridade Normal: Normal-Service, 0 ou 0x00
// Aumenta prioridade do pacote de saída
# iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 6666-6668 -j TOS --set-tos 16
// Aumenta prioridade do pacote de entrada
# iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 6666-6668 -j TOS --set-tos 0x10
------ Módulos -------
Limit ([-m modulo] ou [--match modulo]) → Especifica exatamente quantas vezes as mesmas regra deve ser executada em um intervalo de tempo específico, caso ocorra, ele automaticamente executará a regra seguinte. Ex.: Evitar ataques DOS (Denial Of Service)
// Os pacotes de respostas de ICMP (-p icmp) serão aceitos somente se recebidos em um intervalo de tempo de 1 segundo (-m limit --limit 1/s -j ACCEPT). Caso algum pacote ultrapasse este limite imposto pela regra, esta deverá automaticamente executar a regra seguinte.
# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# iptables -A INPUT -p icmp -j DROP
State → Atribui regras mediante a análise do estado da conexão de um pacote.
- NEW -> Pacote esta criando uma nova conexão
- ESTABLISHED → Pacote pertence a uma conexão já existente, trata-se de um pacote de resposta
- RELATED → Pacote que relaciona com outro pacote, a exemplo das mensagens de erros de conexão
- INVALID → Pacote não identificado. Pode ser descartado.
// Novas conexões são rejeitadas
# iptables -A INPUT -m state --state NEW -i eth0 -j DROP
Mac → Endereço MAC do dispositivo de rede
// Bloquei pacote de um determinado mac
# iptables -A INPUT -m mac --mac-source 00:0F:B0:C2:0C:5C -j DROP
Multiport → Especificar múltiplas portas
- --source-port [porta1, porta2, …] → Portas de origem
- --destination-port [porta1, porta2, …] → Portas de destino
- --port [porta1, porta2, …] → Portas de origem ou destino
// Bloqueia pacotes de entrana nas portas especificadas
# iptables -A INPUT -p tcp -i ppp0 -m multiport --destination-port 21,23,25,80,110,113,6667 -j DROP
String → Analisa conteúdo do pacote
// Bloqueia qualquer tentativa de acesso ao programa Kazaa
# iptables -A INPUT -m string --string "X-Kazaa" -j DROP
// Bloqueia pacotes que possua conteúdo escrito "conta"
# iptables -A OUTPUT -m string --string "conta" -j LOG --log-prefix "ALERTA: dados confidencial"
# iptables -A OUTPUT -m string --string "conta"-j DROP
// Permite conteúdo que não possui a string ".exe"
# iptables -A INPUT -m string --string !".exe" -j ACCEPT
Owner → Confere com o usuário que iniciou a conexão (somente OUTPUT)
- --uid-owner UID -> Confere se o pacote foi criado por um processo com o UID especificado.
- --gid-owner GID -> Confere se o pacote foi criado por um usuário pertencendo ao grupo GID.
- --pid-owner PID -> Confere se o pacote foi criado por um processo com o PID especificado.
- --sid-owner ID -> Confere se o pacote foi criado por um processo no grupo de seção especificado.
// Bloqueia pacotes dos usuarios petencentes ao grupo 100
# iptables -A OUTPUT -m owner --gid-owner 100 -p udp -j DROP
-------- Manipulando regras --------
// Salva as regras da memória
# iptables-save > /diretorio/arquivo
// Carrega regras salvas do arquivo
# iptables-restore > /diretorio/arquivo
// Criando script com as regras
#!/bin/bash
# descrição da regra
iptables [regra]
// Salve o arquivo em /etc/sysconfig/iptables
// De permissão de execução
# chmod +x arquivo
// Ative o arquivo de firewall na inicialização editando o arquivo /etc/rc.d/rc.local
# vi /etc/rc.d/rc.local
----------- Comandos básicos ----------
// Listar regras do iptables (Tabela vazia)
# iptables -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
// Permitir estabelecimento de sessões
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
// Permitir SSH
# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
// Liberar entrada http
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
// Listar regras do iptables (Tabela com dados)
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
// Bloqueando ICMP
# iptables -A INPUT -p icmp -j DROP
// Apagando regra anterior
# iptables -D INPUT -p icmp -j DROP
// Bloqueia faixa de ips
# iptables -A INPUT -s 200.204.120.0/24 -j DROP
// Bloqueia ICMP para determinada faixa de ips
# iptables -A OUTPUT -p icmp -d !200.201.120.0/24 -j ACCEPT
--------- Exercício -----------
# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.6 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.5 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.5/0.5/0.6 ms
# iptables -t filter -A INPUT -d 127.0.0.1 -j DROP
# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
// Listar regras do iptables
// iptables [-t tabela] -L [chain] [opções]
// tabela → se nao especificada é filter
// chain → se nao especificada mostra todos
// opções → -v (exibe mais detalhes das regras)
// -n (exibe endereco/porta ao invés de resolver dns)
// -x (exibe números exatos ao invés de números redondos, e mostra faixa de portas)
// --line-numbers (exile número da posição da regra)
# iptables -t filter -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere localhost
// Detalhes do -L
Chain INPUT → Nome do chain listado
(policy ACCEPT 78 packets, 5820 bytes) -> Policiamento padrão do chain
pkts → Quantidade de pacotes que atravessaram a regra
bytes → Quantidade de bytes que atravessaram a regra
target → Alvo da regra, destino do pacote (ACCEPT, DROP, ...)
prot → Protocolo (udp, tcp, icmp, all)
opt → Opções extras passadas a regra (!)
in → Interface de entrada
out → Interface de saida
source → Endereço de origem
destination → Endereço de destino
dpt ou dpts → Porta ou faixa de portas de destino
reject-with icmp-port-unreachable → Usado alvo REJECT
// Inserir regra na posição 1, a atual posição 1 passa a ser posição 2
# iptables -t filter -I INPUT 1 -s 192.168.1.15 -d 127.0.0.1 -j ACCEPT
// Substituir um regra (posição 2) para bloquear ping
# iptables -t filter -R INPUT 2 -d 127.0.0.1 -p icmp -j DROP
// Criando um novo chain (Objetivo agrupar regras do mesmo tipo)
iptables [-t tabela] [-N novochain]
# iptables -t filter -N internet
// Inserir regras no chain "internet"
# iptables -t filter -A internet -s 200.200.200.200 - d 127.0.0.1 -j DROP
// Criar um desvio do chain INPUT para o chain internet
# iptables -t filter -A INPUT -j internet
// Se uma máquina com o endereço "200.200.200.200" tentar acessar sua máquina (127.0.0.1), o iptables consultará as seguintes regras:
INPUT
Regra 1 : -s 192.168.1.15 -d 127.0.0.1 -j DROP
Regra 2 : -j internet
internet
Regra 1 : -s 200.200.200.200 -d 127.0.0.1 -j DROP
// O pacote que possuí o endereço de origem “200.200.200.200”, passa pela primeira regra do chain INPUT, a segunda regra deste mesmo chain, direciona o fluxo de checagem para o chain internet. No chain internet, a primeira regra confere com o endereço de origem “200.200.200.200” e o pacote será bloqueado. Após o processamento da única regra existente neste chain (internet), o fluxo de checagem é redirecionado ao chain anterior (INPUT), e como não há mais nenhuma regra para ser verificada, o processamento é finalizado.
------- Referencia interface de origem / destino ---------
Tabela Chain Interface
Entrada (-i) Saida (-o)
filter INPUT SIM NAO
OUTPUT NAO SIM
FORWARD SIM SIM
nat PREROUTING SIM NAO
OUTPUT NAO SIM
POSTROUTING NAO SIM
mangle PREROUTING SIM NAO
OUTPUT NAO SIM
Extensões TCP
As extensões TCP são automaticamente carregadas se é especificada a opção `-p tcp'.
--tcp-flags -> seguida por uma opcional `!', e por duas strings indicando flags, permite que sejam filtradas flags TCP específicas. A primeira string de flags é a máscara: uma lista de flags que serão examinadas. A segunda string diz quais flags devem estar ativas para que a regra se aplique. Por exemplo:
# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP
# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Essa regra indica que todas as flags devem ser examinadas (`ALL' é sinônimo de `SYN,ACK,FIN,RST,URG,PSH'), mas apenas SYN e ACK devem estar ativadas. Também há um argumento `NONE' que significa nenhuma flag.
--syn -> opcionalmente precedido por `!', é um atalho para `--tcp-flags SYN,RST,ACK SYN'.
# iptables -A FORWARD -p TCP -s 192.168.1.1 --syn
# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Extensões ICMP
--icmp-type -> seguida por `!' opcional, e um nome de tipo icmp (por exemplo, `host-unreachable'), ou um tipo numérico (exemplo `3'), ou um tipo numérico e código separados por `/' (exemplo `3/3'). Uma lista de tipos icmp é passada utilizando-se `-p icmp --help'.
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Extensões ao iptables: Novos alvos (targets)
LOG -> Gravar log
--log-level -> Seguido de um número de nível ou nome. Os nome válidos (sensíveis a maiúsculas/minúsculas) são `debug'(7), `info'(6), `notice'(5), `warning'(4), `err'(3), 'crit'(2), `alert'(1) and `emerg'(0), correspondendo a números de 7 até 0. Veja a página de manual do syslog.conf para uma explicaçao mais detalhada desses níveis.
--log-level 4: Nível do log. Level 4 é warning.
Seguido de uma string de até 29 characters, esta será adicionada no início da mensagem de log, permitindo melhor identificação da mesma.
--log-prefix '*** TEXT ***': Prefixo do log.
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j LOG --log-level 7
iptables -A INPUT -j DROP
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP
iptables -A INPUT -s 64.55.11.2 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix '** HACKERS **'--log-level 4
iptables -A INPUT -s 64.55.11.2 -j DROP
Arquivo de Firewall
( /etc/rc.d/firewall )
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
# Comunicacao entre processos Loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
# # # # #
# INPUT #
# # # # #
# Libera ping
# iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# iptables -t filter -A INPUT -p icmp -j DROP
# Libera acesso ao servidor da rede interna
iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
# Libera conexões já estabilizadas
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Bloqueia o resto
iptables -t filter -A INPUT -j LOG
iptables -t filter -A INPUT -j DROP
# # # # # #
# FORWARD #
# # # # # #
iptables -t filter -A FORWARD -s 192.168.0.2 -d 0/0 -j ACCEPT # Micro 2
iptables -t filter -A FORWARD -s 192.168.0.3 -d 0/0 -j ACCEPT # Micro 3
# Libera DNS
iptables -t filter -A FORWARD -p udp --dport 53 -j ACCEPT
# Libera retorno
iptables -t filter -A FORWARD -s 0/0 -d 192.168.0.0/24 -j ACCEPT
# Mascara pacotes
iptables -t nat -A POSTROUTING -o ppp+ -s 192.168.0.0/24 -j MASQUERADE
# Bloqueia o resto
iptables -t filter -A FORWARD -j LOG
iptables -t filter -A FORWARD -j DROP
#
# Comando para visualizar logs do firewall
# tail -f /var/log/messages
#
# Colocar esse arquivo no caminho /etc/rc.d/firewall
# chmod 755 /etc/rc.d/firewall
# E inserir a chamada no /etc/rc.local
#
# Visualizar as regras
# iptables -nvL