Você está na página 1de 4

The JEdi lair's

Netfilter/Iptables - Parte 3
Avalie este Post de Blog
0 Trackbacks 0 Comentários
por
PEdroArthurJEdi
em 11-01-2009 às 14:57 (1992 Visualizações)
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. TARGETpode
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.

Tags: Nenhum
Categorias

Dicas

Você também pode gostar