我有一个程序,它不能在多进程\多线程模式下使用,所以它吃掉一个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 上相同的重定向行为?