フェイルセーフLinuxルーターのレシピ







負荷の高いプロジェクトでは、冗長性と信頼性に対する要件が常に増加しています。 ネットワーク全体の可用性はその安定性に依存するため、インフラストラクチャで最も重要なリンクの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)がローカルネットワークに割り当てられます。 トランクはスイッチ間に編成され、両方のルーターをトランクにリンクします。これは、仮想ルーターの「ハート」になります( ルーターオンスティック方式)。



この配置により、いずれかのコンポーネント(ルーター、スイッチ、またはオペレーター)に障害が発生した場合に、有効なネットワークを離れることができます。



ルーターの作業で使用する基本的なコンポーネントのスタック:





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 # lan, wan: trunk dot1q auto eth0 iface eth0 inet manual # lan auto vlan200 iface vlan200 inet static vlan_raw_device eth0 address 192.168.1.2 netmask 255.255.255.0 # Operator1 auto vlan110 iface vlan110 inet static vlan_raw_device eth0 address 1.1.1.2 netmask 255.255.255.252 post-up ip route add default via 1.1.1.1 table oper1 post-up sysctl net.ipv4.conf.$IFACE.rp_filter=0 post-down ip route flush table oper1 # Operator2 auto vlan120 iface vlan120 inet static vlan_raw_device eth0 address 2.2.2.2 netmask 255.255.255.252 post-up ip route add default via 2.2.2.1 table oper2 post-up sysctl net.ipv4.conf.$IFACE.rp_filter=0 post-down ip route flush table oper2
      
      





ハイライト:





特定のテーブルに送信するためのパケットマーキングを設定しましょう-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



参照)。 スクリプト内:



 #!/bin/bash /sbin/ip rule flush #operator 1 /sbin/ip rule add priority 8001 iif vlan110 lookup main /sbin/ip rule add priority 10001 fwmark 0x1/0x3 lookup oper1 /sbin/ip rule add from 1.1.1.2 lookup oper1 #operator 2 /sbin/ip rule add priority 8002 iif vlan120 lookup main /sbin/ip rule add priority 10002 fwmark 0x2/0x3 lookup operator2 /sbin/ip rule add from 2.2.2.2 lookup operator2
      
      





これらのルーティングテーブルは、 /etc/iproute2/rt_tables



で宣言する必要があります。



 # reserved values 255 local 254 main 253 default 0 unspec # local 110 oper1 120 oper2
      
      





メインゲートウェイバランサー



メインゲートウェイに優先順位を付けるためのユーティリティであるNetGWMを構成しましょう。 彼女はデフォルトルートを設定し、2つのルールに従ってオペレーターを選択します。a)当社が設定した優先順位、b)オペレーターのステータス(生きているかどうか)。



NetGWMをインストールするには、GitHubソースまたはUbuntuのリポジトリを使用できます。 Ubuntu 14.04 LTSの場合の2番目の方法は次のようになります。



 #   $ sudo wget https://apt.flant.ru/apt/flant.trusty.common.list -O /etc/apt/sources.list.d/flant.common.list #   $ wget https://apt.flant.ru/apt/archive.key -O- | sudo apt-key add - #  HTTPS- —  ,      $ sudo apt-get install apt-transport-https #      netgwm $ sudo apt-get update && sudo apt-get install netgwm
      
      





/etc/netgwm/netgwm.yml



で、2つの演算子、それぞれのデフォルトルート、優先順位付け、アクセス制御の設定があることを示します。



 #          #   ()    gateways: oper1: {ip: 1.1.1.1, priority: 1} oper2: {ip: 2.2.2.1, priority: 2} #  ,      «» #    online,  offline,     # -.     ( ),   # netgwm  ,    min_uptime: 900 #   ,    netgwm  #     check_sites: - 192.5.5.241 - 198.41.0.4
      
      







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 # VRRP  VLAN   virtual_router_id 17 #   ,    Master  Backup nopreempt #  ,  .  state MASTER #     state BACKUP priority 200 #       ,  100 advert_int 1 #    “ ” garp_master_delay 1 garp_master_refresh 60 authentication { auth_type PASS auth_pass qwerty #     } virtual_ipaddress { #  ,          #   ,     VRRP- 192.168.1.1/24 broadcast 192.168.1.255 dev vlan200 } #        Master, Backup, Fault  #   keepalived;      notify_master /etc/keepalived/scripts/master.sh notify_backup /etc/keepalived/scripts/backup.sh notify_stop /etc/keepalived/scripts/stop.sh notify_fault /etc/keepalived/scripts/fault.sh }
      
      





フォールトトレラントルーターはマルチコンポーネントであるため、マスターサーバーに障害が発生した場合のみ、バックアップ→マスターのキープアライブモードが切り替わるモードを使用することにしました。 nopreempt



パラメーターは、 nopreempt



正確に担当しnopreempt







ISC DHCPDを構成する



ISC DHCPDを選択したのは、DHCPを複数のサーバーに拡張できるためです。 設定は簡単で、実際に実証されています。 さらに、このDHCPサーバーの開発者が、サーバー間でレプリカを整理するためのエレガントなソリューションを思いついたという事実も気に入りました。 プライマリサーバーとセカンダリサーバーの場合、異なるアドレスプールが割り当てられ、サーバーはリクエストに応答します。リクエストは最初にこれを実行し、プールからアドレスを発行します。 同時に、リースされたIPベースが同期されます。 サーバーの1つに障害が発生した場合、2番目のサーバーは、何も起こっていないかのように、プールからアドレスを発行し続けます。 障害が発生したサーバーが返されると、そのサーバーはプールから発行を開始し、衝突は発生しません。



config /etc/dhcp/dhcpd.conf







 #  DDNS    ddns-updates on; ddns-update-style interim; do-forward-updates on; update-static-leases on; deny client-updates; # ignore, deny, allow update-conflict-detection false; update-optimization false; key "update-key" { algorithm hmac-md5; secret ""; #    .  }; zone 1.168.192.in-addr.arpa. { primary 192.168.1.1; key "update-key"; } zone mynet. { primary 192.168.1.1; key "update-key"; #   failover peer "failover-partner" { primary; #      secondary address 192.168.1.3; #    port 519; peer address 192.168.1.2; #    peer port 520; max-response-delay 60; max-unacked-updates 10; load balance max seconds 3; } default-lease-time 2400; max-lease-time 36000; log-facility local7; authoritative; option ntp-servers 192.168.1.1, ru.pool.ntp.org; #      subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.51 192.168.1.150; #  100 ,  option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; option domain-name-servers 192.168.1.1; option routers 192.168.1.1; ddns-domainname "mynet."; # …    .     pool { failover peer "failover-partner"; range 192.168.1.151 192.168.1.250; } # …   leases host printer { hardware ethernet 00:26:73:47:94:d8; fixed-address 192.168.1.8; } }
      
      





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 CLI $ mysql -u root -p #       ,      mysql> CREATE DATABASE IF NOT EXIST powerdns; mysql> GRANT ALL ON powerdns.* TO 'pdns_admin'@'localhost' IDENTIFIED BY 'pdns_password'; mysql> GRANT ALL ON powerdns.* TO 'pdns_admin'@'localhost.localdomain' IDENTIFIED BY 'pdns_password'; mysql> FLUSH PRIVILEGES; #           mysql> USE 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







 #    allow-axfr-ips=127.0.0.0/8,192.168.1.0/24 allow-dnsupdate-from=127.0.0.0/8,192.168.1.0/24 allow-recursion=127.0.0.0/8,192.168.1.0/24 #    config-dir=/etc/powerdns daemon=yes disable-axfr=no dnsupdate=yes guardian=yes local-address=0.0.0.0 local-address-nonexist-fail=no local-port=53 local-ipv6=::1 #         master=yes slave=no recursor=127.0.0.1:5353 setgid=pdns setuid=pdns socket-dir=/var/run version-string=powerdns webserver=no #  MySQL launch=gmysql #    -  ,   keepalived gmysql-host=192.168.1.1 gmysql-port=3306 #    ,      gmysql-user=pdns_admin gmysql-password=pdns_password gmysql-dnssec=yes
      
      





これで基本的な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を使用して実装される動的ルーティングによって複雑になります。 したがって、この記事で提案されているスキームを、より複雑なソリューションを作成するための基盤として理解することを提案します。



コメントで質問したり、改善できるスキームの場所を示していただければ幸いです。 そして、もちろん、新しい有用な資料を見逃さないために、私たちのハブを購読してください! )



All Articles