使用 nftables 根据 MA​​C 地址过滤流量

使用 nftables 根据 MA​​C 地址过滤流量

总结:当欺骗 MAC 地址时,如何确保真实地址不会使用 nftables 泄露到网络的其余部分?

语境

为了网络安全培训目的,我目前正在构建一个网络分接头包括一个透明桥带有两个接口(水龙头)。

水龙头是一台计算机正在运行Debian Bullseye,具有 4 个以太网接口,如下所示:

界面 苹果
enp3s0 00:90:27:b4:40:58
enp4s0 00:90:27:b4:40:59
enp6s0 00:90:27:b4:40:5a
enp7s0 00:90:27:b4:40:5b
  • enp3s0 连接到交换机并通过 DHCP 获取 IP 地址。
  • 另外,我使用 nmcli 创建了一个网桥 br0,它有两个从属接口:enp6s0 和 enp7s0
  • enp7s0 连接到交换机

桥梁的创建如下:

nmcli connection add connection.type bridge ifname br0 con-name br0 ipv4.method disabled ipv6.method ignore bridge.stp no bridge.vlan-filtering yes connection.autoconnect-slaves 1 autoconnect no
nmcli connection add type ethernet ifname enp6s0 con-name br0-slave-enp6s0 slave-type bridge master br0 autoconnect no
nmcli connection add type ethernet ifname enp7s0 con-name br0-slave-enp7s0 slave-type bridge master br0 autoconnect no

目标

我希望机器继续隐身因为它是一个被动窃听器,所以我想丢弃传出流量可能会意外地泄露我机器的 MAC 地址。所以我尝试nftables如下,使用命名集对于 MAC 地址:

table netdev bridge {
    set macs {
        type ether_addr
        elements = { 00:90:27:b4:40:59,
                 00:90:27:b4:40:5a, 00:90:27:b4:40:5b }
    }

    chain br0 {
        type filter hook ingress devices = { enp4s0, enp6s0, enp7s0 } priority filter; policy accept;
        ether saddr @macs drop
        log flags all prefix "myfilter " counter
    }
}

我还想获得丢弃数据包的计数器和日志详细信息。

问题

流量被丢弃,并且日志记录到 /var/log/syslog 中,正如预期的那样。计数器正在更新。但 netfilter 规则似乎没有按预期工作。相反,它似乎丢弃了发送到 enp7s0 的所有流量。

样本:

12 月 20 日 01:23:47 测试箱内核:[32441.125971] myfilter IN=enp7s0 OUT=MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC=192.168.0.1 DST=239.255.255.250 LEN=367 TOS=0x00 PREC=0x00 TTL=4 ID=37026 PROTO=UDP SPT=1900 DPT=1900 LEN=347
12 月 20 日 01:23:47 测试箱内核:[32441.126842] myfilter IN=enp7s0 OUT=MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC=192.168.0.1 DST=239.255.255.250 LEN=312 TOS=0x00 PREC=0x00 TTL=4 ID=37027 PROTO=UDP SPT=1900 DPT=1900 LEN=292
12 月 20 日 01:23:47 测试箱内核:[32441.127554] myfilter IN=enp7s0 OUT=MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC=192.168.0.1 DST=239.255.255.250 LEN=303 TOS=0x00 PREC=0x00 TTL=4 ID=37028 PROTO=UDP SPT=1900 DPT=1900 LEN=283
12 月 20 日 01:23:47 测试箱内核:[32441.128342] myfilter IN=enp7s0 OUT=MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC=192.168.0.1 DST=239.255.255.250 LEN=377 TOS=0x00 PREC=0x00 TTL=4 ID=37029 PROTO=UDP SPT=1900 DPT=1900 LEN=357
12 月 20 日 01:23:53 测试箱内核:[32447.003559] myfilter IN=enp7s0 OUT=MACSRC=10:c2:5a:58:72:8f MACDST=33:33:00:00:00:01 MACPROTO=86dd SRC=fe80:0000:0000:0000:12c2:5aff:fe75:899d DST=ff02:0000:0000:0000:0000:0000:0000:0001 LEN=176 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=134 CODE=0
12 月 20 日 01:23:53 测试箱内核:[32447.015382] myfilter IN=enp7s0 OUT=MACSRC=00:90:27:e6:10:58 MACDST=33:33:00:00:00:16 MACPROTO=86dd SRC=fe80:0000:0000:0000:6d06:284e:2844:db03 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=136 TC=0 HOPLIMIT=1 FLOWLBL=0 OPT()PROTO=ICMPv6 TYPE=143 CODE=0
12 月 20 日 01:23:53 测试箱内核:[32447.619279] myfilter IN=enp7s0 OUT=MACSRC=00:90:27:e6:10:58 MACDST=33:33:00:00:00:16 MACPROTO=86dd SRC=fe80:0000:0000:0000:6d06:284e:2844:db03 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=136 TC=0 HOPLIMIT=1 FLOWLBL=0 OPT()PROTO=ICMPv6 TYPE=143 CODE=0

我相信我可能需要使用出口hook 而不是 ingress。我知道从 1.01 版开始,nft 中就有 egress hook。Debian 中 nft 的当前稳定版本是 0.98,因此我通过手动下载软件包手动升级到 v1.01。但是用 egress 替换 ingress 不起作用:nft 无法识别我的规则。

问题

  • 我的方法有意义吗?我可以使用入口钩子来达到我的目的吗?还是需要出口?
  • 或者,可以用 tc 来完成吗?
  • 或者桥接器能否进一步隔离来自其他接口的流量?

相关内容