Netfilter/Iptables - Parte 3
por
em 11-01-2009 às 15:57 (5234 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 state6.1 - Outras matchs
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.
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 sshE 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.
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
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:100iptables -t mangle -A FORWARD -p tcp --syn -m state --state NEW -d 10.2.0.1 -j CLASSIFY --set-class 10:100Para 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]]Importante: O target DNAT só está presente na tabela nat e associada as chains PREROUTING e OUTPUT.
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.
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 levelRecomenda-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:
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.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.
Comentários
+ Enviar Comentário