Debugger for Iptables

43

Estou procurando uma maneira fácil de seguir um pacote através das regras do iptables. Isso não é muito sobre o log, porque eu não quero registrar todo o tráfego (e eu só quero ter metas de LOG para muito poucas regras).

Algo como o Wireshark para o Iptables. Ou talvez até algo semelhante a um depurador para uma linguagem de programação.

Obrigado Chris

Nota: Não tem que ser uma ferramenta gráfica sofisticada. Mas deve fazer mais do que apenas mostrar um contador de pacotes ou algo assim.

Atualização: Quase parece que não conseguimos encontrar nada que forneça a funcionalidade solicitada. Nesse caso: Vamos pelo menos encontrar uma boa técnica baseada no registro em log do iptables - que pode ser facilmente ligado e desligado, e não requer a escrita redundante de regras do iptables (ter que escrever a mesma regra para -j LOG e -j ... )

    
por Chris Lercher 13.03.2010 / 12:00

6 respostas

9

Não consigo pensar em uma solução direta, mas posso pensar em uma rodada sobre como rastrear um pacote.

  1. Registre cada regra com uma diretiva de prefixo de log (--log-prefix "Rule 34")
  2. Gere um pacote de teste ou fluxo de pacotes com scapy e defina o campo TOS para algo único
  3. grep a saída do arquivo de log para essa configuração de TOS e veja quais regras a registraram.
por 16.03.2010 / 13:56
78

Se você tem um kernel recente e uma versão do iptables, você pode usar o alvo TRACE (parece estar embutido no Debian 5.0). Você deve definir as condições do seu rastreio para que sejam o mais específicas possíveis e desabilitar quaisquer regras do TRACE quando não estiver depurando, pois ele envia muitas informações para os logs.

TRACE
This target marks packes so that the kernel will log every rule which match the packets as those traverse the tables, chains, rules. (The ipt_LOG or ip6t_LOG module is required for the logging.) The packets are logged with the string prefix: "TRACE: tablename:chainname:type:rulenum " where type can be "rule" for plain rule, "return" for implicit rule at the end of a user defined chain and "policy" for the policy of the built in chains. It can only be used in the raw table.

Se você adicionou regras como esta

iptables -t raw -A PREROUTING -p tcp --destination 192.168.0.0/24 --dport 80 -j TRACE
iptables -t raw -A OUTPUT -p tcp --destination 192.168.0.0/24 --dport 80 -j TRACE

Você será fornecido com uma saída assim.

# cat /var/log/kern.log | grep 'TRACE:'
Mar 24 22:41:52 enterprise kernel: [885386.325658] TRACE: raw:PREROUTING:policy:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325689] TRACE: mangle:PREROUTING:policy:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325713] TRACE: nat:PREROUTING:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: nat:nat.1:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.12.152 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=80 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: mangle:INPUT:policy:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:INPUT:rule:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world:rule:1 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world_all_c1:return:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world:rule:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
Mar 24 22:41:52 enterprise kernel: [885386.325731] TRACE: filter:in_world_irc_c2:return:2 IN=eth0 OUT= MAC=00:1d:7d:aa:e3:4e:00:04:4b:05:b4:dc:08:00 SRC=192.168.32.18 DST=192.168.32.10 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=30561 DF PROTO=TCP SPT=53054 DPT=3128 SEQ=3653700382 ACK=0 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)
    
por 25.03.2010 / 06:53
6

Três respostas em um post:

1) Depurar por script:

#!/bin/bash
debug() {
    if [ -n "$debug" ]; then
        $@ || echo -e "The command which launched the error:\n$@"
    else
        $@
    fi
}
debug=1
IPTABLES="debug /sbin/iptables"

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
....

2) Depurar pelo syslog

A partir deste website: link

If you want to make a syslog entry of dropped packets, change:

# Drop all other traffic
/sbin/iptables -A INPUT -j DROP

To:

# Create a LOGDROP chain to log and drop packets
/sbin/iptables -N LOGDROP
/sbin/iptables -A LOGDROP -j LOG
/sbin/iptables -A LOGDROP -j DROP

# Drop all other traffic
/sbin/iptables -A INPUT -j LOGDROP


You may also want to configure the --log-level to log dropped packets to a separate file instead of /var/log/messages:

# Drop all other traffic
/sbin/iptables -A INPUT -j LOGDROP --log-level debug


/etc/syslog.conf change:

# Send iptables LOGDROPs to /var/log/iptables
kern.=debug                                             /var/log/iptables

Reload the syslogd service for the change to take effect.
/sbin/service syslog reload

3) Sem depuração, bom iptables editar:

Além disso, isso pode ser útil: link

    
por 16.03.2010 / 17:49
2

fez a mesma pergunta e descobriu que o Zoredache apontando para o TRACE / ipt_LOG era a solução!

Além disso, encontrei um script que insere / remove as regras de LOG que precedem todas as regras do iptables atualmente ativas. Eu tentei e achei que fosse uma ferramenta muito legal. - A saída é semelhante à solução TRACE - Vantagem: funciona na configuração ativa do iptables, não importando de onde foi carregado. Você pode ativar / desativar o login on the fly! Você não precisa modificar nenhum script de firewall que possa ter sido gerado pelo Firewall Builder ou ferramenta que você usa ... - Desvantagem: sem modificação, o script cria regras de LOG para TODAS as regras ativas. Em vez disso, ao usar regras TRACE, você provavelmente restringirá o registro em log a endereços / serviços / conexões para os quais deseja investigar o processamento de iptables agora.

De qualquer forma, eu gosto da abordagem :) Kudos para Tony Clayton, dê uma olhada: link

Atenciosamente, Chris

    
por 29.05.2016 / 19:50
0

Eu costumo usar pacotes e contadores de bytes para ver como as regras funcionam e descobrir o que está faltando ou errado.

Você pode visualizá-los por "iptables -nvL".

    
por 15.03.2010 / 13:14
-2

AFAIK um pacote IP atravessa a cadeia de regras até a primeira partida. Então eu realmente não vejo qual é o problema aqui. Se você tem:

  1. regra 1
  2. regra 2
  3. regra 3 LOG

E um pacote faz isso no log, isso significa que a regra 3 é a primeira regra de correspondência.

    
por 15.03.2010 / 13:39