負荷の高いプロジェクトでは、冗長性と信頼性に対する要件が常に増加しています。 ネットワーク全体の可用性はその安定性に依存するため、インフラストラクチャで最も重要なリンクの1つはルーターです。 iproute2、NetGWM、keepalived、ISC DHCPD、PowerDNSを使用して、GNU / Linuxベースのフォールトトレラント仮想ルーターを実装するスキームの1つを使用するのは、このようなノードです。 このすべての設定方法については、この記事をお読みください。
コンポーネント
理想的なフェイルセーフルータースキームでは、ネットワークにアクセスできなくなる可能性のあるすべての要素を予約します。
一般的に、回路(L2レベル)は次のようになります。

図からわかるように、802.1Q VLANをサポートする2つのスイッチが必要です。 オペレータ1はスイッチ1に切り替えられ、個別のVLAN(110など)が割り当てられます。 オペレーター2は、スイッチ2から別のVLAN(120など)に切り替えられます。 個別のVLAN(この場合-200)がローカルネットワークに割り当てられます。 トランクはスイッチ間に編成され、両方のルーターをトランクにリンクします。これは、仮想ルーターの「ハート」になります(
ルーターオンスティック方式)。
この配置により、いずれかのコンポーネント(ルーター、スイッチ、またはオペレーター)に障害が発生した場合に、有効なネットワークを離れることができます。
ルーターの作業で使用する基本的なコンポーネントのスタック:
- Ubuntu Linux
- NetGWMは、ソリューションのメインゲートウェイに優先順位を付けるためのユーティリティです。 これは私たちのオープンソース開発です。これについては、別の記事を準備しています(今のところ、 基本的なドキュメントに精通することを提案します )。
- iproute2-複数のルーティングテーブルを作成します。
- keepalived-LinuxでVRRPプロトコルを実装するため。
- ISC DHCPD-水平方向に拡張可能なDHCPサーバーとして。
- PowerDNS-ローカルネットワークのDNSサーバーとして。
IPアドレスとkeepalivedの構成を除き、ルーターはほぼ同じように構成されます。
インターフェース設定
VLANを構成します。 設定
/etc/network/interfaces
は次のようになります。
auto lo iface lo inet loopback post-up bash /etc/network/iprules.sh post-up ip route add blackhole 192.168.0.0/16 dns-nameservers 127.0.0.1 dns-search dz
ハイライト:
- ブラックホールを設定します-ローカルパケットがデフォルトルートに沿ってプロバイダーに向かって飛ぶのを防ぐことをお勧めします。
net.ipv4.conf.$IFACE.rp_filter=0
マルチnet.ipv4.conf.$IFACE.rp_filter=0
正しく機能するために必要です。- プロバイダーごとに、単一のデフォルトルートを持つ個別のルーティングテーブルを構成します。
特定のテーブルに送信するためのパケットマーキングを設定しましょう-iptablesにルールを追加します:
iptables -t mangle -A PREROUTING -i vlan110 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A PREROUTING -i vlan120 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3 iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff iptables -t mangle -A OUTPUT -o vlan110 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A OUTPUT -o vlan120 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3 iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff iptables -t mangle -A POSTROUTING -o vlan110 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x1/0x3 iptables -t mangle -A POSTROUTING -o vlan120 -m conntrack --ctstate NEW,RELATED -j CONNMARK --set-xmark 0x2/0x3
そして、マークされたパケットのルーティングルールを構成します
iprules.sh
ifup lo
実行するときに
iprules.sh
スクリプトを呼び出すことでこれを行います(上記の
/etc/network/interfaces
参照)。 スクリプト内:
これらのルーティングテーブルは、
/etc/iproute2/rt_tables
で宣言する必要があります。
メインゲートウェイバランサー
メインゲートウェイに優先順位を付けるためのユーティリティであるNetGWMを構成しましょう。 彼女はデフォルトルートを設定し、2つのルールに従ってオペレーターを選択します。a)当社が設定した優先順位、b)オペレーターのステータス(生きているかどうか)。
NetGWMをインストールするには
、GitHubの
ソースまたはUbuntuのリポジトリを使用できます。 Ubuntu 14.04 LTSの場合の2番目の方法は次のようになります。
/etc/netgwm/netgwm.yml
で、2つの演算子、それぞれのデフォルトルート、優先順位付け、アクセス制御の設定があることを示します。
oper1
および
oper2
という名前に注意してください。これらは、
/etc/iproute2/ip_tables
からのルーティングテーブルの名前です。 netgwmサービスを再起動して、システムのデフォルトゲートウェイの管理を開始します。
$ sudo service netgwm restart
keepalivedを構成する
Keepalivedは、Linux用のVRRPプロトコルの実装です。 このプロトコルを使用すると、サービス対象ネットワークのデフォルトルートとして使用される仮想IPを作成することで、フォールトトレラントルーティングスキームを実装できます。 プライマリサーバーに障害が発生すると、仮想IPがバックアップサーバーに自動的に転送されます。
この段階で、ルーター2がバックアップの役割を果たし、ルーター1がマスターの役割を果たすことを決定します。 設定ファイル
/etc/keepalived/keepalived.conf
変更してkeepalivedを設定します:
! ! Configuration File for keepalived global_defs { notification_email { admin@fromhabr.ru } notification_email_from keepalived@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MY_ROUTER } vrrp_instance VI_1 { interface vlan200
フォールトトレラントルーターはマルチコンポーネントであるため、マスターサーバーに障害が発生した場合のみ、バックアップ→マスターのキープアライブモードが切り替わるモードを使用することにしました。
nopreempt
パラメーターは、
nopreempt
正確に担当し
nopreempt
。
ISC DHCPDを構成する
ISC DHCPDを選択したのは、DHCPを複数のサーバーに拡張できるためです。 設定は簡単で、実際に実証されています。 さらに、このDHCPサーバーの開発者が、サーバー間でレプリカを整理するためのエレガントなソリューションを思いついたという事実も気に入りました。 プライマリサーバーとセカンダリサーバーの場合、異なるアドレスプールが割り当てられ、サーバーはリクエストに応答します。リクエストは最初にこれを実行し、プールからアドレスを発行します。 同時に、リースされたIPベースが同期されます。 サーバーの1つに障害が発生した場合、2番目のサーバーは、何も起こっていないかのように、プールからアドレスを発行し続けます。 障害が発生したサーバーが返されると、そのサーバーはプールから発行を開始し、衝突は発生しません。
config
/etc/dhcp/dhcpd.conf
:
update_key
キーを生成する必要があります。このキーを使用して、
mynet
ゾーンを更新します。 生成して表示します:
$ dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 64 -n HOST secret_key Ksecret_key.+157+64663 $ cat Ksecret_key.+*.private | grep ^Key | awk '{print $2}' bdvkG1HcHCM=
生成されたキーをコピーして、KEYという単語の代わりに構成ファイルに貼り付けます。
PowerDNSセットアップ
DNSサーバーとして、PowerDNSを優先しました。これは、MySQL DBMSにゾーンを保存する機能を備えているためです。このゾーンは、1番目と2番目のサーバー間で簡単に複製できます。 さらに、PoweDNSは、負荷の大きいルーターでうまく機能する強力なソリューションです。
データベースを準備して、PowerDNSの構成を開始します。
mysql> CREATE TABLE IF NOT EXIST `domains` ( id INT auto_increment, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(6) NOT NULL, notified_serial INT DEFAULT NULL, account VARCHAR(40) DEFAULT NULL, primary key (id) ); mysql> CREATE TABLE `records` ( id INT auto_increment, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(6) DEFAULT NULL, content VARCHAR(255) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, change_date INT DEFAULT NULL, primary key(id) ); mysql> CREATE TABLE `supermasters` ( ip VARCHAR(25) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) DEFAULT NULL ); mysql> CREATE INDEX `domain_id` ON `records`(`domain_id`); mysql> CREATE INDEX `rec_name_index` ON `records`(`name`); mysql> CREATE INDEX `nametype_index` ON `records`(`name`,`type`); mysql> CREATE UNIQUE INDEX name_index` ON `domains`(`name`);
quit;
ここで、PowerDNSを構成し、データベースの操作方法を教える必要があります。 これを行うには、
pdns-backend-mysql
パッケージをインストールし、
pdns-backend-mysql
/etc/powerdns/pdns.conf
を変更し
/etc/powerdns/pdns.conf
。
これで基本的なPowerDNS設定が完了しました。 また、DNSサーバーのパフォーマンスを大幅に向上させることができる再帰DNSクエリのプロセッサである、再帰を構成する必要もあります。 ファイル
/etc/powerdns/recursor.conf
ます。
daemon=yes forward-zones-file=/etc/powerdns/forward_zones local-address=127.0.0.1 local-port=5353 quiet=yes setgid=pdns setuid=pdns
forward_zones
ファイル
forward_zones
は、隣接サーバーにサービスを提供するイントラネットゾーンを
forward_zones
します。
piter_filial.local=192.168.2.1 2.168.192.in-addr.arpa=192.168.2.1
セットアップの最後に、
pdns
および
pdns-recursor
再起動し
pdns-recursor
。
開始後、サーバー間でMySQLレプリカを構成します。
おわりに
このソリューションは、最も純粋な形だけでなく使用します。 ほとんどの場合、プライマリおよびバックアップキャリアを介したVTun、OpenVPN、またはIPSecトンネルの追加と、Quaggaを使用して実装される動的ルーティングによって複雑になります。 したがって、この記事で提案されているスキームを、より複雑なソリューションを作成するための基盤として理解することを提案します。
コメントで質問したり、改善できるスキームの場所を示していただければ幸いです。 そして、もちろん、新しい有用な資料を見逃さないために、私たちのハブを購読してください! )