iptables 拦截 bridge 包的问题排查

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

最近排查网络问题时发现,两个 IP 之间不通是因为 bridge 的数据包被 iptables 的 FORWARD 链丢弃。可以通过设置 sysctl 参数关闭 bridge 包调用 iptables 的功能,从而解决此问题。此功能为内核模块,可能会影响 nftables 和 iptables-nft。

🎯

关键要点

  • 最近排查网络问题时发现,两个 IP 之间不通是因为 bridge 的数据包被 iptables 的 FORWARD 链丢弃。
  • 可以通过设置 sysctl 参数关闭 bridge 包调用 iptables 的功能,命令为:sysctl -w net.bridge.bridge-nf-call-iptables=0。
  • 默认情况下,bridge 的包会被 iptables 处理,设置为 1 时会调用 iptables,设置为 0 时则不会。
  • 此功能是内核模块,可能会影响 nftables 和 iptables-nft,关闭时可能会遇到模块未加载的错误。
  • 可以通过 udev 创建事件,在每次创建 bridge 时执行 sysctl 命令来禁用 net.bridge.bridge-nf-call-iptables。

延伸问答

为什么两个 IP 之间的网络不通?

因为 bridge 的数据包被 iptables 的 FORWARD 链丢弃。

如何解决 bridge 包被 iptables 拦截的问题?

可以通过设置 sysctl 参数,执行命令:sysctl -w net.bridge.bridge-nf-call-iptables=0 来关闭此功能。

bridge 包默认情况下是如何处理的?

默认情况下,bridge 的包会被 iptables 处理,设置为 1 时会调用 iptables,设置为 0 时则不会。

关闭 bridge 包调用 iptables 时可能遇到什么问题?

可能会遇到模块未加载的错误,提示 'net.bridge.bridge-nf-call-iptables' 是一个未知的键。

如何在每次创建 bridge 时自动禁用 net.bridge.bridge-nf-call-iptables?

可以通过 udev 创建事件,在每次创建 bridge 时执行 sysctl 命令来禁用该功能。

iptables 和 nftables 之间有什么关系?

nftables 是下一代的 iptables,可能会受到 bridge 包处理的影响。

➡️

继续阅读