マルチプロセス\マルチスレッドモードでは使用できないプログラムがあり、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で同じリダイレクト動作を取得する方法は?