总结:当欺骗 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 来完成吗?
- 或者桥接器能否进一步隔离来自其他接口的流量?