iptablesのフェールオーバーファイアウォール

サーバーを設定しない場合、年末年始に何を管理しますか!



この記事では、可能な限り一般的なアプローチについて説明します。

-iptablesでクラスターを作成する

-fwbuilder GUIを使用してクラスターを構成します

-conntrack-toolsを使用してフェイルオーバーするときにユーザー接続を保存します



このようなクラスターが機能する一般的な環境:

-バックエンドおよびフロントエンドサーバーからの内部ネットワーク

-外部IPアドレスをブロックする

-Linuxベースのクラスター用の2台のサーバー(私の場合はFedora 13 x64_86):マスター/バックアップモードのfw1およびfw2



クラスタータスク:

-ローカルネットワークのゲートウェイ

-IPアドレスの外部ブロックでのサービスの公開



一般に、次のように機能します。

-ucarpサービスは、クラスターの状態を監視し、フェールオーバーの場合に必要なスクリプトをプルします

-conntrackdサービスはサーバー間の接続情報を同期します

-fwbuilderはiptablesに必要なスクリプトをコンパイルします



カットファイルの組み立て説明書の下





サーバーの準備



最小限のパッケージセットでfw1およびfw2にLinuxをインストールします。iptablesはすでに存在します。



追加:

yum install ucarp-クラスターのハートビート

yum install conntrack-tools-接続トラッカー

yum install pssh(scpユーティリティ用)



/ etc / sysconfig / network-scripts /に移動して、インターフェイスを構成します。

インターフェイスごとに1つの個人IPアドレスのみを割り当てます。次に例を示します。

eth0-内部

eth3は、クラスターサーバー間の接続情報を同期するためのインターフェイスです。

セキュリティ上の理由から、このインターフェイスを介してクラスタサーバーをコードで直接接続することをお勧めします。 conntrackdプロトコルは安全ではありません。

外部インターフェイスはスクリプトから構成されます。



Ucarpのセットアップ



ucarpプロセスが実行されている場合、各サーバーはVRRPパケットをマルチキャストアドレス224.0.0.18に送信します

サーバーがパートナーからパケットを受信しない場合、彼は放置されていると信じて、/ etc / init.d / ucarpファイルに登録されているupscriptを起動します。

UPSCRIPT=/usr/libexec/ucarp/vip-up





サーバーがアクティブ状態にあり、パートナーからパケットを受信した場合、これはより重要です-ダウンスクリプトを開始し、バックアップ状態になります

DOWNSCRIPT=/usr/libexec/ucarp/vip-down





upscript / downscriptスクリプトは、少し後に更新されます。



次に、あるサーバーから別のサーバーにフェールオーバーするときに移動するvipアドレスを構成します。

取得するVIPアドレスは、内部ネットワークのゲートウェイアドレスと、VRRPパケットを交換するための内部ネットワークです。

設定ファイル:

/etc/ucarp/vip-common.conf





/etc/ucarp/vip-001.conf



(理論的には多数のvipアドレスが存在する可能性がありますが、1つで十分です)



このようにして、ucarpはフェイルオーバー時にゲートウェイIPアドレスの遷移を制御します。



残念ながら、ucarpはOpenBSDのcarpとまったく同じではなく、2つの問題を解決する必要があります。

-フェールオーバーの場合、ローカルネットワーク上のすべてのクライアントのゲートウェイIPアドレスのARPを変更するか、クラスター内のサーバーの共通MACを作成します

-スプリットブレインのリスクを最小限に抑える、すなわち 可能であれば、両方のサーバーがパートナーが死んでいると考えて、メインサーバーになろうとする状況を避けてください。



arpingユーティリティは、最初の問題の解決に役立ちます。

スプリットブレインの可能性を減らすための推奨事項として、最初にすべての作業インターフェイスをボンディングで結合し、次に内部ネットワークと外部ネットワークのVLANを切断することをお勧めします。

これは、インターフェイスのいずれかに物理現象が発生した場合に役立ちます。



fwbuilderでiptablesを構成する



fwbuilder Webサイトには、fwbuilder自体をルールを視覚化するための便利なツールとして使用するためのかなり詳細なドキュメントがあります。

しかし、fwbuilderは、iptablesの仕組みを知り、理解する必要性を排除するものではありません。



使用順序は次のとおりです。

-ルールを作る

-スクリプトのコンパイル

-スクリプトをscp経由でクラスターサーバーにコピーする

-sshを介したスクリプトの実行



fwbuilderはルールを正しくコンパイルします。個々のチェーンを選択し、ルールが互いに重複しないようにします。

クラスターを作成するには、ドキュメントのセクションをご覧ください



「fw-cluster」などの名前のクラスターを作成します。このクラスターには、「iptables firewall」タイプの2つのオブジェクト、例えばfw1とfw2があります(名前がファイアウォールサーバーの「hostname -s」コマンドの結果と一致することが重要です) 。これは後のスクリプトで考慮されます)



State Sync Groupのプロパティで、タイプconntrackを指定して、fwbuilderがconntrackパッケージのアクセスルールを追加するようにします



すべてのインターフェイスをクラスター化します。

これにより、クラスターオブジェクトが作成されます。次に例を示します。

fw-cluster:eth0:members(イントラネットインターフェイス)

fw-cluster:eth1:メンバー

fw-cluster:eth3:メンバー



オブジェクトfw-cluster:eth0:membersに対して、VRRPのタイプを指定します(アクセスルールの場合も同様)。

他のオブジェクトの場合、タイプは指定されません。



ファイアウォールオブジェクトの設定の[スクリプト]タブで、[Load iptables modules]以外のすべてのアイテムをオフにする必要があります。

これは、コンパイルされたスクリプト自体がインターフェイスとvlan-sを構成できるという事実によるものですが、この機能を使用する過程でいくつかのバグが発生しました。



デフォルトでは、fwbuilder自体が関連および確立された接続のルールを追加します。

コンパイル後、fw1.fwおよびfw2.fwスクリプトが表示されます。

fwbuilderがリモートサーバーにスクリプトをインストールして実行するには、ファイアウォールオブジェクトのインターフェイスの1つがマネージャーとしてマークされている必要があります。



Conntrackのセットアップ



ドキュメントには、私たちの場合のためのセットアップ例があります。

primary-backup.shスクリプトをそのまま使用します

conntrackd.confの構成:

-「マルチキャスト」セクションで相互作用インターフェースを指定します

-「アドレス無視」セクションでは、クラスターサーバーの独自のIPアドレスへのすべての接続をフィルターで除外できます。フェールオーバーはどこにも行きません

fwbuilder自体がIPマルチキャストアドレスのアクセスルールを追加するため、conntrackd.confで変更する必要はありません。



IPアドレスの外部ブロックの構成



IPアドレスの外部ブロックの障害への移行は、ゲートウェイアドレスの場合と同じ方法で実行できます。

ただし、外部アドレスのブロックが十分に大きい場合、まず、各アドレスに対してアーピングを開始する必要があり、これには時間がかかる可能性があります。次に、外部ブロックのゲートウェイで機器を制御しないと、アーピングが機能しない場合があります。



解決策があります-ファイアウォールの外部インターフェイスに共通のMACアドレスを使用します。

残念なことに、iptables用のclusteripモジュールを除いて、実用的なソリューションをGoogleで検索することはできませんでした。誰かが別の方法を提案してくれたら嬉しいです。

不快な結果として、マルチキャストMACアドレスを処理する必要があります。



upstartおよびupdownスクリプトを変更する時です



スクリプトの横に、便宜上、マスクなしのIPアドレスが行ごとに書き込まれるテキストファイルを作成します(例: eth1.addr.external





eth1-外部ネットワークインターフェイスの名前

clusteripモジュールが外部アドレスブロックの残りのルールよりも早く動作するように、マングルテーブルに書き込みます



上付き


#!/bin/sh



# - fwbuilder

ROOT="/etc/fw"



# conntrackd, primary

/etc/conntrackd/primary-backup.sh primary



# fwbuilder

$ROOT/$(hostname -s).fw start



# ip-

# $2 $1 ucarp

# , ,

/sbin/ip address add "$2"/24 dev "$1"



# ip-



# /var/log/messages clusterip

iptables -t mangle -I PREROUTING -m state --state INVALID -j DROP



# , *.addr.external

for ADDRFILE in $(ls $ROOT/*.addr.external)

do

DEV=$(basename "$ADDRFILE" | awk -F "." '{print $1}')

for ADDR in $(cat $ROOT/$DEV.addr.external | grep -v ^#)

do

# ip-

/sbin/ip addr add $ADDR/24 dev $DEV

# ip-

iptables -t mangle -A PREROUTING -d "$ADDR" -i "$DEV" -j CLUSTERIP --new --hashmode sourceip --clustermac 01:00:5E:00:01:01 --total-nodes 1 --local-node 1 --hash-init 0

done

done



# arp- 2 , MAC-

arping -A -c 2 -I "$1" "$2"









下書き


本質的に、すべてのクラスターIPアドレスを削除し、マングルテーブルを消去します

#!/bin/sh

ROOT="/etc/fw"



/etc/conntrackd/primary-backup.sh backup



/sbin/ip address del "$2"/24 dev "$1"



for ADDRFILE in $(ls $ROOT/*.addr.*)

do

DEV=$(basename "$ADDRFILE" | awk -F "." '{print $1}')

for ADDR in $(cat $ADDRFILE | grep -v ^#)

do

/sbin/ip addr del $ADDR/24 dev $DEV

done

done



iptables -t mangle -F



$ROOT/$(hostname -s).fw start









上記の手順の結果として、両方のサーバーでucarpサービスを開始します。

サーバーの1つがアクティブになり、upscriptが起動します。これにより、内部および外部ネットワーク上のすべてのクラスターIPアドレスが発生し、iptablesの一連のルールがロールアップされます。



All Articles