我将网络节点插入到 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可以带来更好的性能,但我猜您的设置不是性能要求高的场景。