iptables:针对不同的当前网关IP设置不同的规则

iptables:针对不同的当前网关IP设置不同的规则

假设我有机器 A 作为网关。机器 A 有一个带有 2 个 IP 的接口。

机器 A 的 netplan 配置如下:

  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.1/24
        - 192.168.1.2/24

现在我希望 iptables 的 REDIRECT 规则根据机器 B 将其网关设置为 192.168.1.1 还是 192.168.1.2 而采取不同的行为

这是我尝试在机器 A 上执行的 iptables 命令:

iptables --table nat --append PREROUTING --some-parameter 192.168.1.1 --protocol tcp  --jump REDIRECT --to-ports 9991
iptables --table nat --append PREROUTING --some-parameter 192.168.1.2 --protocol tcp  --jump REDIRECT --to-ports 9992

您能告诉我上面的正确名称是什么吗--some-parameter

答案1

无法通过网关同一网络接口上的 192.168.1.1 和 192.168.1.2 来实现这一点,从而解析为相同的 MAC 地址。这不是未实现的功能iptables这是可以实现的,但由于 IP 网络的工作方式,该功能无法实现。

使用 192.168.1.1 或 192.168.1.2 作为网关的客户端在向 Internet 发送数据包时,绝不会发送包含 192.168.1.1 或 192.168.1.2 的单个 IPv4 数据包。它将:

  • 查阅给定目的地的路由表
  • 发现有通往该目的地的网关
  • 使用地址解析协议或缓存条目来解析到达网关所需的 L2 地址(以太网 MAC 地址)。

最后一步将只有一个以太网目的地:网关的 NIC 唯一 MAC 地址:对于网关为 192.168.1.1 的客户端或网关为 192.168.1.2 的其他客户端也是如此。

因此,每个客户端现在将使用其 IPv4 源地址向网关发送一个数据包,以太网帧中的预期 IPv4 目标在两种情况下都具有相同的目标以太网 MAC 地址。192.168.1.1/192.168.1.2 不在循环之内。

网关现在看到两个要路由的数据包。在任何情况下,这些数据包都不会再提示它们是否正在使用192.168.1.1192.168.1.2作为网关:这些信息不会出现在线路上,因此网关无法在任何地方知道。如果系统没有信息来区分这两种情况,那么iptables也不能有这些不存在的信息。


解决方法建议:

可以使用MACVLAN接口拥有第二个具有独立 MAC 地址的 NIC,并为其分配 192.168.1.2/24,这将使使用 192.168.1.2 作为网关的客户端的数据包到达此 NIC。这种情况很容易与iptables:不同的-i NIC过滤器。

但这会产生在同一个 LAN 中存在多个 NIC 的路由问题,并且需要:

  • 高级策略路由规则可以正确处理这种情况

    因此回复不会通过错误的 NIC 发送,从而可能影响路由行为或防火墙规则。

    • 此外,任何在 192.168.1.2 上查询的 UDP 服务(如果 192.168.1.1 是默认值)都必须知道如何使用正确的源地址 192.168.1.2(而不是默认值 192.168.1.1)进行应答:它必须具有多宿主感知能力。TCP 不需要特别注意。
  • 或者使用额外的网络命名空间来分隔添加的接口。但是使用 REDIRECT 规则,这意味着端口 9992 上的服务必须在额外的网络命名空间中运行。并且此网络命名空间可能仍必须使用初始网络命名空间与 Internet 通信:还需要在各个地方规划更多配置。

相关内容