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

Tradução do manual do IPtables com alguns comentários, explicações e sugestões de algumas regras.

[ Hits: 96.221 ]

Por: Buckminster em 11/03/2013


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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Outras opções / Match Extensions
   3. Match Extensions (Parte 1)
   4. Match Extensions (Parte 2)
   5. Extensões alvo
   6. Diagnósticos / Compatibilidade / Autores
Outros artigos deste autor

Como agendar um backup automático do PostgreSQL no Cron evitando o problema de senha

Instalar Minecraft, League of Legends e Fortnite no Linux

Compilando kernel no Debian Squeeze

IPv6, DNSv6 e DHCPv6

Redes de Computadores · IPtables · Endereços IPs - Explicações básicas

Leitura recomendada

Firewall para o dia a dia

IPTables - Desvendando o mistério

Um pouco sobre IPtables

Criando DMZ com o PFSense

Como criar um firewall de baixo custo para sua empresa

  
Comentários
[1] Comentário enviado por danniel-lara em 11/03/2013 - 19:59h

Parabéns ,
Ficou Bagual mesmo o Artigo
já esta nos favoritos , assim o dia que vir um Manolo querendo saber sobre Iptables
já tenho uma boa referencia de leitura para o vivente

[2] Comentário enviado por Buckminster em 11/03/2013 - 20:35h

Obrigado, tchê!

[3] Comentário enviado por l0g1in em 12/03/2013 - 01:16h

Parabéns ficou massa, tudo bem explicadinho e de facil compreensão belo manual e parabéns por disponibilizar seu tempo e seu conhecimento para galera do VOL, o mundo Software Livre agradece! [];

[4] Comentário enviado por Buckminster em 12/03/2013 - 02:14h

Grato. Estamos aí, fuçando no Linux.

[5] Comentário enviado por cruzeirense em 12/03/2013 - 10:37h

Parabens cara! Algo muito útil...

[6] Comentário enviado por Buckminster em 12/03/2013 - 15:41h

Grato. Estamos aí.

[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h

Muito bom !!! Parabéns.

[8] Comentário enviado por Buckminster em 13/03/2013 - 12:58h


[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h:

Muito bom !!! Parabéns.


Obrigado.

[9] Comentário enviado por phrich em 15/03/2013 - 16:48h

Excelente artigo!

[10] Comentário enviado por Buckminster em 15/03/2013 - 23:41h


[9] Comentário enviado por phrich em 15/03/2013 - 16:48h:

Excelente artigo!


Obrigado.


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.

[12] Comentário enviado por Buckminster em 02/04/2013 - 14:54h


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h:

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.


Obrigado. A intenção foi essa mesma.

[13] Comentário enviado por IgorBruttal em 24/08/2013 - 06:58h

Muito bom, parabéns!

[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!

[15] Comentário enviado por Buckminster em 27/09/2013 - 02:24h


[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h:

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!


Cria uma VPN entre as redes e depois tendo os servidores pingando as estações da rede remota através da VPN, faça o masquerade via Iptables da matriz para as filais.

Mais ou menos assim:

iptables -t nat -A POSTROUTING -s 172.16.16.0/xx -o tun0 -j MASQUERADE << Iptables Matriz


Depois libera a comunicação no FORWARD do servidor da Matriz e Filiais


Iptables Matriz:

iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.17.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.18.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.19.0/xx -j ACCEPT

iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.16.0 -p icmp -j ACCEPT

Iptables Filiais (essas duas regras abaixo você coloca em cada Iptables das filiais mudando os endereços de rede para cada filial):

iptables -A FORWARD -s 172.16.17.0/xx -d 172.16.16.0/xx -j ACCEPT
iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.17.0/xx -p icmp -j ACCEPT

É mais ou menos isso. De repente você precise acrescentar uma regra ou outra, mas acredito que assim já dá para você ter uma boa idéia.

E como teu Squid não é transparente é só setar o proxy da matriz nos navegadores e redirecionar para ele no servidor da matriz com Iptables.

[16] Comentário enviado por removido em 18/11/2013 - 14:46h

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.

[17] Comentário enviado por Buckminster em 30/11/2013 - 01:19h


[16] Comentário enviado por tropper em 18/11/2013 - 14:46h:

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.


Obrigado.

[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h

Tu é o cara! Parabéns novamente!

[19] Comentário enviado por Buckminster em 16/12/2013 - 13:10h


[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h:

Tu é o cara! Parabéns novamente!


Obrigado!

[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!

[21] Comentário enviado por Buckminster em 10/01/2014 - 10:48h


[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h:

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!


Obrigado.

O Google Tradutor é uma ótima ferramenta. Eu uso sempre quando estou com preguiça de traduzir um texto grande, depois é só ajeitar algumas coisas na tradução.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts