我有一个服务器(openvpn),它不是多线程的,因此不利用盒子中的多个核心。我尝试通过运行多个服务器来解决问题,每个服务器位于不同的端口上,例如127.0.0.1:8000,127.0.0.1:8001,...然后根据源IP对外部1194端口进行负载均衡 - openvpn使用UDP,但客户端的所有数据包必须到达同一服务器。
问题我遇到的是如何加载平衡。我尝试过IPVS,但似乎它不适用于同一台主机上的服务器。然后尝试了nginx的新udp功能,但再次没有骰子。关于如何实现这一点的任何想法?
答案 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