章节大纲

  • iptables 功能非常强大。除了作为防火墙外,它还有许多其他应用。我们无法在这个实验中覆盖所有应用,但我们将实验其中之一--负载均衡。在本任务中,我们将使用它来对运行在内部网络中的三个 UDP 服务器进行负载均衡。首先,在每个主机上启动服务器:192.168.60.5、192.168.60.6 和 192.168.60.7(-k 选项表示该服务器可以接收来自多个主机的 UDP 数据报):
    nc -luk 8080

    我们可以使用 statistic 模块来实现负载均衡。你可以输入以下命令查看其手册。可以看到有两种模式:random 和 nth。我们将分别使用这两种模式进行实验。
    $ iptables -m statistic -h
    statistic match options:
     --mode mode         Match mode (random, nth)
     random mode:
    [!] --probability p  Probability
     nth mode:
    [!] --every n        Match every nth packet
     --packet p          Initial counter value (0 <= p <= n-1, default 0)

    使用 nth 模式(轮询)。在路由器容器上,我们设置以下规则,适用于所有进入端口 8080 的 UDP 数据包。statistic 模块的 nth 模式被使用,它实现了轮询负载均衡策略:每三个数据包中,选择第一个数据包(即第 0 个),将其目标 IP 地址和端口号分别更改为 192.168.60.5 和 8080。修改后的数据包将继续其传输。

    iptables -t nat -A PREROUTING -p udp --dport 8080      \
             -m statistic --mode nth --every 3 --packet 0  \
             -j DNAT --to-destination 192.168.60.5:8080

    需要注意的是,未匹配此规则的数据包也将继续传输,它们不会被修改或阻止。设置此规则后,如果你发送一个 UDP 数据包到路由器的 8080 端口,你会看到每三分之一的数据包到达 192.168.60.5。

    // 在 10.9.0.5 上
    echo hello | nc -u 10.9.0.11 8080
    <hit Ctrl-C>

    请在路由器容器中添加更多规则,使所有三个内部主机接收到相同数量的数据包。请为这些规则提供一些解释。

    使用 random 模式。让我们使用不同的模式来实现负载均衡。以下规则将按概率 P 选择匹配的数据包。你需要将 P 替换为一个概率值。

    iptables -t nat -A PREROUTING -p udp --dport 8080   \
             -m statistic --mode random --probability P \
             -j DNAT --to-destination 192.168.60.5:8080

    请使用此模式来实现你的负载均衡规则,使每个内部服务器都能获得大致相同的流量(虽然不一定完全相同,但在总包数足够大时应非常接近)。请提供一些关于这些规则的解释。