如果我有两个以太网接口 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 来进行任何高级过滤。
供您参考的链接:
答案2
防火墙
可以使用以太网桥级别的防火墙规则来实施 OP 的限制。
Linux 桥接器有一个特殊的“自”端口,其名称与桥接器相同。桥接器作为一个整体参与在 L2 上(设置为桥接器的接口)端口之间转发帧,但桥接器自端口参与在 L3 上路由数据包,就像其他接口一样。将其与简单的托管交换机进行比较:它有端口,但也可以通过 IP 进行管理:此类 IP 数据包可以从任何端口(仍为以太网帧)到达它,但随后被发送到交换机本身,而不是转发到其他端口。
对于使用的 Netfilter 防火墙框架nftables和ebtables,这通过在桥接端口到桥接端口的流量中看到来翻译过滤前进钩(过滤器/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
之间的流量。eth0
eth1
使用(足够新以避免语法错误)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 的系统进行任何实验)什么可以打破。