我正在使用 Linux 桥接器来监控两个 VLAN 上的一些流量。我为每个 VLAN 创建了两个桥接器 br30 和 br40。我的问题是 TCP 流量可以通过,但 UDP 流量无法通过。我想到了 iptables,所以我为每个虚拟接口(比如 ethx.30 ...)和桥接接口 br30、br40 添加了一长串规则。ebtables 未安装。我不知道如何处理这个问题。谢谢。
答案1
默认情况下,桥接数据包会根据 netfilter 规则(iptables、ip6tables、arptables)进行过滤。是的,这是分层违规(L3 过滤器应用于应该仅在 L2 处理的数据包),但这只是桥接子系统长期以来的行为方式。
如果您不打算对桥接数据包进行过滤(或者如果您更喜欢仅使用 ebtables 来实现这一点),您可以关闭 bridge-nf,这样 netfilter 规则就不会应用于桥接数据包(当然,如果桥接代码决定数据包应该由 L3 上的主机处理,它们仍然会应用):
/sbin/sysctl -w net.bridge.bridge-nf-call-ip6tables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-iptables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-arptables=0
bridge
这些命令必须在模块加载后执行。
在某些发行版中,你可以将所需的 sysctl 变量值放入/etc/sysctl.conf
,以便这些值在启动期间应用:
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
由于需要bridge
在设置这些变量之前加载模块,您可能需要编辑其他特定于分发的文件以强制提前加载此模块。
答案2
去检查你的 iptables 规则,通常你只设置转发规则。按照以下步骤操作。
假设 A 在 Vlan1 上,B 在 Vlan2 上
如果流量从 A 到 B,它能到达 Linux 机器吗?
如果流量从 B 到 A,它能到达 Linux 机器吗?
流量是否被 iptables 的传入规则阻止?
流量是否通过 iptables 的 NAT 规则正确重写?
当数据包从 A 到 B 并最终到达 B 时,它会是什么样子? B 会认为数据包来自 Linux,还是来自 A ?
如果 B 想要发回一个数据包,如果是发送给 A?还是发送给 Linux,如果它去 Linux,它如何确定它去哪里?(因为它不包含最终目的地),如果它去 A,它就不会经过 Linux,因为它怎么知道它应该去 Linux Box?
在经历了所有的混乱之后,你应该发现将 Linux 机器设置为路由器比使用 IP 表要容易得多,但它仍然可能满足你的需要。
而且,视频 UDP 无法通过网关等到达某个私有子网的情况很常见,因为互联网视频服务器无法通过 UDP 将数据包传送到路由器后面的机器,如果它使用公共 IP,它只会到达路由器,但不知道要使用哪个,或者,最多可以让 1 台机器获取所有流量。如果它使用私有 IP,那么它甚至不会到达你的路由器。
目前我们最好的解决方案是设置一个 Wowza 视频流媒体服务器或类似的东西。它实际上假装是互联网上的目标视频服务器。至少你可以得到显示的视频,比如 YouTube 等。
但是对于在 UDP 端口上玩游戏,您可能需要 VPN 解决方案。