我已针对特定 iptables 数据包丢失启用了日志记录。我使用的规则仅与 IP/端口相关,这是我可以在日志中轻松看到的内容,但偶尔我也会记录 MAC 地址信息。例如:
“....OUT=eth1 IN=MAC=00:26:a9:7b:c9:30:00:17:0f:ac:6a:80:08:00”...
这些与 mac 地址相关的日志是零星的。
我注意到的是:
- 这些被丢弃/被记录的通信始终是入站的
- 虽然源 IP 不同,但记录的源 mac 地址是我的默认网关(服务提供商)的 mac 地址。
- 目标 mac(很明显,但只是为了确认)是我的接口之一
我想了解的是:
- 当决定在日志中捕获“MAC 地址 + IP/端口”而不是仅捕获“IP/端口”时,iptables 逻辑是什么。
答案1
仅记录本地网络上设备的 MAC 信息。它实际上是以太网 MAC 标头的十六进制转储,由源 MAC 地址 (00:26:a9:7b:c9:30)、目标 MAC 地址 (00:17:0f:ac:6a:80) 和以太网帧类型 (08:00) 组成。
答案2
信息必须可用。如果不可用,则不会记录。
由于 IPv4 依赖 ARP 来解析目标的 MAC 地址,因此目前尚不清楚iptables担心:这种解决方案稍后才会出现,而且永远不会被任何人知晓iptables' 钩子,即使目标 IP 地址已知,即使此类信息通常仍缓存在邻居 ARP 表中。
因此,当涉及的接口都是以太网时,观察到的情况(使用内核 6.1)和推断如下:
预路由/输入/转发
- 源和目标 MAC 地址在 PREROUTING、INPUT 或 FORWARD 中始终可用。
- 对于 FORWARD 情况,目标 MAC 地址表示接收帧的接口的本地系统的目标 MAC 地址,而不是未来的目标系统或网关。
输出
- 源 MAC 地址未知:尚未将数据包嵌入帧中,因此此类 MAC 地址未知。
- 目标 MAC 地址也未知,如上所述
路由后
- 如果数据包是本地发出的(通过 OUTPUT 发出),那么与 OUTPUT 情况一样:没有可用信息
- 如果数据包已被路由(通过 FORWARD 到达):那么来自 FORWARD 的未改变的信息仍然可用并被记录下来,即使它已经“过时”。
简而言之:
- PREROUTING,INPUT 始终会拥有信息
- FORWARD 将始终拥有来自前路由
- OUTPUT 日志中永远不会有 MAC 地址
- 仅当数据包被路由时,POSTROUTING 才会拥有它,在这种情况下,它将与 FORWARD 中记录的信息相同。
其他信息不可用的情况是信息根本不存在:
- 当出口接口不是以太网时(例如:lo,像 tun 模式下的 WireGuard 或 OpenVPN 这样的第 3 层接口):则 POSTROUTING 将不会显示在数据包路由时原本会显示的“过时”MAC 地址。
- 当入口接口不是以太网时:任何钩子中都不会出现 MAC 地址。
我没有考虑桥接的行为框架(第 2 层)遍历iptables(通常处理第 3 层数据包) 当。。。的时候br_netfilter
模块加载(通常由 Docker 加载)时,其 sysconf 属性bridge-nf-call-iptables=1
可能有所不同。这些“数据包”还将使用其他属性进行记录:PHYSIN=
和PHYSOUT=
。