FreeBSD 负载均衡器实现

FreeBSD 负载均衡器实现

我有一个程序,它不能在多进程\多线程模式下使用,所以它吃掉一个CPU核心,其他核心是免费的,但RAM和网络带宽使用率接近最大值的10%。

用于给定用途的服务器具有 8 核 CPU、16GB RAM、一个 /20 子网来服务 4094 个外部 IP 地址的请求。

主要思想是:只运行 8 个实例,每个实例都有一个单独的 TCP 端口,然后使用一些防火墙软件创建重定向规则。

在 Linux (ubuntu 14.04 LTS amd64) 上,它是使用 iptables 完成的:

/etc/iptables/rules.v4(仅重定向部分)

-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 8 --packet 0 -j DNAT --to-destination :4001
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 7 --packet 0 -j DNAT --to-destination :4002
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 6 --packet 0 -j DNAT --to-destination :4003
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 5 --packet 0 -j DNAT --to-destination :4004
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 4 --packet 0 -j DNAT --to-destination :4005
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination :4006
-A PREROUTING -p tcp -m tcp --dport 4000 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination :4007
-A 预路由 -p tcp -m tcp --dport 4000 -j DNAT --to-destination :4008

但是程序变得不稳定,然后我尝试为freebsd编译它(releng 11 amd64),并使用pf重定向4000端口:

/etc/pf.conf

表 <mainips> { aaaa/32 }

ext_if =“lagg0”

设置状态策略 if-bound
设置优化激进
设置跳过 { lo0 }
设置限制状态 150000

在 inet 中擦洗所有片段重新组装随机 ID
擦洗inet全部重新组装tcp

在inet6中擦洗全部

rdr 通过 $ext_if inet proto tcp 日志从任何到 xx240.0/20 端口 4000 -> xx240.0/20 端口 4001:4008 循环

将 $ext_if inet proto tcp 传递到 xx240.0/20 端口 4000

传递 $ext_if inet proto icmp
传递 $ext_if inet6 原型 icmp6
将 $ext_if inet proto tcp 传递到 <mainips> 端口 { 22 }
在 { $ext_if } inet proto tcp 上传递所有标志 S/SA 调制状态
在 { $ext_if } inet proto udp all 上传递出去

#阻止所有

但负载均衡周期只考虑ip地址,而不考虑端口,所以我尝试使用ipfilter\ipnat:

/etc/ipf.规则:

快速通过 lo0 all
lo0 all 很快就昏倒了
在 lagg0 proto tcp 上从任何端口快速传递 = 22 个标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4000 个标志 S 保持状态
从任何端口快速传递 lagg0 proto tcp = 4001 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4002 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4003 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4004 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4005 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4006 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4007 标志 S 保持状态
在 lagg0 proto tcp 上从任何端口快速传递 = 4008 标志 S 保持状态

/etc/ipnat.规则:

rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4001 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4002 TCP 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4003 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4004 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4005 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4006 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4007 tcp 循环
rdr lagg0 xx240.1/20 端口 4000 -> xx240.1-xx255.254 端口 4008 tcp 循环

此配置允许获取循环思想目标端口,但将所有端口仅重定向到 xx240.1 地址。

主要问题:如何在 freebsd 上获得与 Linux 上相同的重定向行为?

相关内容