阻止从桥的一侧到主机的流量

阻止从桥的一侧到主机的流量

如果我有两个以太网接口 eth0 和 eth1。它们是桥接的 (br0)。运行桥接的主机可以使用 eth0 或 eth1 与网络通信,具体取决于连接到网络的哪个。

现在来回答这个问题:

如何防止主机通过eth1与网络通信?

我想要实现的目标:

eth0 <-> br0: Accepted.
eth1 <-> br0: Rejected.
eth0 <-> eth1: Accepted.

在说这是不可能的并且不符合 OSI 模型之前,您需要检查以下内容:br_netfilter(内核模块)、net.bridge.bridge-nf-call-iptables 和透明防火墙:https://www.debian.org/doc/manuals/securing-debian-manual/bridge-fw.en.html

我已经在网桥中根据第 3 层过滤了包 (eth0 <-> eth1)。剩下要做的就是防止防火墙本身与防火墙错误一侧的网络进行通信。

其中一条评论中描述的 nftables 解决方案很棒,这是以后要采用的方法,但现在我需要一个快速修复方法,直到我升级平台并将应用程序转换为使用 nftables 为止。

这个问题的可接受的解决方案是基于 iptables(最好)或 ebtables(我需要研究这个,但目前它是比 nftables 更快地解决这个问题的方法)。

答案1

很抱歉,但这个问题需要更多解释,因为它目前没有意义。

通过将 eth0 和 eth1 连接到 br0,您就创建了一个 2 端口以太网交换机。

你想实现的目标:

eth0 <-> br0: Accepted.
eth1 <-> br0: Rejected.
eth0 <-> eth1: Accepted.

如果从 br0 中删除 eth1 并允许在内核中对 eth0 和 eth1 进行数据包转发,则是可能的。

iptables 处理 IP 地址 - 即 OSI 模型中的第 3 层(网络) - 因此在这种情况下不可用。

您正在谈论切换帧,因此 OSI 模型中的第 2 层(链接) - 因此您需要咨询 ebtables 来进行任何高级过滤。

供您参考的链接:

https://linux.die.net/man/8/ebtables

是否可以使用 ebtables 在简单的以太网接口上通过 MAC 地址过滤流量,而无需桥接?

答案2

防火墙

可以使用以太网桥级别的防火墙规则来实施 OP 的限制。

Linux 桥接器有一个特殊的“自”端口,其名称与桥接器相同。桥接器作为一个整体参与在 L2 上(设置为桥接器的接口)端口之间转发帧,但桥接器自端口参与在 L3 上路由数据包,就像其他接口一样。将其与简单的托管交换机进行比较:它有端口,但也可以通过 IP 进行管理:此类 IP 数据包可以从任何端口(仍为以太网帧)到达它,但随后被发送到交换机本身,而不是转发到其他端口。

对于使用的 Netfilter 防火墙框架nftablesebtables,这通过在桥接端口到桥接端口的流量中看到来翻译过滤前进钩(过滤器/FORWARD 链用于ebtables)。从自身端口到其他端口的流量是过滤输出钩子(过滤器/输出链)并且从端口到桥接自身端口的流量是过滤输入钩子(过滤器/输入链)。这个示意图在链接层(下方蓝色区域中的蓝色框)部分对其进行描述。

因此,这里要阻止的流量位于eth1和自身接口之间(即阻止对路由堆栈的进一步处理),反之亦然。

我假设这里只有一座桥。现在这些工具已经介绍完毕,应该投入更多精力才能正确使用它们,尤其是在有多个桥的情况下。无论如何,下面的命令将始终正常工作,因为eth1一次只能成为一座桥的端口:这里br0

使用ebtables

ebtables -A INPUT -i eth1 -j DROP
ebtables -A OUTPUT -o eth1 -j DROP

没有提到br0:它由INPUT和表示OUTPUT

由于各个默认仍是接受流量,因此eth0不会被阻止,也不会阻止和br0之间的流量。eth0eth1

使用(足够新以避免语法错误)nftables:它与添加的初始样板相同:

nft add table bridge mytable

nft add chain bridge mytable myinput '{ type filter hook input priority filter; policy accept; }'
nft add chain bridge mytable myoutput '{ type filter hook input priority filter; policy accept; }'

nft add rule bridge mytable myinput iif eth1 drop
nft add rule bridge mytable myoutput oif eth1 drop

笔记

iptables不用于以太网层 (L2),而是用于 IP 层 (L3),因此不是适合此目的的工具。可以说还有一个特殊功能称为网桥过滤将转换 IPv4 类型的以太网帧以将人工 IP 数据包推送到iptables(仍然在桥接路径中),以便对它们进行处理,然后将这些数据包转换回以太网帧,以便进一步处理ebtablesiptables.如果人们正确理解了下面蓝色区域(链路层:以太网)中绿色框(网络层:数据包)的处理,就可以使用这种过滤上一个示意图,但很可能会导致额外的不良影响。在理解之前,请勿使用此功能(也不要对已经运行 Docker 的系统进行任何实验)什么可以打破

相关内容