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