主な機能概要
基本構成 (IPv4)
このLVSクラスタでは、NAT(ネットワークアドレス変換)による転送の仕組みを利用しています。 VIPに対する接続は、まずディレクターが受信したうえで、接続先としてスケジューリングした実サーバに転送します。
その際、送信先アドレスを、VIPから適切なRIPに変換します。実サーバからの返信パケットもディレクターを経由し、その際に送信元アドレスをRIPからVIPに変換します。
ディレクター
ディレクターの設定にはipvsadmを使用できます。
【例】まず仮想サービスを10.0.0.1のポート53で作成し、次に3台の実サーバを10.0.1.2~4で作成しています。実サーバもそれぞれポート53を使用します。
# ipvsadm -A -t 10.0.0.1:53
# ipvsadm -a -t 10.0.0.1:53 -r 10.0.1.2:53 -m
# ipvsadm -a -t 10.0.0.1:53 -r 10.0.1.3:53 -m
# ipvsadm -a -t 10.0.0.1:53 -r 10.0.1.4:53 -m
-mオプションは、転送にNAT(masq)を使用するという意味です。-tオプションはTCPを表します。
UDPの仮想サービスの場合は-tの代わりに-uを指定します。
# ipvsadm -A -u 10.0.0.1:53
# ipvsadm -a -u 10.0.0.1:53 -r 10.0.1.2:53 -m
# ipvsadm -a -u 10.0.0.1:53 -r 10.0.1.3:53 -m
# ipvsadm -a -u 10.0.0.1:53 -r 10.0.1.4:53 -m
IPVSに設定した内容はipvsadm -Lnで確認できます。
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:53 wlc
-> 10.0.1.2:53 Masq 1 0 0
-> 10.0.1.3:53 Masq 1 0 0
-> 10.0.1.4:53 Masq 1 0 0
UDP 10.0.0.1:80 wlc
-> 10.0.1.2:80 Masq 1 0 0
-> 10.0.1.3:80 Masq 1 0 0
-> 10.0.1.4:80 Masq 1 0 0
実サーバ
実サーバは、適切なアプリケーションサーバーを稼動するように構成します。この例では、ApacheやlighttpdなどのHTTPサーバで問題ありません。 重要なことは、実サーバからクライアントに返す応答パケットがディレクター経由で返送されるようにすることです。そのためには、クライアントが実サーバとは別のネットワークにあることを確認し、ディレクターがクライアントに至る経路となるように実サーバで設定します。それには通常、デフォルトルートの次のホップとしてDIPを設定します。この設定は、使用しているディストリビューションのネットワーク設定スクリプトで行うのが一般的ですが、ipコマンドを使って手動で設定することもできます。
【例】
# ip route del 0.0.0.0/0
# ip route add 0.0.0.0/0 via 10.0.1.1
# ip route sh
default via 10.0.1.1 dev eth0
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.2
基本構成(IPv6)
IPv6の仮想サービスの構成はIPv4の場合と似ています。
この例では、IPv4の例と同様に、NATを使った転送の仕組みを利用しています。
ディレクターディレクターの設定にはipvsadmを使用できます。
【例】 まず仮想サービスをfd16:a2f5:c4d7::1のポート53で作成し、次に3台の実サーバをfd16:a2f5:c4d7:1::2~4で作成しています。
実サーバもそれぞれポート53を使用します。
# ipvsadm -A -t [fd16:a2f5:c4d7::1]:53
# ipvsadm -a -t [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::2]:53 -m
# ipvsadm -a -t [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::3]:53 -m
# ipvsadm -a -t [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::4]:53 -m
ipvsadmでIPv6のアドレスを指定するときには角かっこで囲む必要があります。
IPv4の場合と同じで、-mオプションは転送にNAT(masq)を使用するという意味です。-tオプションはTCPの仮想サービスであることを表します。UDPの仮想サービスの場合は-tの代わりに-uを指定します。
【例】
# ipvsadm -A -u [fd16:a2f5:c4d7::1]:53
# ipvsadm -a -u [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::2]:53 -m
# ipvsadm -a -u [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::3]:53 -m
# ipvsadm -a -u [fd16:a2f5:c4d7::1]:53 -r [fd16:a2f5:c4d7:1::4]:53 -m
実サーバ
IPv4の例のときと同じように、実サーバは適切なアプリケーションサーバーを稼動するように構成します。
この例では、ApacheやlighttpdなどのHTTPサーバで問題ありません。
IPv4の例と同じように、DIPをデフォルトルートとして設定すれば、クライアントへの返信パケットをディレクター経由で返送できます。
# ip route del default
# ip route add ::/0 via fd16:a2f5:c467::1:1
# ip -6 route sh
fd16:a2f5:c467:1::/64 dev dummy0 metric 1024
default via fd16:a2f5:c467:1::1 dev dummy0 metric 1024
基本的な監視
IPVSには、現在の状態を確認できる機能があります。
ipvsadm-Lnを実行すると、アクティブな接続と非アクティブな接続の数が実サーバごとに表示されます。アクティブな接続とはESTABLISHEDの状態にある接続、非アクティブな接続とはそれ以外の状態にある接続です。
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.1:80 wlc
-> 10.0.1.2:80 Masq 1 10 34
-> 10.0.1.3:80 Masq 1 12 21
-> 10.0.1.4:80 Masq 1 9 27
ipvsadm -Ln -?statsを実行すると、接続数、送受信パケット数、および送受信バイト数が実サーバごとに表示されます。
# ipvsadm -Ln -?stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.0.0.1:80 113 2405 2614 19441 23700
-> 10.0.1.2:80 44 892 978 7234 9245
-> 10.0.1.3:80 33 653 843 5525 6523
-> 10.0.1.4:80 36 589 793 6682 7932
ipvsadm -Ln ?rateを実行すると、1秒あたりの接続数、送受信パケット数、および送受信バイト数が実サーバごとに表示されます。
# ipvsadm -Ln -?rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 10.0.0.1:80 12 204 251 1946 2370
-> 10.0.1.2:80 4 83 95 743 924
-> 10.0.1.3:80 3 64 82 582 652
-> 10.0.1.4:80 2 57 74 621 793
ipvsadm -Lcnを実行すると、現在のそれぞれの接続の概要が表示されます。
# ipvsadm -Lcn
IPVS connection entries
pro expire state source virtual destination
TCP 01:41 TIME_WAIT 10.5.0.1:34120 10.0.0.1:80 10.0.1.3:80
TCP 01:01 TIME_WAIT 10.5.0.1:34119 10.0.0.1:80 10.0.1.4:80
TCP 14:49 ESTABLISHED 10.5.0.1:34123 10.0.0.1:80 10.0.1.2:80
ネットワーク名前空間
ネットワーク名前空間とは、Linuxカーネルが提供する軽量な仮想化機構です。
簡単に言うと、分離されたネットワークスタックをカーネルがプロセスグループに提供することによって機能する仕組みです。これには、プライベートループバックインターフェイスやルーティングテーブル、および仮想ネットワークデバイスと物理ネットワークデバイスへのプライベートアクセスが含まれます。独自のネットワーク名前空間が明示的に割り当てられていないプロセスグループは、デフォルトのネットワーク名前空間を使用します。
IPVSはネットワーク名前空間をサポートするように拡張されているため、ネットワーク名前空間では、仮想サービスおよび対応する実サーバを持つプライベートなIPVSのインスタンスにアクセスできます。簡単に言うと、以前はグローバルなIPVS設定だったものが、現在ではネットワーク名前空間ごとの設定と考えることができます。 ネットワーク名前空間を利用する場合でも、目的のネットワーク名前空間自体の設定以外には、IPVSに特別な設定は必要ありません。
ネットワーク名前空間
IP仮想サービスとfwmark仮想サービス
仮想サービスには、IP仮想サービスとfwmark仮想サービスの2種類があります。両者は、仮想サービスに送られるパケットの識別方法が異なります。
ワイルドカードサービス
持続性を有効にしたIP仮想サービスでは、ポートにゼロを使用できます。このようにしたサービスはワイルドカードサービスと呼ばれ、任意のポートに対する接続を受け入れます。これにより、前述のfwmark仮想サービスの例と同じように、複数のポートにまたがった持続性を実現できます。ただし、複数のVIPにまたがった持続性は実現できませんが、fwmark仮想サービスを使えば可能です。
スケジューリングアルゴリズム
IPVSには、さまざまなニーズに対応する多数のスケジューリングアルゴリズムが用意されています。それぞれのIVPSサービスは、いずれか1つのスケジューリングアルゴリズムのみを使用します。
キャッシュバイパス
以下の条件を満たす場合に、接続を送信先に直接転送できる仕組みです。
- 接続にスケジューリングされた実サーバが使用できない。
- 接続がユニキャストである。
- fwmark仮想サービスに対する接続である。
キャッシュバイパスは、Destination Hashing(DH)およびSource Hashing(SH)のスケジューリングアルゴリズムと組み合わせて使うことを意図したものです。
ワンパケットスケジューリング
仮想サービスの設定オプションの1つで、UDP接続のスケジューリングの粒度を変更するためのものです。
持続性
同じクライアントからの接続を同じ実サーバに転送できるようにするための仕組みです。実サーバがローカルで保持している状態の中に、他の実サーバと同期していないものがある場合には、この機能が必要となることがあります。
持続性エンジン
デフォルトでは、持続性のキーとして使われるのは送信元IPアドレスですが、場合によっては、別の情報を持続性のキーとして使用できると便利なこともあります。それを実現するのが持続性エンジンです。 持続性エンジンのフレームワークを導入する動機となり、現時点で持続性エンジンとして唯一実装されているのが、UDPのSIPパケットを扱うSIP持続性エンジンです。各パケットの本体からコールIDを抽出し、それを持続性のキーとして使います。このエンジンはワンパケットスケジューリングと組み合わせて使うことを想定しています。
転送方法
ディレクターから実サーバにパケットを転送する方法のことです。IPVSは、以下の転送方法を実装しています。
-
ダイレクトルーティング(IPVS-DR、gatewaying、gate)
- トンネリング(IPVS-TUN、ipip)
- ネットワークアドレス変換(IPVS-NAT、masquerading、masq)
- ローカルノード(IPVS-LOCAL)
アプリケーションモジュール
特別な処理が必要なプロトコルに対応できるようにIPVSの動作を変更できます。
NFCT
netfilterに必要な情報を提供するためにIPVSに加えられた拡張のことをNFCT(Netfilter Connection-Tracking)といいます。
SNAT
パケットの送信元アドレスを変換する機能です。IPVSでいうと、クライアントIPをDIP(ディレクターのアドレス)に変換するのが一般的です。
休止
仮想サービスから実サーバが削除されると、その実サーバには新しい接続がスケジューリングされなくなります。また、その実サーバにスケジューリングされていた接続がパケットを受信すると、そのパケットはリセットされます。
接続の同期
ディレクター間で接続テーブルを同期する仕組みで、一方のディレクターが別のディレクターに対し、自らの接続テーブルのエントリを通知する処理を行います。この機能は、アクティブなディレクターが変更したときでも、同期した接続を継続できるため、ディレクターをマスター/スタンバイ構成で利用している場合に有効です。
防御戦略
サービス拒否攻撃など、ディレクターの対応許容範囲を超えるパケットや接続が押し寄せた場合の影響を抑えるためにIPVSが備仕組みです。