我正在尝试使用 iptable 进行负载平衡。我正在使用 virtualbox。所有 vm (debian) 都在内部网络中,并且 IP 是静态的。我想将发送到我的具有 IP 地址的 Web 服务器 (apache2) 的请求路由10.0.0.2:80
到该服务器的 IP10.0.0.3:80
和192.168.0.2:80
其他网络上的 IP。
网关进行 IP 转发,它有两个接口,eth0
分别用于网络10.0.0.0
和eth1
网络192.168.0.0
。负载均衡器有 IP 10.0.0.2
。我尝试设置这些规则,但没有成功:
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 10.0.0.3:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.0.2:80
答案1
我建议使用不同的解决方案,例如 haproxy、nginx 代理或几乎任何其他实际负载平衡方法。通常,iptables 负载平衡用于多个上行链路上的传出数据包。
如果你必须使用 iptables 进行平衡,那么你需要使用不同的方法。每隔几个数据包就会破坏你所有的请求。我看到了一个关于类似设置的不错的教程(这里) 将所有奇数源地址“转发”到一个主机,将所有偶数源地址“转发”到另一个主机。实际上,每个服务器都会获得所有连接请求和流量,但只有一个服务器建立连接。这些服务器被赋予相同的 MAC 地址,然后被告知丢弃来自偶数或奇数源的 syn 数据包。这样做的好处是不会增加单点故障,只要您编写一些脚本,以便在另一台服务器发生故障时重新允许活动服务器上的所有流量即可。