中间人网络节点的桥接过滤

中间人网络节点的桥接过滤

我将网络节点插入到 2 个使用专用端口双向交换 TCP 和 UDP 消息的旧设备之间。我的新节点需要透明地推送一些 TCP/UDP 消息,并拦截其他 TCP/UDP 消息以进行应用层处理,然后再发送已处理的消息。这种“中间人”式配置的图表如下:

[ 遗产1 ] -- [ mitm ] -- [ 遗产2 ]

通过这些接口

  • legacy1 位于 192.168.1.2
  • legacy2 位于 192.168.1.3
  • mitm(左)为192.168.1.3,用于拦截右移消息,对于转发的消息则不可见
  • mitm(右)为 192.168.1.2,用于拦截左移消息,对于转发消息则不可见

MITM 机器正在运行 Ubuntu 16.04。

虽然我想桥接(在第二层),但 iptables 是否足够(在第三层)?ebtables 或 nftables 哪个更好?

答案1

你提到(L2),但根据你的图表,你正在做路由(L3),因为看起来有两个相同的子网(假设为 192.168.1.0/24),一个包括 legacy1 和 mitm-left,另一个包括 legacy2 和 mitm-right。

您可能需要...

修改你的设置

# create bridge between mitm-left and mitm-right
ip l a name br0 type bridge
ip l set br0 up
ip l set eth0 up
ip l set eth0 master br0
ip l set eth1 up
ip l set eth1 master br0

# add IP within the subnet that legacy1 and legacy2 is part of
ip a a 192.168.1.0/24 dev br0

# now ensure that netfilter works on the l2 bridge
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

最后两行只是一次性更改,您应该将其设为永久更改以确保:

  • br_netfilter在启动时加载内核模块
  • 在 iptables 中启用bridge-nf-call功能(即通过echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf

结果

此设置允许 Linux 内核的 netfilter 部分对桥接流量进行过滤/记录/NAT 规则。

现在你可以:

  • 使用iptables工具设置 netfilter 规则来处理/修改 IPv4/IPv6 数据包。
  • 使用ebtables工具设置 netfilter 规则来处理/修改任何其他帧。
  • 使用nftables工具设置 netfilter 规则(如果您的发行版足够新)。

至于你的最后一个问题 - 因为有大量的例子以及对 iptables/ebtables 的支持,所以我会选择它们。Nftables可以带来更好的性能,但我猜您的设置不是性能要求高的场景。

相关内容