iptables的调试器


47

我正在寻找一种通过iptables规则跟踪数据包的简便方法。这与日志无关,因为我不想记录所有流量(我只想为很少的规则提供LOG目标)。

诸如Wireshark for Iptables之类的东西。甚至可能类似于编程语言的调试器。

谢谢克里斯

注意:它不一定是精美的GUI工具。但是它不仅要做展示包裹计数器这样的事情。

更新:似乎我们找不到能够提供所需功能的任何东西。在这种情况下:让我们至少找到一种基于iptables日志记录的好技术-可以轻松打开和关闭它,并且不需要多余地编写iptables规则(必须为-j LOG和编写相同的规则-j ...

Answers:


10

我想不出直接的解决方案,但是我可以想一想有关跟踪数据包的方式。

  1. 使用日志前缀指令(--log前缀“规则34”)记录每个规则
  2. 生成带有漏斗的测试数据包或数据包流,并将TOS字段设置为唯一
  3. grep该TOS设置的日志文件输出,并查看记录了哪些规则。

谢谢你的主意。不幸的是,我无法记录所有规则(在一个系统上,磁盘可能不够快,无法执行该操作。在另一个系统上,iptables日志记录在内核中不可用。)
Chris Lercher 2010年

1
使用命名管道作为文件 softpanorama.org/Logs/Syslog/pipes_in_syslog.shtml 但是,由于无法登录内核,因此有点像SOL
Haakon 2010年

谢谢,这可能无法解决我的问题,但是很高兴知道,管道系统日志是可能的-可能在另一时间派上用场!
克里斯·勒彻

有关日志记录的一个相关问题:iptables是否可以同时处理多个数据包(以便可以交错日志条目)?在那种情况下,我认为对于许多iptables LOG分析,TOS想法绝对是必须的!
克里斯·勒彻

我不知道答案。我希望每个接口至少可以由iptables同时处理。
Haakon

82

如果您的内核和iptables版本足够新,则可以使用TRACE目标(似乎至少在Debian 5.0上内置)。您应将跟踪条件设置为尽可能具体,并在不调试时禁用任何TRACE规则,因为它确实会向日志中注入大量信息。

跟踪
此目标标记是打包的,以便内核在记录所有遍历表,链和规则的数据包时记录匹配的所有规则。(需要使用ipt_LOG或ip6t_LOG模块进行记录。)数据包以字符串前缀记录:“ TRACE:tablename:chainname:type:rulenum”,对于普通规则,类型可以是“ rule”;对于隐式规则,类型可以是“ return”。在用户定义的链的末尾,以及内置链的策略的“策略”。它只能在原始表中使用。

如果您添加了这样的规则

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

您将获得如下所示的输出。

# 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)

8
谢谢,太棒了!这实际上是最好的答案,我希望我可以接受(这是一个赏金问题,因此可以肯定的答案是肯定的)。尽管由于内核限制,我不能在所有系统上使用它,但在某些系统上可以使用。这个答案值得批评,因为它与我一直在寻找的很接近。
克里斯·勒彻

我昨晚重新阅读iptables手册页时发现了此功能,因此我可以回答另一个问题。似乎是一个相对较新的功能。不用担心无法将其标记为已接受。也许随着时间的推移,这将获得足够的投票权,让我再获得一个民粹主义徽章。
Zoredache

这实际上是在iptables中跟踪数据包的规范答案。不幸的是,最近的一些内核没有默认启用它。
Peter Grace 2012年

内核支持TRACE多久了?我已经在CentOS 6.4上成功使用过,但在CentOS 6.2上却没有使用过
sebelk

6

一篇文章的三个答案:

1)通过脚本调试:

#!/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)通过syslog调试

从此网站上:http : //www.brandonhutchinson.com/iptables_fw.html

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)没有调试,不错的iptables编辑:

这也可能会有所帮助:http : //www.fwbuilder.org/


1
谢谢。要点1)和3)与通过iptables规则跟踪数据包没有太大关系,但是如果我最终不得不退回到日志记录(以防万一没有其他解决方案)。
克里斯·勒彻

2

有相同的问题,发现Zoredache指向TRACE / ipt_LOG是解决方案!

另外,我发现了一个脚本,该脚本在所有当前活动的iptables规则之前插入/删除LOG规则。我尝试了一下,发现它是一个非常不错的工具。-输出类似于TRACE解决方案-优点:无论从何处加载,它都可以在活动iptables配置上工作。您可以即时打开/关闭登录!您不需要修改任何可能由Firewall Builder或工具生成的防火墙脚本,无论使用什么...-缺点:未经修改,该脚本将为所有活动规则创建LOG-rules。相反,在使用TRACE规则时,您可能会将日志记录限制为现在要调查iptables处理的地址/服务/连接。

不管怎样,我喜欢这个方式:) Tony Clayton的荣誉,看看:http : //lists.netfilter.org/pipermail/netfilter/2003-March/043088.html

克里斯,问候


0

我通常使用数据包和字节计数器来查看规则如何工作并查找丢失或错误的内容。

您可以通过“ iptables -nvL”查看它们。


2
我可以看到作者想要的东西。如果您试图在繁忙的接口上测试iptables规则,仅观察计数器将无济于事,特别是如果数据包可能符合多个规则并在过程中绕过用户定义的链时(通常是过滤掉不需要的IP地址和泛洪保护规则)。
PP。

@PP:确实,您在读我的想法。@Vi:谢谢,这在某些情况下可能会有所帮助,而我有时会使用它。现在我需要更强大的功能。
克里斯·勒彻

-2

AFAIK IP数据包遍历规则链,直到第一个匹配为止。所以我真的不明白这里有什么问题。如果你有:

  1. 规则1
  2. 规则2
  3. 规则3日志

然后有一个数据包进入日志,这意味着规则3是第一个匹配规则。


不对。数据包可以匹配多个规则,并且可以匹配。除非规则具有操作(如-j DROP-j ACCEPT),否则它将继续在链的更下方进行匹配。
PP。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.