Manual do IPtables – Comentários e sugestões de regras

Introdução

Manual do iptables: IPtables (8) – Manual do IPtables
Nome: iptables – Ferramenta de administração para filtragem de pacotes IPv4 e NAT
Nota do tradutor: Para pacotes IPv6 deve-se utilizar ip6tables.

Sinopse:

iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches…] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

Descrição

O iptables é utilizado para configurar, manter e inspecionar as tabelas de regras de filtragem de pacotes IPv4 no kernel do Linux. Várias tabelas diferentes podem ser definidas. Cada tabela contém um número de chains (correntes, cadeias) internas e também pode conter chains definidas pelo usuário.

Cada chain é uma lista de regras que podem combinar com um conjunto de pacotes. Cada regra especifica o que fazer com um pacote que combina com a regra. Isto é chamado de target, que pode ser um salto na mesma tabela para uma chain definida pelo utilizador.

Alvos (Targets)

Uma regra de firewall especifica os critérios para um pacote e um alvo. Se o pacote não corresponder, a regra seguinte na chain é examinada e, se o pacote for igual, então a próxima regra é especificada pelo valor do alvo, o que pode ser o nome de uma chain definida pelo utilizador ou por um dos valores especiais ACCEPT, DROP, QUEUE ou RETURN:

  • ACCEPT: significa deixar o pacote passar.
  • DROP: significa descartar o pacote.
  • QUEUE: significa passar o pacote para o userspace – espaço do usuário – (o modo como o pacote será recebido por um processo de userspace difere de acordo como determinada fila é manipulada. Os kernels 2.4.x e 2.6.x até 2.6.13, incluem o manipulador de fila “ip_queue”. Kernels 2.6.14 e posteriores, incluem o manipulador de fila “nfnetlink_queue”. Pacotes com um alvo de fila serão enviados para a fila número ‘0’. Consulte também o alvo NFQUEUE descrito posteriormente nesta página do manual).
  • RETURN: significa parar de atravessar a chain e continuar na próxima regra da chain anterior. Se o final de uma chain “built-in” (embutida) for alcançado ou uma regra de uma chain “built-in” com alvo RETURN for correspondida, o alvo especificado pela política da chain determina o destino do pacote.

Tabelas (Tables)

Geralmente, há três tabelas independentes (as tabelas que estão presentes em qualquer momento dependem das configurações do kernel e dos módulos que estão presentes).

-t, –table table :: Esta opção especifica a tabela correspondente ao pacote que o comando deve executar. Se o kernel estiver configurado com módulo de carga automático, uma tentativa será feita para carregar o módulo apropriado para essa tabela, se ele já não estiver carregado.

As tabelas são, como se segue:

filter :: Esta é a tabela padrão (se a opção “-t” não definir outra tabela, será utilizada esta tabela). Ela contém a chain “built-in INPUT” (entrada – para pacotes destinados a sockets locais, pacotes destinados para a própria máquina), FORWARD (para pacotes sendo roteados através da máquina, pacotes que passam pela máquina) e OUTPUT (para pacotes gerados localmente, pacotes oriundos da própria máquina com destino para fora dela).

* Nota do tradutor: “máquina” significa o servidor ou o desktop no qual o iptables estiver instalado e configurado. O iptables vem em praticamente todas as distribuições GNU/Linux e para configurá-lo, basta somente criar um arquivo em modo texto, dar permissão de execução e colocá-lo para iniciar junto com o sistema.

A seguir, para os preguiçosos de plantão, três sugestões de ferramentas gráficas (onde aparecem as janelinhas bonitinhas para sair clicando feito um maluco) para administração do iptables:

O iptables lê as regras de cima para baixo, de acordo com cada tabela, ou seja, se uma regra bloquear tudo numa determinada tabela, as exceções (liberações) devem ser colocadas acima desta regra.

Exemplo:

iptables -A INPUT -p tcp –dport 443 -j ACCEPT
iptables -A INPUT -p tcp –dport 443 -j REJECT
iptables -A INPUT -p tcp –dport 443 -j DROP

A primeira regra libera, a segunda rejeita e a terceira regra, nega o acesso. A primeira regra é que terá o privilégio, então, o acesso na porta 443 será liberado para todos, mesmo rejeitando e negando o acesso nas regras subsequentes.

Caso queiramos negar o acesso à porta 443 somente para alguns IPs, por exemplo, devemos colocar essas regras ACIMA da primeira regra.

Lembrando que nas regras acima não foi determinada nenhuma tabela (-t), então, elas serão aplicadas somente na tabela padrão, a filter, e, no caso, somente na chain INPUT.

Lembrando também, que o iptables é um módulo do kernel do Linux, portanto, deve estar sendo executado pelo sistema para que possa funcionar. Ou seja, no início do script do iptables deve constar modprobe: “e_o_nome_do_módulo_o_qual_se_quer_levantar”.

Caso você compilar um novo kernel, uma boa prática é colocar o módulo “IP:netfilter configuration” e suplementares (IPv4 NAT, MASQUERADE target support, NETMAP target support, REDIRECT target support etc) como “built-in (*)”.

* As chains devem ser sempre colocadas em letras maiúsculas.

nat :: Esta tabela é consultada quando for encontrado um pacote que criou uma nova conexão. É composta de três built-ins: PREROUTING (para alterar pacotes no momento que eles chegam, antes do roteamento ou compartilhamento.), OUTPUT (para alterar pacotes gerados localmente antes do roteamento ou compartilhamento), POSTROUTING (para alterar pacotes quando eles estão prestes a sair, depois do roteamento ou compartilhamento).

mangle :: Esta tabela é usada para a alteração especializada do pacote. Até o kernel 2.4.17 tinha duas chains: PREROUTING (para alterar pacotes recebidos antes do roteamento) e OUTPUT (para alterar pacotes gerados localmente antes do roteamento). Desde o kernel 2.4.18, outras três chains embutidas também são suportadas: INPUT (para pacotes entrando na própria máquina), FORWARD (para alterar pacotes sendo roteados/compartilhados através da máquina), POSTROUTING (para alterar pacotes quando eles estão prestes a sair depois do roteamento/compartilhamento).

raw :: Esta tabela é usada principalmente para a configuração de isenções de rastreamento de conexões em combinação com o alvo NOTRACK. Ela registra os ganchos netfilter com maior prioridade e é chamada pelo ip_conntrack, ou quaisquer outras tabelas IP.

Ela oferece as seguintes chains:

  • PREROUTING: Para pacotes que chegam através de qualquer interface de rede.
  • OUTPUT: Para pacotes gerados por processos locais.

Opções: As opções que são reconhecidas pelo iptables, podem ser divididas em vários grupos diferentes.

Comandos

Estas opções especificam a ação que se quer executar. Apenas uma delas pode ser especificada na linha de comando, a menos que seja indicado de outra forma abaixo no script do iptables.

Para versões longas dos nomes de comandos e opções, você precisa usar apenas letras suficientes para garantir que o iptables pode diferenciá-los de todas as outras opções.

-A, –append chain rule-specification :: Anexa uma ou mais regras para o final da chain. Quando a origem e/ou nomes de destino resolverem mais de um endereço, uma regra será adicionada para cada combinação de endereços possíveis.

-D, –delete chain rule-specification
-D, –delete chain rulenum
:: Exclui uma ou mais regras da chain especificada. Existem duas versões deste comando: a regra pode ser especificada como um número na chain (rulenum – começando em 1 para a primeira regra) ou o nome da regra para combinar (rule-specification).

-I, –insert chain [rulenum] rule-specification :: Insire uma ou mais regras na chain especificada, pode ser um número para determinada regra. Assim, se o número da regra é um, a regra ou as regras serão inseridas no topo da chain. Este é o padrão se nenhum número de regra for especificado.

-R, –replace chain rulenum rule-specification :: Substitui uma regra na chain especificada. Se a fonte e/ou nomes de destino resolvem vários endereços, o comando irá falhar. As regras são numeradas a partir de 1.

-L, –list [chain] :: Lista todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão listadas. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é o padrão).

Então, as regras NAT serão listadas por:

# iptables -t nat -n -L

Note que é geralmente usado com a opção “-n” a fim de evitar longas consultas de DNS reverso. É interessante especificar a opção “-Z” (zero), daí a(s) chain(s) serão atomicamente listadas e zeradas. A saída exata é afetada pelos outros argumentos utilizados.

As regras exatas são então suprimidas até utilizar:

# iptables -L -v

-S, –list-rules [chain] :: Mostra todas as regras da chain especificada. Se nenhuma chain for especificada, todas as chains serão mostradas como o comando iptables-save. Como qualquer outro comando iptables, é aplicado na tabela especificada (a tabela filter é a padrão).

-F, –flush [chain] :: Limpa a chain especificada (limpa todas as chains da tabela se não for passado nenhum argumento). Isto é equivalente a apagar todas as regras, uma por uma.

-Z, –zero [chain [rulenum]] :: Zera os contadores de pacotes e bytes em todas as chains, ou apenas na chain de dados, ou apenas na regra dada em uma chain. É aconselhável usar a opção -L, –list para ver os contadores imediatamente antes das regras serem apagadas (veja acima).

-N, –new-chain chain :: Cria uma nova chain definida pelo usuário. Não deve haver nenhuma chain com o mesmo nome.

-X, –delete-chain [chain] :: Elimina uma específica chain criada pelo usuário. Não deve haver referências na chain. Se houver, você deve excluir ou substituir as regras referentes antes da chain ser excluída. A chain deve estar vazia, ou seja, não pode conter quaisquer regras. Se nenhum argumento for passado, o comando tentará apagar cada chain não embutida na tabela.

-P, –policy chain target

Define a política da chain para o alvo especificado. Veja seção TARGETS para os alvos possíveis. Apenas chains “built-in” (não definidas pelo usuário) podem ter políticas. Chains definidas pelo usuário não podem ser alvo de políticas.

-E, –rename-chain old-chain new-chain :: Muda o nome da chain especificada pelo usuário para um novo nome. Trata-se de uma perfumaria e não tem efeito sobre a estrutura da tabela.

-h :: Ajuda. Dá uma descrição (geralmente muito breve) da sintaxe do comando.

Parâmetros

Os parâmetros a seguir, constituem uma especificação de regras (são utilizados como os comandos: add, delete, insert, replace e append).

[!] -p, –protocol protocol :: Especifica o protocolo da regra ou do pacote. O protocolo especificado pode ser:

  • tcp,
  • udp,
  • udplite,
  • icmp,
  • esp,
  • ah,
  • sctp,
  • all.

Ou, pode ser um valor numérico representando um destes protocolos ou um outro protocolo. Um nome de protocolo do arquivo /etc/protocols também é permitido. O argumento “!”, antes do protocolo, inverte a regra. O número zero é equivalente a “all”. O protocolo “all” combina todos os protocolos e é tomado como padrão quando esta opção for omitida.

[!] -s, –source address[/mask][,…] :: Especificação da origem. “Address” pode ser um nome de rede, um host, um endereço IP de rede (com “/mask”, máscara), ou um endereço IP simples.

Os hostnames serão resolvidos apenas uma vez antes da regra ser apresentada ao kernel. Note que especificar qualquer nome a ser resolvido com uma consulta remota, como ao DNS, é uma ideia muito ruim.

A máscara pode ser uma máscara de uma rede ou um número simples especificando o número no lado esquerdo da máscara de rede. Assim, uma máscara “/24” é equivalente a 255.255.255.0.

O argumento “!” antes da especificação de endereço, inverte a regra. A flag “–src” é um alias para esta opção. Vários endereços podem ser especificados, mas isso vai se expandir para várias regras (quando for acrescentado “-A”) ou causará várias regras a serem excluídas (com “-D”).

[!] -d, –destination address[/mask][,…] :: Especificação do destino. Ver a descrição do sinalizador “-s” (source, origem) para uma descrição detalhada da sintaxe. A flag (bandeira) “-dst” é um alias para essa opção.

-j, –jump target :: Especifica o alvo da regra, isto é, o que fazer se o pacote combinar com a regra. O alvo pode ser uma chain definida pelo usuário, pode ser um dos alvos embutidos especiais (chains que vem por padrão) que decidem o destino do pacote imediatamente ou pode ser uma extensão (ver EXTENSIONS abaixo).

Se esta opção for omitida em uma regra (e “-g” não for usado com a regra) não terá efeito sobre o destino do pacote, mas os contadores sobre a regra serão incrementados.

-g, –goto chain :: Especifica que o processamento deve continuar em uma chain especificada. Ao contrário da opção “–jump”, não vai continuar o processamento nesta chain, mas sim na chain que chamou via “–jump”.

[!] -i, –in-interface name :: Nome de uma interface através da qual um pacote foi recebido (somente para pacotes que entram nas chains INPUT, FORWARD e PREROUTING).

Quando o argumento “!” for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em “+”, então qualquer interface que começa com o mesmo nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

Nota do tradutor: “eth+” refere-se a eth0, eth1, eth2, etc. Ou seja, a todas as placas de rede da máquina que começam com eth. Wireless seria “wlan+”.

[!] -o, –out-interface name :: Nome de uma interface através da qual um pacote vai ser enviado (para pacotes que entram nas chains OUTPUT, FORWARD e POSTROUTING).

Quando o argumento “!” for utilizado antes do nome da interface, o sentido é invertido. Se o nome da interface termina em “+”, então qualquer interface que começa com este nome irá corresponder. Se esta opção for omitida, qualquer nome de interface irá corresponder.

[!] -f, –fragment :: Significa que a regra se refere ao segundo fragmento em diante dos pacotes fragmentados. Como não há maneira de dizer as portas de origem ou destino de um tal pacote (tipo ICMP), tal pacote não irá corresponder a todas as regras especificadas.

Quando o argumento “!” precede a flag “-f”, a regra só vai coincidir com o cabeçalho dos fragmentos ou dos pacotes não fragmentados.

-c, –set-counters packets bytes :: Isso permite que o administrador inicialize os contadores de pacotes e os bytes de uma regra (durante as operações INSERT, APPEND e REPLACE).

Outras opções / Match Extensions

Outras opções

As seguintes opções adicionais podem ser especificadas:

-v, –verbose :: Saída detalhada. Esta opção faz com que o comando “-L” (list) mostre o nome da interface, as opções de regras (se houver) e as máscaras de ToS (Type of Service – Tipo de Serviço, RFC791).

Os contadores de pacotes e bytes serão listados com os sufixos ‘K’, ‘M’ ou ‘G’ para multiplicadores 1000, 1.000.000 e 1.000.000.000, respectivamente (veja a flag “-x” para mudar isso). Para APPEND, INSERT, DELETE e REPLACE, isso faz com que sejam mostradas informações detalhadas sobre a regra ou regras.

-n, –numeric :: Saída numérica. Endereços IP e números de porta serão mostrados em formato numérico. Por padrão, o programa vai tentar mostrá-los como nomes de host, nomes de rede, ou serviços (quando aplicável).

-x, –exact :: Expande números. Mostra o valor exato dos contadores de pacotes e bytes em vez de apenas o número arredondado em K (múltiplos de 1000), M (múltiplos de 1000K) ou G (múltiplos de 1000M). Esta opção só é relevante para o comando “-L”.

–line-numbers :: Ao listar regras, este comando adiciona números de linhas para o início de cada regra, correspondendo à posição da regra na chain.

–modprobe=command :: Ao adicionar ou inserir regras em uma chain, use este comando para carregar os módulos necessários (targtes, match extensions, etc.)

Match Extensions

O iptables pode usar módulos correspondentes para pacotes grandes. Estes são carregados de duas maneiras: implicitamente, quando “-p” ou “-protocol” for especificado; ou com as opções “-m” ou “–match” seguidas pelo nome do módulo correspondente.

Após várias opções de linha de comando adicionais tornam-se disponíveis, dependendo do módulo especificado. Você pode especificar vários módulos em uma linha e você pode usar a opção “-h” ou “–help”, ajuda, após o módulo especificado, para receber ajuda específica para o módulo.

Os módulos a seguir, estão incluídos no pacote de base e a maioria deles podem ser precedidos por um “!”, para inverter o sentido da regra:

addrtype :: Este módulo combina pacotes baseado no address type. Tipos de endereços são utilizados dentro da pilha de rede do kernel e categorizam endereços em vários grupos. A definição exata desse grupo específico depende do protocolo de três camadas.

Os tipos de endereços possíveis são:

  • unspec :: Um endereço indeterminado (ou seja 0.0.0.0)
  • unicast :: Um endereço unicast
  • local :: Um endereço local
  • broadcast :: Um endereço de broadcast
  • anycast :: Um pacote de anycast
  • multicast :: Um endereço de multicast
  • blackhole :: Um endereço de blackhole
  • unreachable :: Um endereço inacessível
  • prohibit :: Um endereço proibido
  • throw fixme
  • nat fixme
  • xresolve
  • [!] –src-type type :: Combina se o endereço de origem é de determinado tipo
  • [!] –dst-type type :: Combina se o endereço de destino é de determinado tipo
  • –limit-iface-in :: A verificação do tipo de endereço pode ser limitada à interface do pacote que está entrando. Esta opção só é válida com prerouting, input e forward. Ela não pode ser especificada com a opção “–limit-iface-out”.
  • –limit-iface-out :: A verificação do tipo de endereço pode ser limitada à interface do pacote que está saindo. Esta opção é válida apenas com postrouting, output e forward. Ela não pode ser especificada com a opção “–limite-iface-in”.

ah :: Este módulo corresponde ao spis no cabeçalho de autenticação de pacotes ipsec. [!] –ahspi spi[:spi]

cluster :: Permite implantar gateway e back-end de carga de compartilhamento de grupos sem a necessidade de balanceadores de carga.

Requer que todos os nós enxerguem os mesmos pacotes. Assim, o grupo decide se o nó tem de lidar com um determinado pacote, seguindo as seguintes opções:

–cluster-total-nodes num :: Define o número de nós totais em cluster.
[!] –cluster-local-node num :: Define o número de identificação do nó local.
[!] –cluster-local-nodemask mask :: Define o número id da máscara do nó local. Você pode usar esta opção em vez de “–cluster-local-node”.
–cluster-hash-seed value :: Define o valor do hash jenkins.

Exemplo:

# iptables -a prerouting -t mangle -i eth1 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j mark –set-mark 0xffff
# iptables -a prerouting -t mangle -i eth2 -m cluster –cluster-total-nodes 2 –cluster-local-node 1 –cluster-hash-seed 0xdeadbeef -j mark –set-mark 0xffff
# iptables -a prerouting -t mangle -i eth1 -m mark ! –mark 0xffff -j drop
# iptables -a prerouting -t mangle -i eth2 -m mark ! –mark 0xffff -j drop

E os seguintes comandos para fazer todos os nós verem os mesmos pacotes:

# ip maddr add 01:00:5e:00:01:01 dev eth1
# ip maddr add 01:00:5e:00:01:02 dev eth2
# arptables -a output -o eth1 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:01
# arptables -a input -i eth1 –h-length 6 –destination-mac 01:00:5e:00:01:01 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27
# arptables -a output -o eth2 –h-length 6 -j mangle –mangle-mac-s 01:00:5e:00:01:02
# arptables -a input -i eth2 –h-length 6 –destination-mac 01:00:5e:00:01:02 -j mangle –mangle-mac-d 00:zz:yy:xx:5a:27

No caso de conexões TCP, a facilidade de captação (pickup facility) tem que ser desativada para evitar a marcação de pacotes TCP ACK que venham como resposta direta válida:

# echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose

comment :: Permite adicionar comentários (até 256 caracteres) para qualquer regra:

–comment comment

Exemplo:

# iptables -a input -s 192.168.0.0/16 -m comment –comment “a privatized ip block”

connbytes :: Significa que o número de bytes, ou pacotes, de uma conexão (ou um dos dois fluxos que constituem a conexão) foi transferido para longe, ou por média de bytes por pacote.

Os contadores são de 64 bits e, portanto, espera-se que não dê overflow. 😉

O uso principal é detectar vida longa de downloads e marcá-los para serem agendados usando uma faixa de menor prioridade no controle de tráfego.

Os bytes transferidos por conexão também podem ser vistos através de “conntrack -l” e acessado via ctnetlink.

Note que, para conexões que não têm contadores de informações, sempre retornará falso. O controle de flag sysctl “net.netfilter.nf_conntrack_acct” será utilizado se as novas conexões forem de bytes/pacotes contados. Fluxos de conexão existentes não serão gaining/losing se a estrutura do contador estiver com a flag sysctl invertida.

[!] –connbytes from[:to] :: Coincide pacotes a partir de uma conexão cuja pacotes/bytes/média do tamanho do pacote for mais do que “from” e menos do que to bytes/pacotes. Se to for omitido, apenas a verificação “from” é feita. “!” é utilizado para combinar com pacotes que não se incluam no intervalo.

–connbytes-dir {original|reply|both} :: Define quais os pacotes a serem considerados.

–connbytes-mode {packets|bytes|avgpkt} :: Verifica a quantidade de pacotes, o número de bytes transferidos ou o tamanho médio (em bytes) de todos os pacotes recebidos até o momento.

Note-se que quando “both” é utilizado em conjunto com “avgpkt”, e os dados vão (principalmente) apenas num sentido (por exemplo HTTP), o tamanho do pacote médio será de cerca de metade dos pacotes de dados reais.

Exemplo:

# iptables .. -m connbytes –connbytes 10000:100000 –connbytes-dir both –connbytes-mode bytes …

connlimit :: Permite restringir o número de conexões paralelas para um servidor por endereço IP do cliente (ou bloco de endereços do cliente).

[!] –connlimit-above n :: Combina se o número de conexões existentes for (não) acima de “n”.

–connlimit-mask prefix_length :: Grupo de hosts utilizando o tamanho do prefixo. Para o IPv4, este deve ser um número entre 0 (inclusive) e 32. Para o IPv6, entre 0 e 128.

Exemplos:

#Permite duas conexões telnet por host cliente
iptables -a input -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 -j reject

#Você também pode definir o contrário utilizando “!” e accept
iptables -a input -p tcp –syn –dport 23 -m connlimit ! –connlimit-above 2 -j accept

#Limita o número de solicitações paralelas HTTP para 16 por rede classe c porte (24 netmask bit)
iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j reject

#Limita o número para 16 solicitações HTTP paralelas para a rede de conexão local (ipv6)
ip6tables -p tcp –syn –dport 80 -s fe80::/64 -m connlimit –connlimit-above 16 –connlimit-mask 64 -j reject

connmark :: Este módulo corresponde ao campo netfilter associado a uma conexão (que pode ser definido com o alvo “connmark” abaixo).

[!] –mark value[/mask] :: Pacotes em conexões com o valor de marca dada (se uma máscara é especificada, esta é, logicamente, “anded” (concatenada, operador “and”) com a marca antes da comparação).

conntrack :: Este módulo, quando combinado com rastreamento de conexão, permite o acesso ao estado de rastreamento da conexão para este pacote/conexão.

[!] –ctstate statelist :: statelist é uma lista separada por vírgulas dos estados de conexão para combinar. Estados possíveis estão listados abaixo:

  • [!] –ctproto l4proto layer-4 :: Protocolo para combinar (por número ou nome)
  • [!] –ctorigsrc address[/mask]
  • [!] –ctorigdst address[/mask]
  • [!] –ctreplsrc address[/mask]
  • [!] –ctrepldst address[/mask] :: Combina contra o endereço original/reply source/destination
  • [!] –ctorigsrcport port
  • [!] –ctorigdstport port
  • [!] –ctreplsrcport port
  • [!] –ctrepldstport port :: Combina contra original/reply source/destination (tcp/udp/etc.) ou a tecla “gre”.
  • [!] –ctstatus statelist :: Statelist é uma lista separada por vírgula dos status de conexão para combinar. Os status possíveis estão listados abaixo.
  • [!] –ctexpire time[:time] :: Combina tempo restante de vida em segundos contra determinado valor ou intervalo de valores (inclusive)
  • –ctdir {original|reply} :: Corresponde a pacotes que estão fluindo na direção especificada. Se este sinalizador não for especificado, corresponde pacotes em ambas as direções.

Estados para “–ctstate”:

  • invalid :: Significa que o pacote está associado com nenhuma conexão conhecida.
  • new :: Significa que o pacote começou uma nova conexão ou está associado a uma conexão que não tem pacotes vindos de ambas as direções.
  • established :: Significa que o pacote está associado com uma conexão que tem pacotes vindos de ambas direções.
  • related :: Significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados de FTP, ou um erro ICMP.
  • untracked :: Significa que o pacote não é seguido em tudo. Isso acontece se você usa o alvo notrack na tabela raw.
  • snat :: É um estado virtual, combina se o endereço de origem for diferente do endereço de destino.
  • dnat :: É um estado virtual, combina se o endereço de destino difere do endereço de origem.

Estados para “–ctstatus”:

  • none :: Nenhum dos abaixo.
  • expected :: Esta é uma conexão esperada (ou seja, um conntrack pode configurar)
  • seen_reply :: conntrack viu pacotes em ambas as direções.
  • assured :: Entrada conntrack nunca deve ser precocemente expirada.
  • confirmed :: Conexão confirmada: pacote originário deixou a caixa.

dccp

  • [!] –source-port,–sport port[:port]
  • [!] –destination-port,–dport port[:port]
  • [!] –dccp-types mask :: Combina quando o tipo de pacote DCCP é uma das ‘mask’. ‘mask’ é uma lista dos tipos de pacotes, separada por vírgula. Os tipos de pacotes são: request response data ack dataack closereq close reset sync syncack invalid.
  • [!] –dccp-option number :: Combina se DCP for um conjunto de opções.

dscp :: Este módulo corresponde ao campo de 6 bits DSCP dentro do campo ToS no cabeçalho IP. dscp substituiu ToS na IETF (Internet Engineering Task Force):

  • [!] –dscp value :: Combina contra um valor numérico (decimal ou hexadecimal) o valor [0-63].
  • [!] –dscp-class class :: Coincide com a classe diffserv. Este valor pode ser qualquer uma das classes: be, ef, afxx ou csx. Será, então, convertido de acordo com seu valor numérico.

ecn :: Permite combinar os bits ecn do IPv4 com o cabeçalho TCP. ecn é o mecanismo de notificação explícita de congestionamento, como especificado na rfc3168:

  • [!] –ecn-tcp-cwr :: Combina se o tcp ecn cwr (janela de congestionamento recebida) bit é definido.
  • [!] –ecn-tcp-ece :: Combina se o tcp ecn ece (ecn echo) bit está definido.
  • [!] –ecn-ip-ect num :: Corresponde a um determinado ipv4 ect (ecn- capable transport). Você tem que especificar um número entre ‘0 ‘e ‘3’.

esp :: Este módulo corresponde às spis dos cabeçalhos ESP dos pacotes IPsec:

  • [!] –espspi spi[:spi]

hashlimit :: hashlimit usa hash para expressar uma taxa limite (como limit) para um grupo de conexões, usando uma única regra do iptables. O agrupamento pode ser feito por hostgroup (source and/or destination address) e/ou por porta.

Dá a capacidade de expressar “-n” pacotes por quantum de tempo por grupo:

  • matching on source host “1000 packets per second for every host in 192.168.0.0/16”
  • matching on source prot “100 packets per second for every service of 192.168.1.1”
  • matching on subnet “10000 packets per minute for every /28 subnet in 10.0.0.0/8”

As opções “–hashlimit-upto”, “–hashlimit-above” e “–hashlimit-name” são requeridas.

–hashlimit-upto amount[/second|/minute|/hour|/day] :: Combina se a taxa é menor ou igual a amount/quantum. É especificado como um número, com um sufixo opcional quantum de tempo, o padrão é 3/hour.

–hashlimit-above amount[/second|/minute|/hour|/day] :: Combina se a taxa está acima de amount/quantum.

–hashlimit-burst amount :: Número inicial máximo de pacotes: este número é recarregado por um cada vez que o limite especificado não for atingido, o padrão é 5.

–hashlimit-mode {srcip|srcport|dstip|dstport},… :: É uma lista separada por vírgulas de objetos para levar em consideração. Se nenhuma opção “–hashlimit-mode” for dada, o hashlimit age como limite para fazer a limpeza de hash.

–hashlimit-srcmask prefix :: Quando “–hashlimit-mode srcip” for utilizado, todos os endereços de origem encontrados serão agrupados de acordo com o tamanho do prefixo dado e a sub-rede estará sujeita a hashlimit. O prefix tem de ser entre 0 (inclusive) e 32.

Note que “–hashlimit-srcmask 0” é basicamente fazer a mesma coisa que não for especificada para “–hashlimit-mode srcip”, mas é tecnicamente mais caro.

–hashlimit-dstmask prefix :: É como “–hashlimit-srcmask”, mas para endereços de destino.

–hashlimit-name foo :: Nome para a entrada /proc/net/ipt_hashlimit/foo.

–hashlimit-htable-size buckets :: Número de buckets (baldes) da tabela hash

–hashlimit-htable-max entries :: Máximo de entradas no hash.

–hashlimit-htable-expire msec :: Agrupar depois de tantos milissegundos se as entradas de hash expirarem.

–hashlimit-htable-gcinterval msec :: Quantos milissegundos entre intervalos de coleta de lixo.

helper :: Este módulo corresponde aos pacotes relativos a um determinado conntrack-helper.

[!] –helper string :: Combina pacotes relacionados com o especificado no conntrack-helper.

chain :: Pode ser “ftp” para os pacotes relacionados a uma sessão FTP na porta padrão. Para outras portas acrescentar “-portnr” ao valor, ou seja. “ftp-2121”.

As mesmas regras se aplicam a outros conntrack-helpers.

icmp :: Esta extensão pode ser usada se ‘–protocolo icmp’ for especificada. Ela oferece a seguinte opção:

[!] –icmp-type {type[/code]|typename} :: Permite a especificação do tipo ICMP, que pode ser um tipo numérico ICMP, par tipo/código, ou um dos nomes ICMP mostrados pelo comando:

# iptables -p icmp -h

iprange :: Combina um determinado intervalo arbitrário de endereços IP:

  • [!] –src-range from[-to] :: Combina IP de origem no intervalo especificado.
  • [!] –dst-range from[-to] :: Combina o IP de destino com o intervalo especificado.

length :: Este módulo corresponde ao tamanho da carga de camada 3 (por exemplo, camada 4 de pacotes) de um pacote de encontro a um valor específico, ou intervalo de valores.

[!] –length length[:length]

limit :: Este módulo corresponde a uma taxa limite usando um filtro de token bucket. Uma regra usando esta extensão irá corresponder até este limite ser atingido (a menos que a flag ‘!’ seja usada). Ele pode ser utilizado em combinação com o alvo log para dar o log limitado.

Por exemplo:

  • –limit rate[/second|/minute|/hour|/day] :: Taxa média máxima de correspondência: especificada como um número com um opcional ‘/second’, ‘/minute’, ‘/hour’, or ‘/day’, o padrão é 3/hour.
  • –limit-burst number :: Número inicial máximo de pacotes: este número é recarregado por um cada vez que o limite especificado acima não for atingido, o padrão é 5.
  • mac – [!] –mac-source address :: Corresponde ao endereço MAC de origem. Deve ser na forma: xx: xx: xx: xx: xx:xx. Note-se que isso só faz sentido para os pacotes provenientes de um dispositivo ethernet que entram nas chains prerouting, forward ou input.

mark :: Este módulo corresponde ao campo netfilter associado com um pacote (que pode ser definido com o alvo “mark” abaixo).

[!] –mark value[/mask] :: Combina pacotes com o valor de marca unsigned (não assinado) (se uma máscara é especificada, esta é logicamente anded com a máscara antes da comparação).

multiport :: Este módulo corresponde à um conjunto de portas de origem ou destino. Até 15 portas podem ser especificadas. A faixa de porta (port:port) conta como duas portas. Ela apenas pode ser utilizada em conjunto com “-p tcp” ou “-p udp”.

[!] –source-ports,–sports port[,port|,port:port]… :: Combina se a porta de origem é uma das portas especificadas. A flag “–sports” é um apelido conveniente para essa opção.

Várias portas ou intervalos de portas são separados usando uma vírgula e um intervalo de portas é especificado usando dois pontos. O conjunto 53,1024:65535, portanto, combina a porta 53 e todo o intervalo entre 1024 a 65535.

[!] –destination-ports,–dports port[,port|,port:port]… :: Combina se a porta de destino é uma das portas dadas. A flag “–dports” é um álias conveniente para essa opção.

[!] –ports port[,port|,port:port]… :: Combina se a porta de origem ou destino são iguais a uma das portas especificadas.

Nota do tradutor: O módulo multiport permite que seja especificado múltiplas portas para um alvo. Podem ser especificadas até 15 portas em um único parâmetro e basta que uma porta confira para que a regra entre em ação, pois a comparação é feita usando o operador “or.

iptables -a forward -p udp -m multiport –dport 80,1024:65535 -j drop :: Esta regra bloqueia todos os pacotes vindo de todas interfaces para as portas 80 e todo o intervalo entre as portas 1024 e 65535.

osf :: O módulo “osf” faz fingerprinting passivo no sistema operacional. Este módulo compara alguns dados (tamanho da janela, mss, opções e sua ordem, TTL, df, e outros) a partir de pacotes com o conjunto de bits syn.

[!] –genre string :: Combina um operacional utilizando fingerprint (impressão digital) passiva.

–ttl level :: Faz verificações adicionais ttl sobre o pacote para determinar o sistema operacional.

Pode ser um dos seguintes valores:

  • 0 → Verdadeiro endereço IP e comparação fingerprint TTL. Geralmente feito em lans.
  • 1 → Verifica se o TTL do cabeçalho IP é menor do que a fingerprint. Geralmente feito para endereços globalmente roteáveis (wans, mans etc).
  • 2 → Não comparar o TTL.

–log level :: Loga determinado gêneros dentro do dmesg mesmo que não correspondam ao que se quer. O nível pode ser um dos seguintes valores:

  • 0 → Log de tudo ou das assinaturas desconhecidas
  • 1 → Acesse apenas o primeiro
  • 2 → Registra todas as assinaturas conhecidas correspondentes

Nota do tradutor: O módulo “osf” é bastante interessante para descobrir qual o sistema operacional de onde estão vindo os pacotes. Exemplo:

iptables -i input -j accept -p tcp -m osf –genre linux –log 0 –ttl 2

Este comando gera uma entrada no syslog parecida com esta abaixo:

windows [2000:sp3:windows xp pro sp1, 2000  sp3]:  11.22.33.55:4024  ->
       11.22.33.44:139  hops=3  linux [2.5-2.6:] : 1.2.3.4:42624 -> 1.2.3.5:22
       hops=4

Os fingerprints do sistema operacional são carregáveis utilizando o programa “nfnl_osf”. Para carregar as fingerprints de um arquivo, utilize:

# nfnl_osf -f /usr/share/xtables/pf.os

Para remover:

# nfnl_osf -f /usr/share/xtables/pf.os -d

O banco de dados de fingerprints pode ser baixado de:

owner :: Este módulo tenta combinar várias características do criador do pacote, para pacotes gerados localmente. É válido apenas nas chains output e postrouting.

Pacotes enviados não têm qualquer socket associado a eles. Pacotes de threads do kernel têm um soquete, mas geralmente não proprietário:

  • [!] –uid-owner username
  • [!] –uid-owner userid[-userid] :: Combina se a estrutura do socket de pacotes de arquivos (se tiver uma) é de propriedade do usuário fornecido. Você também pode especificar um uid numérico ou um intervalo uid.
  • [!] –gid-owner groupname
  • [!] –gid-owner groupid[-groupid] :: Combina se a estrutura do socket para um pacote de arquivos é de propriedade de um grupo determinado. Você também pode especificar um gid numérico ou um intervalo gid.
  • [!] –socket-exists :: Combina se o pacote é associado com um soquete.

Nota do tradutor: O módulo “owner” só examina pacotes que possuem detalhes suficientes no cabeçalho, pacotes que não possuem detalhes suficientes de cabeçalho nunca serão conferidos!

iptables -a output -m owner –gid-owner 1 -p udp -j drop :: Esta regra rejeita conexões indo para portas UDP de pacotes criados pelos usuários pertencentes ao grupo 1.

physdev :: Este módulo corresponde à porta de entrada da ponte e dos dispositivos de saída escravizados num dispositivo de ponte. Este módulo é uma parte da infra-estrutura e permite um transparent bridging ip firewall e só é útil para as versões do kernel 2.5.44 e acima:

  • [!] –physdev-in name :: Nome de uma ponte de portas através do qual um pacote é recebido (somente para pacotes que entram nas chains input, forward e prerouting). Se o nome da interface termina em um “+”, então qualquer interface que começa com este nome irá corresponder. Se o pacote não chegou por meio de um dispositivo de ponte, este pacote não irá corresponder a esta opção, a menos que ‘!’ seja utilizado.
  • [!] –physdev-out name :: Nome de uma ponte de portas através da qual um pacote vai ser enviado (para pacotes que entram nas chains output, forward e postrouting).

    Se o nome da interface termina em um “+”, então qualquer interface que começa com este nome irá corresponder. Note-se que a chain output de nat e mangle, não pode coincidir com a porta de saída da ponte, no entanto pode coincidir se for na chain output de filter. Se o pacote não sair por um dispositivo de ponte ou se o dispositivo é ainda desconhecido o pacote não irá corresponder a esta opção, a menos que ‘!’ seja utilizado.

  • [!] –physdev-is-in :: Combina se o pacote entrou através de uma interface de ponte.
  • [!] –physdev-is-out :: Combina se o pacote vai sair através de uma interface de ponte.
  • [!] –physdev-is-bridged :: Combina se o pacote está sendo superado e, portanto, não está sendo roteado. Isto só é útil nas chains forward e postrouting.

pkttype :: Este módulo corresponde ao tipo de pacote da camada de enlace.

[!] –pkt-type {unicast|broadcast|multicast}

policy :: Este módulo corresponde à política utilizada por IPsec para o tratamento de um pacote:

  • –dir {in|out} :: Utilizado para selecionar a política usada para decapsulation ou para a política que será usada para encapsulamento. “in” é válido nas chains “prerouting, input” e “forward”; “out” é válido nas cahins “postrouting, output” e “forward”.
  • –pol {none|ipsec} :: Combina se o pacote está sujeito a processamento IPsec.
  • –strict :: Combina se para corresponder à política exata ou se alguma regra da política coincide com a política determinada.
  • [!] –reqid id :: Corresponde ao reqid da regra de política. O reqid pode ser especificado com setkey(8) usando unique:id como nível.
  • [!] –spi spi :: Combina com o spi da sa.
  • [!] –proto {ah|esp|ipcomp} :: Coincide com o protocolo de encapsulamento.
  • [!] –mode {tunnel|transport} :: Coincide com o modo de encapsulamento.
  • [!] –tunnel-src addr[/mask] :: Corresponde à fonte de ponto final endereço de um modo túnel sa. Só é válida com “–mode tunnel”.
  • [!] –tunnel-dst addr[/mask] :: Coincide com o endereço de destino do ponto final de um túnel de modo sa. Só é válida com –mode tunnel.
  • –next :: Inicia o próximo elemento da política especificada. Só pode ser utilizado com “–strict”.

quota :: Implementa cotas de rede, diminuindo um contador de bytes em cada pacote:

  • –quota bytes :: Quota em bytes.

rateest :: O estimador de taxa pode corresponder com taxas estimadas coletadas pelo alvo “rateest”. Ele suporta valores absolutos em bps/pps, comparando dois estimadores de taxa e de correspondência sobre a diferença entre dois estimadores de taxa:

  • –rateest1 name :: Nome do estimador de primeira.
  • –rateest2 name :: Nome do estimador de segunda (se a diferença deve ser calculado).
  • –rateest-delta :: Comparar difference(s) de determinadas rate(s)
  • –rateest1-bps value
  • –rateest2-bps value :: Compare bytes por segundo.
  • –rateest1-pps value
  • –rateest2-pps value :: Compare pacotes por segundo.
  • [!] –rateest-lt :: Combina se a taxa é menor do que a taxa dada rate/estimator.
  • [!] –rateest-gt :: Combina se a taxa é maior do que a taxa dada rate/estimator.
  • [!] –rateest-eq :: Combina se a taxa é igual à taxa dada rate/estimator.

Exemplo: Este é o que pode ser utilizado para conexões de percurso de saída de dados a partir de um servidor de FTP em duas linhas com base na largura de banda, disponível no momento que a conexão de dados foi iniciada:

#Estima as taxas de saída:
iptables -t mangle -a postrouting -o eth0 -j rateest –rateest-name eth0 –rateest-interval 250ms –rateest-ewma 0.5s
iptables -t mangle -a postrouting -o ppp0 -j rateest –rateest-name ppp0 –rateest-interval 250ms –rateest-ewma 0.5s
#Marca baseado na largura de banda disponível:
iptables -t mangle -a balance -m conntrack –ctstate new -m helper –helper ftp -m rateest –rateest-delta –rateest1 eth0 –rateest-bps1 2.5mbit –rateest-gt –rateest2 ppp0 –rateest-bps2 2mbit -j connmark –set-mark 1
iptables -t mangle -a balance -m conntrack –ctstate new -m helper –helper ftp -m rateest –rateest-delta –rateest1 ppp0 –rateest-bps1 2mbit –rateest-gt –rateest2 eth0 –rateest-bps2 2.5mbit -j connmark –set-mark 2
iptables -t mangle -a balance -j connmark –restore-mark

Match Extensions (Parte 1)

 
realm :: Combina com o domínio de roteamento. “realms” de roteamento são utilizados em configurações de roteamento complexas envolvendo protocolos de roteamento dinâmico como o bgp:

  • [!] –realm value[/mask] :: Corresponde a um número de domínio dado (e, opcionalmente, máscara). Se não for um número, o valor pode ser um campo de nome /etc/iproute2/rt_realms (a máscara não pode ser usada neste caso).
  • recent :: Permite criar dinamicamente uma lista de endereços ip e, em seguida, combina contra essa lista de algumas maneiras diferentes.

    Por exemplo, você pode criar uma lista de pessoas “badguy” que tentam se conectar na porta 139 no firewall e, em seguida, usar drop para bloquear os pacotes.

    “–set”, “–rcheck”, “–update” e “–remove” são mutuamente exclusivos.

  • –name name :: Especifica a lista para usar os comandos. Se nenhum nome for dado, então o padrão será utilizado.
  • [!] –set :: Isto irá adicionar o endereço de origem do pacote para a lista. Se o endereço de origem já está na lista isso irá atualizar a entrada existente. Sempre vai retornar sucesso (ou fracasso se “!” for setado).
  • –rsource :: Combina/salva o endereço de origem de cada pacote na tabela de lista recente. Este é o padrão.
  • –rdest :: Combina/salva o endereço de destino de cada pacote na tabela da lista recente.
  • [!] –rcheck :: Verifico se o endereço de origem do pacote está atualmente na lista.
  • [!] –update :: É como “–rcheck”, exceto que ele irá atualizar o timestamp “last seen” se ele corresponder.
  • [!] –remove :: Verifica se o endereço de origem do pacote está atualmente na lista; se o endereço for removido da lista, irá retornar true. Se o endereço não for encontrado, é retornado false.
  • –seconds seconds :: Esta opção pode ser utilizada em conjunto com um –rcheck ou –update. Quando usada, vai diminuir a regra para acontecer somente se o endereço estiver na lista e dentro do número de segundos especificados (seconds).
  • –hitcount hits :: Esta opção pode ser utilizada em conjunto com um de “–rcheck” ou “–update”. Quando usada, vai diminuir apenas quando o endereço estiver na lista e os pacotes forem recebidos maior ou igual ao valor dado (hits).

    Esta opção pode ser usada junto com “–seconds” para criar uma regra ainda mais estreita exigindo um certo número de visitas dentro de um prazo específico. O valor máximo para o parâmetro hitcount é dado pelo parâmetro “ip_pkt_list_tot” do módulo de kernel xt_recent. Superior a esse valor na linha de comando fará com que a regra seja rejeitada.

  • –rttl :: Esta opção pode ser usada somente em conjunto com “–rcheck” ou “–update”. Quando usada, vai diminuir a regra apenas quando o endereço estiver na lista e o TTL dos atuais pacotes marcados com “–set”.

    Isto pode ser útil se você tiver problemas com as pessoas simulando o endereço de origem a fim de ataque DoS. Através deste módulo você não permite o acesso de outros a seu site através do envio de pacotes falsos.

Exemplos:

iptables -a forward -m recent –name badguy –rcheck –seconds 60 -j drop
iptables -a forward -p tcp -i eth0 –dport 139 -m recent –name badguy –set -j drop

No site de steve ipt_recent também tem alguns exemplos de uso.

/proc/net/xt_recent/* :: São as atuais listas de endereços e informações sobre cada entrada de cada lista.

/proc/net/xt_recent/ :: Pode ser lido para ver a lista atual ou gravar dois usando os seguintes comandos para modificar a lista:

Adicionar “addr” à lista padrão.

# echo +addr >/proc/net/xt_recent/default

Para remover “addr” da lista padrão:

# echo -addr >/proc/net/xt_recent/default

Para limpar a lista padrão (remover todas as entradas):

# echo / &t;/proc/net/xt_recent/default

O próprio módulo aceita parâmetros, padrões indicados:

  • ip_list_tot=100 :: Número de endereços lembrados por tabela.
  • ip_pkt_list_tot=20 :: Número de pacotes por endereço lembrado.
  • ip_list_hash_size=0 :: Tamanho da tabela hash. 0 (zero) significa calcular com base no padrão ip_list_tot,: 512.
  • ip_list_perms=0644 :: Permissões para /proc/net/xt_recent/*.
  • ip_list_uid=0 :: UID numérico para as propriedades de /proc/net/xt_recent/*.
  • ip_list_gid=0 :: GID numérico para as propriedades de /proc/net/xt_recent/*.

sctp

[!] –source-port,–sport port[:port]
[!] –destination-port,–dport port[:port]
[!] –chunk-types {all|any|only} chunktype[:flags] […]

As flags acima, indicam as flags que combinam, se definidas, na parte inferior do caso indica a combinar se não estiverem definidas.

Tipos chunk: data init init_ack sack heartbeat heartbeat_ack abort shutdown shutdown_ack error cookie_echo cookie_ack ecn_ecne ecn_cwr shutdown_complete asconf asconf_ack

Tipos de chunk flags disponíveis:

data u b e u b e
abort t t
shutdown_complete t t

Obs.: Flags minúsculas significam “off”, em letras maiúsculas significam “on”.

Exemplos:

iptables -a input -p sctp –dport 80 -j drop
iptables -a input -p sctp –chunk-types any data,init -j drop
iptables -a input -p sctp –chunk-types any data:be -j accept

set :: Este módulo corresponde à conjuntos de IP, que podem ser definidos por ipset(8):

  • [!] –match-set setname flag[,flag]… :: Onde as flags formam uma lista separada por vírgula de src e/ou especificações dst e não pode haver mais de seis especificações.

Daí o comando:

# iptables -a forward -m set –match-set test src,dst

Irá corresponder pacotes para os quais (se o tipo fixado for ipportmap) o endereço de origem e de destino da porta pode ser encontrado no conjunto especificado. Se o tipo de conjunto especificado é de única dimensão (ipmap exemplo), então o comando irá corresponder pacotes para os quais o endereço de origem pode ser encontrado no conjunto especificado.

A opção “–match-set” pode ser substituída por “–set” se não colidir com uma opção de outras extensões. O uso de “-m” exige que o módulo ipset do kernel esteja levantado. Como kernels padrões não fornecem ainda, o pacote ipset ou xtables-addons precisa ser instalado.

socket :: Isso corresponde se um socket aberto puder ser encontrado fazendo uma pesquisa de sockets no pacote.

–transparent :: Ignorar sockets não transparentes.

state :: Este módulo, quando combinado com rastreamento de conexão, permite o acesso ao estado de rastreamento de conexão para este pacote.

[!] –state state :: Onde o estado é uma lista separada por vírgulas dos estados de conexão. Estados possíveis são invalid significa que o pacote não pode ser identificado por alguma razão, que inclui falta de memória e erros ICMP que não correspondem a qualquer conexão conhecida. “established” significa que o pacote está associado a uma conexão que viu pacotes em ambas direções, new significa que o pacote começou uma nova conexão, ou de outra forma associado a uma conexão que não viu pacotes em ambos os sentidos e related significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como um ftp de transferência de dados, ou um erro ICMP.

statistic :: Este módulo corresponde pacotes com base em alguma condição estatística. Ele suporta dois modos distintos configuráveis com a opção “–mode”.

As opções suportadas:

  • –mode mode :: Define o modo correspondente da regra correspondente, os modos suportados são “random” e “nth”.
  • –probability p :: Define a probabilidade 0 para 1 de um pacote ser aleatoriamente combinado. Ele só funciona com o modo random.
  • –every n :: Combinar um pacote a cada pacote nth. Ele só funciona com o modo nth (ver também a opção “–packet”).
  • –packet p :: Define o valor inicial do contador (0 <= p <= n-1, padrão 0) para o modo de “nth”.

string :: Este módulo corresponde a uma dada chain usando alguma estratégia de padrões. Ele requer um kernel linux >= 2.6.14.

  • –algo {bm|kmp} :: Seleciona a estratégia padrão de correspondência ((bm = boyer-moore, kmp = knuth-pratt-morris).
  • –from offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é 0.
  • –to offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é o tamanho do pacote.
  • [!] –string pattern :: Coincide com o padrão determinado.
  • [!] –hex-string pattern :: Corresponde ao padrão dado, porém, em notação hexadecimal.

Nota do tradutor: Utilizar strings é interessante como ponto de checagem para permitir ou descartar um pacote. É uma técnica utilizada tanto para segurança como para economia de banda dentro da rede. O iptables checa se a string especificada está dentro do pacote.

Exemplo:

# iptables -a forward -m string –algo bm –string “sexo” -j drop

Nesta regra, ele irá bloquear (drop) o pacote que tiver a string “sexo” na chain forward. A opção “–algo” determina o algoritmo de busca utilizado, “boyer-moore” ou “knuth-pratt-morris”.

A utilização de um ou outro depende da busca que se quer. O “bm” é mais adequado para quando a string procurada se assemelha ao “texto natural” (no caso, em português, logo, depende de onde está vindo o pacote) e faz suas comparações da direita para a esquerda; e o “kmp” é mais adequado para palavras curtas, sendo que ele procura uma palavra dentro de uma cadeia de texto principal e faz suas comparações da esquerda para a direita.

# iptables -a input -m string –string ! “.exe” -j accept

Esta regra somente permite a passagem de pacotes que não contém “.exe” em seu conteúdo.

tcp :: Esta extensão pode ser utilizada se ‘–protocolo tcp’ estiver especificada. Ela oferece as seguintes opções:

  • [!] –source-port,–sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Isso pode ser um nome de serviço ou de um número de porta. Uma faixa também pode ser especificada usando o formato first:last. Se a primeira porta for omitida, “0” é assumido, se a última for omitida, “65535” é assumido. Se a primeira porta é maior do que a segunda, elas serão trocadas. A flag “–sport” é um apelido conveniente para essa opção.
  • [!] –destination-port,–dport port[:port] :: Porta de destino ou especificação de intervalo de portas. A flag –dport é um álias conveniente para essa opção.
  • [!] –tcp-flags mask comp :: Combina quando as flags TCP estão especificadas. O primeiro argumento mask é a flag que devemos examinar, escrito como uma lista separada por vírgulas, e o segundo argumento deve ser uma lista de flags separadas por vírgula. As flags são: syn ack fin rst urg psh all none.

    Daí o comando:

    # iptables -a forward -p tcp –tcp-flags syn,ack,fin,rst syn

    Só irá corresponder pacotes com a flag syn e as flags fin, ack e rst não serão setadas.

  • [!] –syn :: Somente corresponde pacotes TCP com o bit SYN e com os bits RST, ACK e FIN limpos. Esses pacotes são utilizados para solicitar o início da conexão TCP, por exemplo, bloquear esses pacotes em uma interface vai evitar conexões TCP de entrada, mas as conexões TCP de saída não serão afetadas. É equivalente a –tcp-flags syn, rst, ack, fin syn. Se o “!” precede a flag “–syn”, o sentido da opção é invertido.
  • [!] –tcp-option number :: Combina se a opção TCP está setada.

tcpmss :: Combina com o TCP MSS (tamanho máximo do segmento) campo do cabeçalho TCP. Você só pode usar isso em TCP SYN ou SYN/ACK, já que o MSS só é negociado durante o handshake TCP em tempo de inicialização de conexão.

[!] –mss value[:value] :: Corresponde a um dado valor TCP MSS ou intervalo.

time :: Combina se a chegada de pacotes de time/date está dentro de um determinado intervalo. Todas as opções são opcionais, mas serão anded quando especificadas:

  • –datestart yyyy[-mm[-dd[thh[:mm[:ss]]]]]
  • –datestop yyyy[-mm[-dd[thh[:mm[:ss]]]]] :: Somente corresponde durante o tempo determinado, que deve ser em notação iso 8601 “t”. O intervalo de tempo possível é 1970-01-01t00: 00:00 a 2038-01-19t04: 17:07.

    Se “–datestart” ou “–datestop” não estiverem especificados, o padrão será 1970/01/01 e 2038/01/19, respectivamente.

  • –timestart hh:mm[:ss]
  • –timestop hh:mm[:ss] :: Somente corresponde durante o dia determinado. O intervalo de tempo possível é de 00:00:00 a 23:59:59. Zeros à esquerda são permitidos (por exemplo, “06:03”) e será corretamente interpretado como base-10.
  • [!] –monthdays day[,day…] :: Corresponde aos dias do mês. Os valores possíveis são de 1 a 31. Note que especificar 31 não é funciona em meses que não têm um dia 31, o mesmo vale para 28 ou 29 de fevereiro.
  • [!] –weekdays day[,day…] :: Corresponde aos dias da semana. Os valores possíveis são mon, tue, wed, thu, fri, sat, sun, ou valores de 1 a 7, respectivamente. Você também pode usar dois caracteres variantes (mo, tu, etc.)
  • –utc :: Interpreta os tempos indicados para –datestart, –datestop, –timestart e –timestop em utc.
  • –localtz :: Interpreta os tempos indicados para –datestart, –datestop, –timestart e –timestop se for hora do kernel local (padrão).

Exemplos: Para corresponder aos fins de semana, utilize:

-m time –weekdays sa,su

Ou, para combinar com (uma vez) em um bloco de feriado nacional:

-m time –datestart 2007-12-24 –datestop 2007-12-27

Desde que o “datestop” seja atualmente inclusivo, é necessário o datestop a seguir para não coincidir com o primeiro segundo do novo dia:

-m time –datestart 2007-01-01t17:00 –datestop 2007-01-01t23:59:59

Durante a hora do almoço:

-m time –timestart 12:30 –timestop 13:30

A quarta sexta-feira do mês:

-m time –weekdays fr –monthdays 22,23,24,25,26,27,28

Obs.: Note que explora uma determinada propriedade matemática. Não é possível especificar “quarta quinta-feira ou sexta-feira quarta” em uma regra. Somente é possível com várias regras.

Match Extensions (Parte 2)

tos :: Este módulo corresponde ao tipo de 8 bits do campo service no cabeçalho IPv4 (ou seja, incluindo o “precedence” bits) ou o campo priority (também de 8 bits) no cabeçalho IPv6.

  • [!] –tos value[/mask] :: Combina pacotes com o valor ToS dado. Se a máscara for especificada, é logicamente anded com a marca tos antes da comparação.
  • [!] –tos symbol :: Você pode especificar um nome simbólico ao usar a partida tos para IPv4. A lista de nomes reconhecidos tos pode ser obtidas chamando iptables com -m tos -h. Note que isto implica uma máscara de 0x3f, ou seja, todos os bits ecn.

Nota do tradutor: ao utilizar ToS, podemos estabelecer prioridades dos pacotes pelo tipo de serviço, por exemplo, SSH, com isso o ToS torna-se uma forma eficiente de controle de prioridade sobre o tráfego de entrada e saída da sua rede.

Exemplo de uma regra:

# iptables -t mangle -a output -o eth0 -p tcp –dport 22 tos –set-tos 16

Esta regra define que os pacotes emitidos (chain output da tabela mangle saindo pela eth0 na porta 22, porta padrão do SSH) pela máquina através do protocolo SSH terão prioridade sobre os demais pacotes. O número 16 significa “espera mínima” (minimize-delay) e refere-se ao bit ToS.

Linux: Manual do IPtables - Comentários e sugestões de regras

Porém, o ToS não substitui o QoS do roteador. É sempre preferível utilizar o QoS do roteador.

ttl :: Este módulo corresponde ao campo tempo de vida no cabeçalho IP.

  • –ttl-eq ttl :: Corresponde ao valor dado TTL.
  • –ttl-gt ttl :: Corresponde se TTL é maior do que o valor dado TTL.
  • –ttl-lt ttl :: Combina se TTL é menor do que o valor ttl dado.

u32 :: Testa se as quantidades de até 4 bytes extraídos de um pacote tem valores especificados. A especificação do que extrair geralmente é suficiente para localizar dados em deslocamentos de cabeçalhos TCP ou cargas.

  • [!] –u32 tests :: O argumento equivale a um programa em linguagem pequena descrito abaixo.
  • tests := location “=” value | tests “&&” location “=” value
  • value := range | value “,” range
  • range := number | number “:” number

Um único número, n, é interpretado como n:n. O intervalo n:m é interpretado como o intervalo de números de > = n e <= m.

  • location := number | location operator number
  • operator := “&” | “<<” | “>>” | “@”

Os operadores &, <<, >> e && significam o mesmo que na linguagem C. O “=” é realmente um operador de membro de um conjunto e o valor da sintaxe descreve um conjunto. O operador “@” é o que permite mover-se para o próximo cabeçalho e está descrito mais abaixo. Existem atualmente alguns limites artificiais na implementação do tamanho dos testes:

  • Não mais do que 10 de “=” (e 9 “&&” s) no argumento u32.
  • Não mais de 10 faixas (e 9 vírgulas) por valor.
  • Não mais de 10 números (e 9 operadores) por localização.

Para descrever o significado, existem três registros:

  • “a” é do tipo char *, inicialmente, o endereço do cabeçalho IP
  • “b” e “c” são integer de 32 bits unsigned, iniciando em zero.

As instruções são:

number b = number;
c = (*(a+b)<<24) + (*(a+b+1)<<16) + (*(a+b+2)<<8) + *(a+b+3)
&number c = c & number
<< number c = c << number
>> number c = c >> number
@ número a = a + c, em seguida, fazer o número da instrução

Qualquer acesso de memória fora de [skb-> data, skb-> end] faz com que dê falha. Caso contrário, o resultado do cálculo é o valor final de c. Espaço em branco é permitido, mas não exigido. Entretanto, a sintaxe é semelhante ao shell, por isso é uma boa ideia colocar os argumentos entre aspas.

Exemplo:

Coincidir com pacotes IP com tamanho total >= 256
O cabeçalho IP contém um campo de tamanho total em bytes 2-3.

–u32 “0 & 0xffff = 0x100:0xffff”

Leia bytes 0-3

E que, com 0xffff (dando bytes 2-3), e testar se que esteja no intervalo [0x100: 0xffff].

Exemplo (mais realista, portanto, mais complicado):

Coincidir com pacotes ICMP com ICMP tipo 0
Primeiro teste que é um pacote ICMP, byte verdadeira se 9 (protocol) = 1

–u32 “6 & 0xff = 1 && …
Leia bytes 6-9, utilize & para jogar fora bytes 6-8 e comparar o resultado a 1. Teste seguinte, que não é um fragmento (se assim for, pode ser parte de um tal pacote, mas nem sempre podemos contar). Nota: este teste é geralmente necessário se você quiser combinar qualquer coisa além do cabeçalho IP. Os últimos 6 bits do byte 6 e todos byte 7 são 0, se for um pacote completo (não de um fragmento). Alternativamente, você pode permitir primeiros fragmentos apenas testando os últimos 5 bits do byte 6.

… 4 & 0x3fff = 0 && …
Último teste: o primeiro byte após o cabeçalho IP (do tipo) é 0. Aqui temos que usar a sintaxe @. O tamanho do cabeçalho IP (ihl), de 32 bits, é armazenado na metade direita do byte 0 do cabeçalho do IP.

… 0 >> 22 & 0x3c @ 0 >> 24 = 0”
O primeiro 0 significa ler bytes de 0-3; >> 22 significa mudança de 22 bits para a direita. Deslocando 24 bits daria o primeiro byte, portanto, apenas 22 bits são quatro vezes mais que alguns bits. & 3c, em seguida, elimina os dois bits extras no lado direito e os quatro primeiros bits do primeiro byte. Por exemplo, se ihl = 5, então o cabeçalho IP tem 20 (4 x 5) bytes. Neste caso, os bytes 0-1 são (em binário) xxxx0101 yyzzzzzz, >> 22 dá o valor de 10 bits xxxx0101yy e &3c proporciona 010100. @ significa usar esse número como um novo deslocamento para o pacote e lê quatro bytes. Estes são os primeiros 4 bytes do ICMP payload, dos quais o byte 0 é do tipo ICMP. Portanto, nós simplesmente transferimos o valor 24 para a direita do primeiro byte e comparamos o resultado com 0.

Exemplo:

bytes de carga útil de TCP 8-12 é qualquer um de 1, 2, 5 ou 8
Primeiro, testar se o pacote é um pacote TCP (semelhante ao ICMP).

–u32 “6 & 0xff = 6 && …

Em seguida, teste que não é um fragmento (o mesmo que acima).

… 0 >> 22 & 0x3c @ 12 >> 26 & 0x3c @ 8 = 1,2,5,8”
0 >> 22 & 3c acima calcula o número de bytes no cabeçalho IP. @ faz novo deslocamento para o pacote, que é o início do cabeçalho do TCP. O tamanho do cabeçalho do TCP (32 bits) é a metade esquerda do byte 12 do cabeçalho de TCP. A instrução >> 12 26 3c & computa esse tamanho em bytes (semelhante ao cabeçalho IP de antes). “@” faz novo deslocamento, o qual é o começo da carga de TCP. Finalmente, o número 8 lê os bytes 8-12 dos controles de carga útil e compara se o resultado é 1, 2, 5 ou 8.

udp :: Estas extensões podem ser utilizados, se ‘–protocol udp’ estiver especificado. Ele oferece as seguintes opções:

  • [!] –source-port,–sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Consulte a descrição da opção –source-port da extensão TCP para mais detalhes.
  • [!] –destination-port,–dport port[:port] :: Porta de destino ou especificação de intervalo de portas. Consulte a descrição da opção –destination-port da extensão TCP para mais detalhes.

unclean :: Este módulo tem nenhuma opção, mas tenta combinar pacotes que parecem mal formados ou incomuns. Está em fase de teste.

Extensões alvo

 
O iptables pode usar módulos estendidos: a seguir estão incluídos na distribuição padrão.

classify :: Este módulo permite que você defina o “skb->priority value” (e assim, classificar o pacote em uma classe cbq específica).

–set-class major:minor :: Define os valores maior e menor da classe. Os valores são sempre interpretados como hexadecimal mesmo sem o prefixo 0x.

clusterip :: Este módulo permite que você configure um conjunto simples de nós que compartilham um determinado IP e um endereço MAC sem um balanceador de carga explícito. As conexões são estaticamente distribuídas entre os nós do cluster (aglomerado).

  • –new :: Cria um clusterip novo. Você sempre tem que setar isso na primeira regra de um clusterip.
  • –hashmode mode :: Especifica o modo de hash. Tem que ser um dos sourceip, sourceip-sourceport, sourceip-sourceport-destport.
  • –clustermac mac :: Especifica o clusterip do endereço MAC. Tem que ser um endereço de multicast da camada de enlace.
  • –total-nodes num :: Número de nós totais dentro deste cluster.
  • –local-node num :: Número do nó local neste cluster.
  • –hash-init rnd :: Especifica o random seed utilizado para inicialização de hash.

connmark :: Este módulo define o valor de marca netfilter associado a uma conexão. A marca tem 32 bits de tamanho.

  • –set-xmark value[/mask] :: Zera os bits de dados por máscara e valor xor no ctmark.
  • –save-mark [–nfmask nfmask] [–ctmask ctmask] :: Copia a marca do pacote (nfmark) para a marca de conexão (ctmark) usando as máscaras especificadas.

    O valor nfmark novo é determinado como se segue:

    ctmark = (ctmark & ctmask ~) ^ (& nfmark nfmask)

    Ou seja, ctmask define os bits para limpar e nfmask os bits do nfmark em xor no ctmark. Para ctmask e nfmask o padrão é 0xffffffff.

  • –restore-mark [–nfmask nfmask] [–ctmask ctmask] :: Copia a marca da conexão (ctmark) para a marca de pacotes (nfmark) usando as máscaras especificadas.

    O valor ctmark novo é determinado como se segue:

    nfmark = (nfmark & ~ nfmask) ^ (& ctmark ctmask);

    Ou seja, nfmask define quais bits limpar e ctmask define quais bits do ctmark fazem xor em nfmark. Para ctmask e nfmask o padrão é 0xffffffff.

  • –restore-mark :: Só é válido na tabela mangle.

Os mnemônicos a seguir estão disponíveis para “–set-xmark”:

  • –and-mark bits :: Faz um “and do ctmark” com os bits (mnemônico para “–set-xmark 0/invbits”, onde invbits é a negação binária dos bits).
  • –or-mark bits :: Faz um or do ctmark com os bits (mnemônico para “–set-xmark bits/bits”).
  • –xor-mark bits :: Faz um xor do ctmark com os bits (mnemônico para “–set-xmark bits/0”).
  • –set-mark value[/mask] :: Define a marca da conexão. Se uma máscara for especificada, apenas os bits definidos na máscara são modificados.
  • –save-mark [–mask mask] :: Copia a nfmark para a ctmark. Se uma máscara for especificada, apenas os bits são copiados.
  • –restore-mark [–mask mask] :: Copia a ctmark para a nfmark. Se uma máscara for especificada, apenas os bits são copiados. Isso só é válido na tabela mangle.

connsecmark :: Este módulo copia as marcas de segurança dos pacotes para as conexões (se não marcados), e de conexões de volta para os pacotes (também se não marcados). Normalmente é utilizado em conjunto com secmark, só é válido na tabela mangle.

  • –save :: Se o pacote tem uma marcação de segurança, copia para a conexão se a conexão não está marcada.
  • –restore :: Se o pacote não tiver uma marca de segurança e a conexão está feita, copia a marca de segurança da conexão para o pacote.

ct :: O alvo “ct” permite definir parâmetros para um pacote ou para as suas conexões. O alvo atribui um “template” para a entrada de conexão de rastreamento do pacote, que é então utilizado pelo núcleo conntrack ao inicializar uma nova entrada no ct. Este alvo, portanto, só é válida na tabela raw.

  • –notrack :: Desativa o rastreamento de conexão dos pacotes.
  • –helper name :: Use a ajuda identificando a conexão pelo nome. É mais flexível do que utilizar os módulos conntrack helper com portas predefinidas.
  • –ctevents event[,…] :: Apenas gera os eventos conntrack especificados para a conexão. Tipos de eventos possíveis são: : new, related, destroy, reply, assured, protoinfo, helper, mark (refere-se a ctmark, notnfmark), natseqinfo, secmark (ctsecmark).
  • –expevents event[,…] :: Apenas gera os eventos especificados para a conexão. Tipos de eventos possíveis são: new.
  • –zone id :: Atribui o pacote para a zona id e só faz pesquisas nesta zona. Por padrão, os pacotes têm zona 0.

dnat :: Este alvo só é válido na tabela nat, nas chains prerouting e output e chains definidas pelo usuário que são chamadas somente a partir dessas chains. Ele especifica que o endereço de destino do pacote deve ser modificado (e todos os outros pacotes, neste contexto, também serão modificados) e as regras deixam de ser examinadas. É preciso um tipo de opção:

  • –to-destination [ipaddr][-ipaddr][:port[-port]] :: Que pode especificar um novo endereço IP de destino único, uma gama abrangente de endereços IP e, opcionalmente, uma gama de portas (que só são válidas se a regra também especifica -p tcp ou -p udp). Se nenhum intervalo de porta for especificado, então a porta de destino nunca será modificada. Se nenhum endereço IP for especificado, então somente a porta de destino será modificada.

    Em kernels até 2.6.10 você pode adicionar várias opções –to-destination. Para esses kernels, se você especificar mais de um endereço de destino, quer através de um intervalo de endereços onde múltiplas opções “–to-destination”, um simples round-robin (um após o outro no ciclo) com balanceamento de carga ocorre entre esses endereços. kernels posteriores (>= 2.6.11-rc1) não têm mais a capacidade de nat para vários intervalos.

  • –random :: Se a opção –random for usada, então o mapeamento de porta será randomizado (kernel >= 2.6.22).
  • –persistent :: Entrega para um cliente o mesmo source-/destination-address para cada conexão. Substitui o alvo same. O suporte para mapeamentos persistentes está disponível a partir do kernel 2.6.29-rc2.

Nota do tradutor: Com o “dnat” é possível alterar o endereço de destino dos pacotes que combinarem com a regra criada.

iptables -t nat prerouting -i eth0 -j dnat –to 172.16.1.123

Nesta regra, todos os pacotes que entrarem pela interface de rede eth0 terão o endereço de destino alterados para 172.16.1.123.

dscp :: Este alvo permite alterar o valor dos bits DSCP dentro do cabeçalho tos do pacote IPv4. Como manipula um pacote, pode ser utilizado apenas na tabela mangle.

  • –set-dscp value :: Define o campo DSCP para um valor numérico (pode ser hexadecimal ou decimal)
  • –set-dscp-class class :: Define o campo DSCP para a uma classe diffserv.

ecn :: Esse alvo permite contornar seletivamente os blackholes ecn conhecidos. Ele pode ser utilizado apenas na tabela mangle.

  • –ecn-tcp-remove :: Remove todos os bits ECN do cabeçalho TCP. Só pode ser utilizado em conjunto com -p tcp.

log :: Ativa o log do kernel para os pacotes. Quando esta opção está definida em uma regra, o kernel Linux irá mostrar algumas informações sobre todos os pacotes correspondentes (como os campos do cabeçalho IP) através do registro no kernel (onde pode ser lido com dmesg ou syslogd (8)).

Este é um “alvo não-terminante”, isto é, uma regra continua na próxima regra. Então, se você deseja registrar os pacotes que você recusa, use duas regras separadas com os mesmos critérios de correspondência, primeiro usando log, então drop (ou reject).

  • –log-level level :: Nível de log (numérico ou veja syslog.conf (5)).
  • –log-prefix prefix :: Prefixo mensagens de log com o prefixo especificado; até 29 letras, é útil para distinguir mensagens nos logs.
  • –log-tcp-sequence :: Acessa os números de sequência TCP. Este é um risco de segurança se o registro for acessado por usuários.
  • –log-tcp-options :: Acessa as opções do cabeçalho do pacote TCP.
  • –log-ip-options :: Acessa as opções do cabeçalho do pacote IP.
  • –log-uid :: Acessa o userid do processo que gerou o pacote.

Nota do tradutor: uma regra básica para gerar um arquivo de log dos acessos pela porta 22, SSH:

iptables -a input -p tcp –dport 22 -i eth0 -j log –log-prefix “firewall-ssh”

Alterando a porta você tem o log do serviço desejado.

mark :: Este alvo é utilizado para definir o valor do netfilter associado com o pacote. O alvo pode ser utilizado apenas na tabela mangle. Ele pode, por exemplo, ser utilizado em conjunto com o roteamento baseado em fwmark (precisa iproute2). Tem tamanho de 32 bits.

  • –set-xmark value[/mask] :: Zera os bits dados pela máscara e faz um xor com o valor da marca do pacote (“nfmark”). Se a máscara for omitida, 0xffffffff é assumido.
  • –set-mark value[/mask] :: Zera os bits dados pela máscara e faz um or com o valor da marca do pacote. Se a máscara for omitida, 0xffffffff é assumido.

Os mnemônicos a seguir, estão disponíveis:

  • –and-mark bits :: Faz um and da nfmark com os bits (mnemônico para “–set-xmark 0/invbits”, onde “invbits” é a negação binária dos bits).
  • –or-mark bits :: Faz um or da nfmark com os bits (mnemônico para–set-xmark bits/bits).
  • –xor-mark bits :: Faz um xor da nfmark com os bits (mnemônico para–set-xmark bits/o).

masquerade :: Este alvo só é válido na tabela nat na chain postrouting. Ele só deve ser utilizado com IP atribuído dinamicamente (dialup): se você tem um endereço IP estático, você deve usar o alvo snat.

O mascaramento é equivalente a especificar um mapeamento do endereço de IP dos pacotes da interface de saída. Quando a interface estiver desligada a conexão é perdida. Este é o comportamento correto quando a conexão seguinte seja pouco provável que tenha o endereço mesma interface (e, portanto, todas as conexões estabelecidas serão perdidas de qualquer maneira).

É preciso uma opção:

  • –to-ports port[-port] :: Especifica uma faixa de portas de origem, substituindo o padrão snat de seleção heurística de porta (ver acima). Isso só é válido se a regra também especifica -p tcp ou -p udp.
  • –random :: Randomiza o mapeamento da porta de origem (kernel >= 2.6.21).

mirror :: É uma demonstração experimental que inverte a origem e os campos de destino do cabeçalho IP e retransmite o pacote. Só é válido nas chains input, forward e prerouting e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains.

Note que os pacotes de saída não são vistos por qualquer filtragem de pacotes, roteamento de conexões ou nat para evitar loops e outros problemas.

netmap :: Esse alvo permite mapear estaticamente toda uma rede de endereços para outra rede de endereços. Ele só pode ser utilizado a partir de regras na tabela nat.

  • –to address[/mask] :: Endereço de rede para mapear. O endereço resultante será construído da seguinte maneira: todos os bits 1 da máscara são preenchidos a partir do ‘endereço’ novo. Todos os bits zero na máscara são preenchidos a partir do endereço de origem.

nflog :: Este alvo fornece logging dos pacotes. Quando este alvo está definido para uma regra, o kernel do Linux vai passar o pacote para o registro back-end para registrar o pacote.

Isso geralmente é utilizado em combinação com “nfnetlink_log” como back-end de registro, que será o pacote multicast através de um soquete netlink para um grupo específico de multicast.

Processos userspace podem se inscrever para o grupo para receber os pacotes. Como o log, este é um alvo não-terminante, ou seja, a regra atual continua na próxima regra.

  • –nflog-group nlgroup :: Define o grupo de netlink (1 – 2 ^ 32-1) a que os pacotes pertencem (aplicável apenas para nfnetlink_log). O valor padrão é 0.
  • –nflog-prefix prefix :: chain de prefixo para incluir na mensagem de registo, até 64 caracteres, útil para distinguir mensagens nos logs.
  • –nflog-range size :: Número de bytes a serem copiados para o userspace (aplicável apenas para nfnetlink_log). Caso o nfnetlink_log especificar seu próprio range, esta opção o substitui.
  • –nflog-threshold size :: Número fila de pacotes do kernel antes de enviá-los para o userspace (aplicável apenas para nfnetlink_log). Valores mais altos resultam em menos sobrecarga por pacote, mas demora mais até que os pacotes procurem o userspace. O valor padrão é 1.

nfqueue :: Este alvo é uma extensão do alvo “queue”. Ao contrário de queue, ele permite que você coloque um pacote em qualquer fila específica, identificada pelo seu número de fila de 16 bits.

Ele só pode ser utilizado com as versões do kernel 2.6.14 ou acima, uma vez que exige o apoio do kernel nfnetlink_queue. A opção “queue-balance” foi adicionada no linux 2.6.31.

  • –queue-num value :: Isso especifica o número da fila. Números de fila válidos são de 0 a 65535. O valor padrão é 0.
  • –queue-balance value:value :: Isto especifica uma série de filas. Os pacotes são então equilibrados entre as filas de dados. Isso é útil para sistemas multicore: inicia várias instâncias do programa userspace em queues x, x+1, .. x+n and use “–queue-balance x:x+n”. Pacotes pertencentes à mesma conexão são colocados na mesma nfqueue.

notrack :: Este alvo desativa o rastreamento de conexões. Ela pode apenas ser utilizado na tabela raw.

rateest :: O alvo rateest coleta estatísticas, realiza cálculo de estimativa de taxas e salva os resultados para posterior avaliação.

  • –rateest-name name :: Conta os pacotes combinados no pool referido pelo nome, que é de escolha livre.
  • –rateest-interval amount{s|ms|us} :: Intervalo de taxa de medição em segundos, milissegundos ou microssegundos.
  • –rateest-ewmalog value :: Medição da taxa média de tempo constante.

redirect :: Este alvo só é válido na tabela nat nas chains prerouting e output e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains. Ele redireciona o pacote para a própria máquina, alterando o IP de destino para o endereço principal da interface de entrada (pacotes gerados localmente são mapeados para o endereço 127.0.0.1).

  • –to-ports port[-port] :: Especifica uma porta de destino ou intervalo de portas: sem isso a porta de destino nunca é alterada. Isso só é válido se a regra também especifica “-p tcp”, ou “-p udp”.
  • –random :: Se a opção “–random” for usada, então os mapeamentos de portas serão randomizados (kernel >= 2.6.22).

reject :: É utilizado para enviar de volta um pacote de erro em resposta ao pacote combinado: caso contrário, é equivalente a drop por isso é um target terminado, finalizando a regra em execução.

Esse alvo é válido apenas nas chains input, forward e output e nas chains definidas pelo usuário que são chamadas somente a partir dessas chains. A seguinte opção controla a natureza do pacote de erros retornados:

  • –reject-with type :: O tipo de dado pode ser icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited ou icmp-admin-prohibited (*) que retorna a mensagem de erro icmp apropriada (port-unreachable é o padrão).

A opção “tcp-reset” pode ser usada em regras que correspondem apenas ao protocolo TCP: isso faz com que um pacote TCP RST seja enviado de volta. Isto é principalmente útil para bloquear sondagem ident (113/TCP) que frequentemente ocorrem ao enviar e-mail para hosts de correio quebrados (que não vai aceitar o e-mail de qualquer maneira).

(*) Usando icmp-admin-prohibited com kernels que não suportam irá resultar em drop ao invés de reject.

same :: Similar ao snat/dnat dependendo da chain: é preciso um intervalo de endereços (“–to 1.2.3.4-1.2.3.7”) e dá ao cliente o mesmo source-/destination-address para cada conexão.

  • nb :: o alvo dnat com a opção “–persistent” substitui alvo “same”.
  • –to ipaddr[-ipaddr] :: Endereços para mapear a origem. Pode ser especificado mais de uma vez para vários intervalos.
  • –nodst :: Não utiliza IP de destino nos cálculos quando seleciona um novo endereço IP de origem.
  • –random :: O mapeamento de portas será forçosamente randomizado para evitar ataques baseados na previsão de porta (kernel >= 2.6.21).

secmark :: Isto é utilizado para definir o valor da marca de segurança associado com o pacote para uso de subsistemas de segurança, tais como o SELinux. Só é válido na tabela mangle. Tem 32 bits de tamanho.

  • –selctx security_context

set :: Este módulo adiciona e/ou exclui entradas de conjuntos de IP que podem ser definidas pelo ipset (8).

  • –add-set setname flag[,flag…] :: Adiciona o(s) endereço(s)/porta(s) do pacote para os conjuntos.
  • –del-set setname flag[,flag…] :: Apaga o(s) endereço(s)/porta(s) do pacote a partir dos conjuntos onde as flags são especificações src e/ou dst e não pode haver mais do que seis delas.

O uso de “-j” set exige que o kernel tenha suporte para ipset. Como kernels padrões não possuem, o pacote ipset ou xtables-addons precisa ser instalado.

snat :: Este alvo só é válido na tabela nat na chain postrouting. Ele especifica que o endereço de origem do pacote deve ser modificado (e todos os outros pacotes, neste contexto, também serão modificados), e as regras deixam de ser examinadas. É preciso um tipo de opção:

  • –to-source ipaddr[-ipaddr][:port[-port]] :: Que pode especificar um novo endereço IP de origem único, um range abrangente de endereços IP e, opcionalmente, um range de portas (que só é válido se a regra também especifica -p tcp ou -p udp).

    Se nenhum intervalo de porta for especificado, então as portas de origem abaixo de 512 serão mapeadas para outras portas abaixo de 512; aquelas entre 512 e 1023, inclusive, serão mapeadas para portas abaixo de 1024, e outras portas serão mapeadas para portas acima de 1024, inclusive.

    Sempre que possível, nenhuma alteração de porta será feita em kernels até 2.6.10, você pode adicionar várias opções “–to-source”. Para esses kernels, se você especificar mais de um endereço de origem, quer através de um intervalo de endereços ou múltiplas opções “–to-source”, um simples round-robin (um após o outro no ciclo) ocorre entre esses endereços. kernels posteriores (>= 2.6.11-rc1) não têm mais a capacidade de nat para vários intervalos.

  • –random :: Se a opção “–random” for usada, então os mapeamentos de portas serão randomizados (kernel >= 2.6.21).
  • –persistent :: Dá a um cliente o mesmo “source-/destination-address” para cada conexão. Substitui o alvo same. O suporte para mapeamentos persistentes está disponível a partir de 2.6.29-rc2.

Nota do tradutor: Com o snat ( source nat ) é possível alterar o endereço de origem no cabeçalho (header) dos pacotes que combinam com a regra criada.

# iptables -t nat -a postrouting -o eth0 -j snat –to 172.16.1.123

Nesta regra, todos os pacotes que saírem pela interface de rede eth0 terão os endereços de origem alterados para 172.16.1.123.

tcpmss :: Esse alvo permite alterar o valor MSS de pacotes TCP SYN para controlar o tamanho máximo da conexão (geralmente limitando a MTU de sua interface de saída para menos 40 no IPv4 ou 60 para IPv6). É claro, que só pode ser utilizado em conjunto com -p tcp e só é válido na tabela mangle.

Este alvo é utilizado para levar a melhor sobre “isps braindead” mal intencionados, ou para servidores que bloqueiam “icmp fragmentation needed” ou pacotes “icmpv6 packet too big”.

Os sintomas deste problema são que tudo funciona bem a partir do seu GNU/Linux firewall/router, mas as máquinas por trás dele nunca pode trocar pacotes grandes:

  1. Os navegadores da web conectam, mas não recebem dados.
  2. E-mails pequenos funcionam bem, mas e-mails grandes travam.
  3. SSH funciona bem, mas o SCP trava depois do handshaking inicial.

A solução é ativar essa opção e adicionar a seguinte regra na configuração do firewall:

iptables -t mangle -a forward -p tcp –tcp-flags syn,rst syn -j tcpmss –clamp-mss-to-pmtu
–set-mss value

Ela define explicitamente a opção MSS para o valor especificado. Se o MSS do pacote é menor do que o valor, então não vai ser aumentado (de Linux 2.6.25 em diante). Evitar problemas com hosts depende de um MSS adequado.

–clamp-mss-to-pmtu :: O valor MSS é ajustado automaticamente para path_mtu -40 para IPv4 e -60 para IPv6. Isto pode não funcionar como desejado, pois onde existem rotas assimétricas com diferentes caminhos MTU, o kernel utiliza o caminho MTU que iria utilizar para enviar pacotes de si mesmo para endereços IP de origem e destino.

Antes do Linux 2.6.25, apenas o caminho MTU para o endereço IP de destino era considerado para esta opção; kernels subsequentes também consideram o caminho MTU para o endereço IP de origem. Estas opções são mutuamente exclusivas.

tcpoptstrip :: Este alvo tira as opções TCP fora de um pacote TCP (ela vai substituí-las por no-ops) você vai precisar adicionar os parâmetros “-p tcp”.

  • –strip-options option[,option…] :: Tira a(s) opções dada(s). As opções podem ser especificadas pela opção de número do TCP ou pelo nome simbólico.

A lista de opções reconhecidas podem ser obtidas com:

iptables with -j tcpoptstrip -h

tos :: Este módulo define o campo tipo de serviço no cabeçalho IPv4 (incluindo o “precedence” bits) ou define o campo “priority”no cabeçalho IPv6. Note que os tos compartilham os mesmos bits DSCP e ECN. O alvo tos só é válido na tabela mangle.

  • –set-tos value[/mask] :: Zera os bits dados pela máscara e faz um xor nos campos ToS/priority. Se a máscara for omitida, 0xff é assumido.
  • –set-tos symbol :: Especifica um nome simbólico quando utiliza o alvo tos para IPv4. Ele implica uma máscara de 0xff.

A lista de nomes reconhecidos ToS, pode ser obtida pelo:

# iptables with -j tos -h

Os mnemônicos a seguir, estão disponíveis:

  • –and-tos bits :: Faz um and do valor tos com os bits (mnemônico para –set-tos 0/invbits, onde invbits é a negação binária dos bits).
  • –or-tos bits :: Faz um “or” do valor tos com os bits (mnemônico para –set-tos bits/bits).
  • –xor-tos bits :: Faz um “xor” do valor tos com os bits (mnemônico para “–set-tos bits/0”).

tproxy :: Este alvo só é válido na tabela mangle na chain prerouting e nas chains definidas pelo usuário que são chamadas somente a partir desta chain. Ele redireciona o pacote para um socket local sem alterar o cabeçalho do pacote. Pode também alterar o valor da marca que pode então ser usado em regras avançadas de roteamento. Leva três opções:

  • –on-port port :: Especifica uma porta de destino a ser usada. É uma opção desejada, 0 significa que a porta de destino é a mesma que a original. Isso só é válido se a regra também especifica “-p tcp”, ou “-p udp”.
  • –on-ip address :: Especifica um endereço de destino. Por padrão, é o endereço IP da interface de entrada. Isso só é válido se a regra também especificar “-p tcp”, ou “-p udp”.
  • –tproxy-mark value[/mask] :: Marca os pacotes com value/mask. O valor ajustado fwmark pode ser utilizado para roteamento avançado (necessário para o proxy transparente trabalhar, caso contrário estes pacotes serão encaminhados, o que provavelmente não é o que você quer).

trace :: Este alvo marca pacotes para o kernel registrar cada regra com os pacotes que atravessam as tabelas, as chains e as regras (os módulo ipt_log ou ip6t_log são necessários).

Os pacotes são registrados com o prefixo string: “trace: tablename:chainname:type:rulenum” onde o tipo pode ser “rule” para a regra simples, “return” para regra implícita no final de uma chain definida pelo usuário e “policy” para a política construída nas chains. Ele pode apenas ser utilizado na tabela raw.

ttl :: É utilizado para modificar o campo TTL do cabeçalho IPv4. O campo TTL determina quantos saltos (roteadores) que um pacote pode atravessar até o tempo de vida.

Definir ou incrementar o campo TTL pode ser potencialmente muito perigoso por isso deve ser evitado a qualquer custo.

Nunca defina ou incremente o valor dos pacotes que deixam sua rede local!

mangle table.
–ttl-set value – Define o valor TTL para ‘valor’.
–ttl-dec value – Decrementa o valor do campo TTL.
–ttl-inc value – Incrementa o valor do campo TTL.

ulog :: Este alvo fornece o log do userspace dos pacotes. Quando está definido para uma regra, o kernel do Linux será multicast para este pacote através de um soquete netlink.

Um ou mais processos do usuário podem então inscrever vários grupos de multicast e receber os pacotes. Tal como log, este é um “alvo não-terminante”, isto é, a regra atual continua na próxima regra.

  • –ulog-nlgroup nlgroup :: Isto especifica o grupo netlink (1-32) para o qual o pacote é enviado. O valor padrão é 1.
  • –ulog-prefix prefix :: Estabelece o prefixo das mensagens de log; até 32 caracteres, é útil para distinguir mensagens nos logs.
  • –ulog-cprange size :: Número de bytes a serem copiados para o espaço do usuário. O valor de 0 sempre copia o pacote inteiro, independentemente de seu tamanho. O padrão é 0.
  • –ulog-qthreshold size :: Número de pacotes para a fila dentro do kernel. Definir esse valor como, por exemplo, 10, acumula 10 pacotes dentro do kernel e os transmite como uma mensagem netlink multipart para o userspace. O padrão é 1 (para compatibilidade com versões anteriores).

Diagnósticos / Compatibilidade / Autores

Diagnósticos

Várias mensagens de erro são mostradas para os erros padrões. O código de saída é 0 para o funcionamento correto.

Erros que podem ser causados por parâmetros de linha de comandos inválidos causam um código de saída 2 e outros erros causam um código com a saída 1.

Bugs: Bugs? O que é isso? 😉

Bem, você pode querer olhar para: http://bugzilla.netfilter.org/

Compatibilidade com ipchains

Este iptables, é muito semelhante ao ipchains do rusty russell. A principal diferença é que as chains input e output somente são atravessadas pelos pacotes entrando na máquina local e originários do host local, respectivamente.

Por isso, cada pacote somente passa através de uma das três chains (exceto o tráfego de loopback que envolve as chains input e output); anteriormente, um pacote encaminhado iria passar por todos as três.

A outra diferença principal é que “-i” refere-se à interface de entrada e “-o” refere-se à interface de saída e ambas estão disponíveis para os pacotes que entram na chain forward.

As várias formas de nat foram separadas; iptables é um filtro de pacotes puro quando utiliza a tabela “filter” padrão com módulos de extensão opcionais. Isso deve simplificar muito da confusão anterior sobre a combinação de mascaramento de IP e filtragem de pacotes.

Assim, as opções são tratadas de forma diferente:

  • -j masq
  • -m -s
  • -m -l

Existem várias outras mudanças no iptables.

Veja também:

  • iptables-save (8), o iptables-restore (8), ip6tables (8), ip6tables-save (8), ip6tables-restore (8), libipq (3).
  • The packet-filtering-howto details iptables usage for packet filtering, the nat-howto details nat, the netfilter-extensions-howto details the extensions that are not in the standard distribution, and the netfilter-hacking-howto details the netfilter internals.
  • http://www.netfilter.org/

Autores

  • Rusty Russell originally wrote iptables, in early consultation with Michael Neuling.
  • Marc Boucher made rusty abandon ipnatctl by lobbying for a generic packet selection framework in iptables, then wrote the mangle table, the owner match, the mark stuff, and ran around doing cool stuff everywhere.
  • James Morris wrote the tos target, and tos match.
  • Jozsef Kadlecsik wrote the reject target.
  • Harald Welte wrote the ulog and nfqueue target, the new libiptc, as well as the ttl, dscp, ecn matches and targets.
  • The netfilter core team is: Marc Boucher, Martin Josefsson, Yasuyuki Kozakai, Jozsef Kadlecsik, Patrick Mchardy, James Morris, Pablo Neira Ayuso, Harald Welte and Rusty Russell.
  • Man page originally written by Herve Eychenne <rv@wallfire.org>. iptables 1.4.8 iptables(8)

Deixe uma resposta

Seu e-mail não será publicado.