按源IP

时间:2016-07-07 09:16:49

标签: nginx udp load-balancing

我有一个服务器(openvpn),它不是多线程的,因此不利用盒子中的多个核心。我尝试通过运行多个服务器来解决问题,每个服务器位于不同的端口上,例如127.0.0.1:8000,127.0.0.1:8001,...然后根据源IP对外部1194端口进行负载均衡 - openvpn使用UDP,但客户端的所有数据包必须到达同一服务器。

问题我遇到的是如何加载平衡。我尝试过IPVS,但似乎它不适用于同一台主机上的服务器。然后尝试了nginx的新udp功能,但再次没有骰子。关于如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

我发现普通的旧iptables可以使用HMARK目标扩展来创建这样的负载均衡器(参见man 8 iptables-extensions)。

基本上HMARK目标可以基于特定IP元组参数,源IP和源端口的散列来标记数据包,因为这些对于每个客户端都是唯一的,即使在NAT之后也是如此。然后我可以根据标记将数据包路由到适当的localhost服务器:

iptables -A PREROUTING -t mangle -p udp --dport 1194 -j HMARK \
         --hmark-tuple src,sport --hmark-mod 2 \
         --hmark-rnd 0xcafeface --hmark-offset 0x8000

iptables -A PREROUTING -t nat -p udp -m mark --mark 0x8000 \
         -j DNAT --to-destination 127.0.0.1:8000

iptables -A PREROUTING -t nat -p udp -m mark --mark 0x8001 \
         -j DNAT --to-destination 127.0.0.1:8001

请记住启用路由数据包到localhost:

sysctl -w net.ipv4.conf.eth0.route_localnet=1