通过源 IP 在本地主机上负载平衡 UDP
Load-balancing UDP on localhost by source IP
我有一个服务器 (openvpn),它不是多线程的,因此没有利用盒子中的多核。我正在尝试通过 运行 多台服务器来解决问题,每台服务器都在不同的端口上,例如127.0.0.1:8000, 127.0.0.1:8001, ... 然后根据源 IP 对外部 1194 端口进行负载平衡——openvpn 使用 UDP,但客户端的所有数据包必须到达同一台服务器。
我 运行 遇到的问题是如何进行负载平衡。我试过 IPVS,但它似乎不适用于同一主机上的服务器。然后尝试了 nginx 的新 udp 功能,但还是不行。关于如何实现这一点有什么想法吗?
我发现普通的旧 iptables 可以创建这样一个负载均衡器,使用 HMARK 目标扩展(参见 man 8 iptables-extensions
)。
本质上,HMARK
目标可以根据特定 IP 元组参数、源 IP 和源端口的散列来标记数据包,因为这些对于每个客户端都是唯一的,即使在 NAT 之后也是如此。然后我可以根据标记将数据包路由到适当的本地主机服务器:
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
记得启用路由数据包到本地主机:
sysctl -w net.ipv4.conf.eth0.route_localnet=1
我有一个服务器 (openvpn),它不是多线程的,因此没有利用盒子中的多核。我正在尝试通过 运行 多台服务器来解决问题,每台服务器都在不同的端口上,例如127.0.0.1:8000, 127.0.0.1:8001, ... 然后根据源 IP 对外部 1194 端口进行负载平衡——openvpn 使用 UDP,但客户端的所有数据包必须到达同一台服务器。
我 运行 遇到的问题是如何进行负载平衡。我试过 IPVS,但它似乎不适用于同一主机上的服务器。然后尝试了 nginx 的新 udp 功能,但还是不行。关于如何实现这一点有什么想法吗?
我发现普通的旧 iptables 可以创建这样一个负载均衡器,使用 HMARK 目标扩展(参见 man 8 iptables-extensions
)。
本质上,HMARK
目标可以根据特定 IP 元组参数、源 IP 和源端口的散列来标记数据包,因为这些对于每个客户端都是唯一的,即使在 NAT 之后也是如此。然后我可以根据标记将数据包路由到适当的本地主机服务器:
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
记得启用路由数据包到本地主机:
sysctl -w net.ipv4.conf.eth0.route_localnet=1