FreeBSDロードバランサの実装

FreeBSDロードバランサの実装

マルチプロセス\マルチスレッドモードでは使用できないプログラムがあり、CPUコアを1つだけ食べ、残りのコアはフリーで使用しますが、RAMとネットワーク帯域幅の使用量が最大値の10%に近いです。

その目的に使用されるサーバーには、8コアCPU、16 GB RAM、および4094の外部IPアドレスからの要求を処理するための/ 20サブネットがあります。

主なアイデアは、それぞれ別々のTCPポートを持つ8つのインスタンスを実行し、いくつかのファイアウォールソフトウェアを使用してリダイレクトルールを作成することです。

Linux(ubuntu 14.04 LTS amd64)では、iptablesを使用して実行されます。

/etc/iptables/rules.v4(リダイレクト部分のみ)

-A プリルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 8 --packet 0 -j DNAT --to-destination :4001
-A 事前ルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 7 --packet 0 -j DNAT --to-destination :4002
-A プリルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 6 --packet 0 -j DNAT --to-destination :4003
-A 事前ルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 5 --packet 0 -j DNAT --to-destination :4004
-A 事前ルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 4 --packet 0 -j DNAT --to-destination :4005
-A プリルーティング -p tcp -m tcp --dport 4000 -m 統計 --mode nth --every 3 --packet 0 -j DNAT --to-destination :4006
-A プリルーティング -p tcp -m tcp --dport 4000 -m 統計 --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"

バインドされている場合の状態ポリシーの設定
最適化攻撃性の設定
スキップ設定{ lo0 }
制限ステータスを150000に設定

inetのすべての部分をスクラブしてランダムIDを再構築します。
inetをすべて削除し、tcpをすべて再組み立てします。

inet6ですべてスクラブ

rdr は $ext_if inet proto tcp ログを介して any から 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をすばやく渡します。
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
lagg0 proto tcp = 22フラグのすべてのポートで高速転送状態を維持する
lagg0 proto tcp のすべてのポートで高速パス = 4000 フラグの状態を維持
すべてのポート proto tcp=4001 フラグ S 保持状態の高速パス lagg0
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アドレスにのみリダイレクトできます。

主な質問:Linuxと同様に、freebsdで同じリダイレクト動作を取得する方法は?

関連情報