mangle
我正在尝试使用 iptables 对给定主机上的表中某个源/目标 IP 的数据包进行数据包标记。这些数据包随后被转发到同一主机上的特定网络命名空间,但我在该网络命名空间中安装的 iptables 规则并未正确执行。因此我想知道:数据包标记是否仅位于标记所在的网络名称空间的本地?我的印象是,由于标记是与 skb 关联的“属性”,因此内核将跟踪标记在主机上路由的任何位置,而不管名称空间如何。
或者有人对如何调试这个有任何想法吗?我TRACE
在目标网络命名空间内安装了一条规则,但我的印象是我需要运行dmesg
才能查看输出,而这对于网络命名空间来说没有多大意义。
答案1
数据包标记是否仅位于标记所在的网络命名空间的本地?
是的。该标记是网络命名空间的本地标记。每个命名空间都有一个独立的网络堆栈,因此当数据包从一个命名空间传输到另一个命名空间时,就像通过线路传输一样:不会留下任何标记。
我在网络命名空间内安装了 TRACE 规则
这取决于...
如果使用iptables-legacy
的TRACE
目标选择是有限的:
- 默认情况下,只有初始网络命名空间可以将 netfilter 事件记录到消息
- 或与
sysctl -w net.netfilter.nf_log_all_netns=1
然后全部网络命名空间将登录到消息当大量网络命名空间生成大量日志时,这可能会成为问题
那是因为消息不是针对每个命名空间的,而是全局的,并将日志发送到消息最初是唯一可用的方法TRACE
。
现在,如果使用nftables'nftrace
声明或使用iptables-nft
,之前与目标发送消息的方法TRACE
被使用(netfilter)替代网络链接套接字API它是命名空间感知的并且仅发送给侦听器(即:多播)。
这意味着当NFFT变体如下:
# iptables-nft -V
iptables v1.8.7 (nf_tables)
但不是遗产变体如下:
# iptables-legacy -V
iptables v1.8.7 (legacy)
使用,则跟踪不会发送到消息不再,但可以用xtables-monitor --trace
它来捕获。再次强调:xtables-monitor
仅适用于iptables-nft
的变体iptables
。
在这种情况下,并行调试由ip netns add ...
, 创建的多个网络命名空间的一种方法是并行运行多次xtables-monitor
,每个网络命名空间一次,并写入单独的日志中,或者例如使用ts
标记输出的每一行以具有时间戳并标识每个名称空间,以便以后在需要时可以轻松分割结果。
netns 是这样的富 酒吧和巴兹:
for ns in foo bar baz; do
ip netns exec "$ns" xtables-monitor --trace | ts -s "%.s $ns" &
done
(pkill xtables-monitor
稍后可能需要。)
对于不是通过网络名称空间创建的网络名称空间,ip netns add
可以替换ip netns exec
为nsenter
更多的苦力,通常涉及创建它们的应用程序的信息(docker inspect
,lxc-info
...)
使用时的命令nftables相反是nft monitor trace
并且对于网络命名空间的行为相同。实际上nft monitor trace
还会显示由iptables-nft的TRACE
目标,因为它是相同的 API。