我正在尝试使用 iptables 将所有出站连接记录到文件中。
这是我的规则:
-A OUTPUT ! -o lo ! --destination 127.0.0.1 -m state --state NEW -j LOG --log-prefix "new_connection " --log-level 7
但是,如果我添加另一个 IP 目标(多播),那么我的规则将变为:
-A OUTPUT ! -o lo ! --destination 127.0.0.1 ! --destination 239.192.0.0 -m state --state NEW -j LOG --log-prefix "new_connection " --log-level 7
我收到以下错误:
multiple -d flags not allowed
我的问题不是该错误意味着什么,而是如何在我的规则中排除多个 IP 地址?两个条件
! --destination 127.0.0.1
和
! --destination 239.192.0.0
是互斥的,因此拥有两条规则实际上就像根本没有它们一样(更糟糕的是,因为我会得到几乎两倍的日志)
那么有没有“与”运算符呢?
答案1
对于此类问题,您可以定义新的链并在它们之间跳转。例如,您可以添加一条链LOGGING
,并在该链的开头匹配您不想使用以下操作记录的数据包RETURN
:
$ iptables -N LOGGING
$ iptables -A LOGGING -d 127.0.0.0/8 -j RETURN
$ iptables -A LOGGING -d 239.192.0.0/16 -j RETURN
$ iptables -A LOGGING -j LOG
$ iptables -A OUTPUT -j LOGGING
这样,通过OUTPUT
链的所有数据包将首先通过LOGGING
链,并且所有不适合的数据包127.0.0.0/8
都239.192.0.0/16
将被记录,然后控制权将返回到OUTPUT
.
答案2
是的,但它不会按照您想要的方式工作。从手册页:
可以指定多个地址,但这会扩展为多个规则(使用 -A 添加时),或者会导致多个规则被删除(使用 -D 时)。
做到这一点的方法是在链的早期添加规则以转移您不想记录或修改的流量,例如
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT --destination 239.192.0.0 -j ACCEPT
-A OUTPUT -m state --state NEW -j LOG --log-prefix "new_connection " --log-level 7
答案3
您可以使用逗号分隔值和-d
或-s
来设置多个 IP。 (参见讨论http://www.gossamer-threads.com/lists/gentoo/user/210361)
例如,命令
sudo iptables -A OUTPUT -d 192.168.235.43,192.168.235.46 -j DROP
过滤到两台服务器的流量。