Ver Feed RSS

The JEdi lair's

Netfilter/Iptables - Parte 3

Avalie este Post de Blog
Continuando mais uma vez...
Novamente, foram atingidos(sic) os 10000 caracteres. Vamos continuar com as matchs...

Obs importante: Os familiarizados com Netfilter/Iptables e estiverem sentindo falta dos target (-j) por favor não se incomodem. Estou fazendo dessa forma de modo a não atropelar conteúdos e facilitar a compreensão futura. Pra que serve uma regra sem target? Contabilidade! Regras sem targets não tomam decisões quanto ao pacotes mas geram estatísticas através dos contadores. Útil.

6 - Matchs Extensions (continuação)
Continuando com as matchs extensions...

state
Verifica, usado em conjunto com o módulo nf_conntrack(ip_conntrack), o estado da conexão para um pacote. Os seguintes estados são válidos:
  • NEW
    Verifica se o pacote é relacionado com uma nova conexão. Não necessariamente o pacote precisa ter somente a flag SYN setada.
  • RELATED
    Verifica se o pacote está relacionado a uma conexão já iniciada porém não estabelecida. Esse estado ocorre no segundo pacote relacionado com uma conexão, no caso um pacote TCP com SYN+ACK.
  • ESTABLISHED
    Verifica se o pacote está relacionado com uma conexão já estabelecida. Ocorre após o processo do three way handshake (RFC 793).
  • INVALID
    Verifica se o pacote é inválido. Ocorre, por exemplo, no caso de um pacote com o flag RST setado sem estar relacionado a uma conexão estabelecida.

Para ativa-lo, o parâmetro -m state deve ser especificado. A seguinte funcionalidade é adicionada:
--state state
Verifica o estado do pacote. state deve ser especificado como uma lista separada por virgulas.

ex: iptables -A INPUT -m state --state RELATED,ESTABLISHED -p tcp
|
\-> Essa regra irá conferir com pacotes entrado no filtro através do protocolo TCP que já tenham passado pelo processo do three way handshake.

ex: iptables -t nat -A PREROUTING -p tcp ! --syn -m state --state NEW
|
\-> Essa regra irá conferir com pacotes chegando no filtro através do protocolo TCP sem a flag SYN setada iniciando uma nova conexão.
6.1 - Outras matchs
Bem pessoal, as matchs citadas acima são o que eu considero o básico para se "brincar" com o Netfilter/Iptables em uma rede TCP/IP. Recomendo também que os leitores busquem informações sobre as seguintes matchs:
  • addrtype
  • conntrack
  • helper
  • recent
  • set

7 - Targets
Até agora nos vimos como manipular as chains, definir regras baseados em parâmetros e match extension mas ainda não tomamos nenhuma decisão sobre o pacote. Para a tomada de decisão usamos o parâmetro -j TARGET. TARGET pode ser uma target padrão, um target extension ou uma chain definida pelo usuário.

O Netfilter/Iptables pode tormar, por padrão, quatro decisões acerca de um pacote:
  • ACCEPT
    Aceita o pacote.
  • DROP
    Derruba o pacote
  • RETURN
    Esse target só pode ser usado em uma chain definida pelo usuário. Server para desviar a checagem de volta para a chain que a referenciou. Explico melhor nos exemplos.
  • QUEUE
    Essa target envia o pacote para que seja avaliado por uma ferramenta de userspace.

Exemplos:
iptables -t NAT -A PREROUTING -p tcp ! --syn -m state --state NEW -j DROP
|
\-> Essa regra irá conferir com pacotes chegando no filtro através do protocolo TCP sem a flag SYN setada sem estar relacionada a nenhuma conexão estabilizada. A tomada de decisão do filtro de pacotes será derrubar esse tráfego. Simples, não?
iptables -N ssh
iptables -A INPUT -p tcp --dport 22 -j ssh

iptables -A ssh -s 10.0.0.2 -j ACCEPT
iptables -A ssh -s 10.0.0.3 -j ACCEPT
iptables -A ssh -m iprange --src-range 10.0.0.30-10.0.0.40 -j RETURN
E agora? Bem, lembram-se do primeiro post? o -N adiciona uma nova chain, então de acordo com a primeira regra estamos adicionando uma chain chamada ssh na tabela filter (lembram também que ela é a tabela padrão?). Na segunda regra, estamos adicionando uma regra na chain INPUT da tabela filter que nos diz que todos os pacotes com protocolo TCP destinados a porta 22 sejam redirecionados para a chain ssh.

Já no segundo conjunto de regras, a primeira nos diz para aceitarmos pacotes originados pelo IP 10.0.0.2. Na segunda, dizemos o mesmo para o endereço 10.0.0.3 . E ná ultima? Bem, dizemos que o range de endereços, opção ativada pelo -m iprange, sejam redirecionadas de volta a chain que chamou a chain ssh. Complicado? Nem um pouco! Com a regra return nos enviamos o pacote de volta para a chain de origem de forma que outras regras tomem decisões sobre o pacote.

A target QUEUE serve para a execução de verificações customizadas, sendo essas feitas em espaço de usuário. Por exemplo, o Snort Inline utiliza-se da target QUEUE para desviar o pacote para seu engine de forma que possa avaliar o pacote baseado em suas regras de payload e seus pre-processadores.

8 - Target Extensions
Assim como as match extensions, as target extensions vem para aumentar a funcionalidade do filtro de pacotes. Com elas podemos fazer diversos tipos de ações nos pacotes tais quais definir sua prioridade, marcá-lo, inserir uma entrada no log do sistema, dentre outras.

CLASSIFY
Essa extensão possibilita definir a classe do pacote. As classes estão relacionadas com as disciplinas de enfileiramento baseadas em classe, como o CBQ e o HTB. Por exemplo, se temos a hierarquia de classes 10 10:100 10:1000, a seguinte regra colocaria os pacotes SYN em estado de conexão nova com destino a máquina 10.2.0.1 na classe 10:100
iptables -t mangle -A FORWARD -p tcp --syn -m state --state NEW -d 10.2.0.1 -j CLASSIFY --set-class 10:100
Para um melhor entendimento das disciplinas de enfileiramento recomendo a leitura do http://lartc.org e da apresentação do presente em http://eriberto.pro.br.

DNAT
Esse target está presente na maioria das dúvidas presentes no fórum do Under-Linux. Ela basicamente modifica o endereço de destino do pacote e de todos os pacots associados. Seu principal parâmetro é mostrado a seguir:
--to-destination ip[-ip][:port[-port]]
O endereço de destino será alterado para o IP definido em ip, ou o range de endereços ip-ip e a porta será modificada para port ou para o range de portas port-port.

ex: iptables -t nat -A PREROUTING -p tcp --dport 22 -i eth0 -j DNAT --to-destination 10.2.0.1
|
\-> Essa regra irá redirecionar o tráfego de entrada na interface eth0 e porta de destino 22 para o endereço 10.2.0.1. Como não foi especificada porta de destino, a mesma passará inalterada.

iptables -t nat -A PREROUTING -p tcp --dport 80 -d 192.168.0.1 -j DNAT --to-destination 10.2.0.1-100
|
\-> Essa regra irá redirecionar o tráfego da porta 80 destinado para o endereço 192.168.0.1 para o range de IPs 10.2.0.1 até 10.2.0.100 inclusive.
Importante: O target DNAT só está presente na tabela nat e associada as chains PREROUTING e OUTPUT.

LOG
Essa chain permite registrar os dados do pacote no sistema de logs. Esse tipo de regra é conhecida como não terminativa, ou seja, após casar com o pacote e realizar a ação de logging o processamento das regras do Netfilter/iptables irá continuar.
--log-level level
Nível de logging que se deseja usar. Veja os detalhes no manual do syslog.

ex: iptables -A INPUT -p udp --dport 123 -j LOG --log-level debug
|
\-> A regra acima irá conferir com os datagramas UDP com destino a porta 123 e os registra com o nível debug.

--log-prefix prefix
Prefixo a ser inserido para facilitar a identificação da regra

ex: iptables -A INPUT -p tcp --dport 21 -j LOG --log-prefix "FTP: "
|
\-> A regra acima irá conferir com pacotes TCP destinados a port 21 e registrará-lo no log do sistema com o prefixo FTP:

--log-tcp-sequences
Registra as informações de sequencia do cabeçalho TCP

--log-tcp-options
Registra o campo de opções do cabeçalho TCP

--log-ip-options
Registra o campo de opções do cabeçalho IP

--log-uid
Registra o UID do usuário. Somente útil se o pacote for originado do host ao qual se encontra o filtro de pacotes.
Recomenda-se sempre usar um mecanismo que limite a escrita de registros no sistema. Portanto, não se admire se todas as regras de logging que encontr na Internet esteja associada a macth extension limit. Segue um exemplo abaixo:
iptables -P INPUT DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 -j inputeth0
iptables -A INPUT -p tcp -i eth1 -j inputeth1
iptables -A INPUT -m limit --limit 10/m -j LOG --log-prefix "[BAD PORT]"
|
\-> A primeira regra define a política padrão da chain INPUT, que, em nosso caso, foi definida para DROP. A segunda regra permitirá a passagem de pacotes que já tenham sido aceitos. inputeth0 e inputeth1 são chains personalizadas para verificar os pacotes que estão entrando na interface eth0 e eth1, respectivamente. Caso os pacotes não se enquadrem nas regras anteriores, ele será logado com o prefixo "[BAD PORT]". Para evitar uma negação de serviço que poderia ser gerada pela inundação dos logs, nos utilizamos a match limit para permitir apenas 10 registros por minuto.
Categorias
Dicas

Comentários


+ Enviar Comentário