Datalink Layerでの冗長化プロトコル
TCP/IPを利用する際、さまざまなLayerで冗長化Protocolが定義されているが、特に利用頻度が高いのはおそらくDatalink Layer(特にEthernet)におけるそれだろう。すぐに思いつく限りでもVRRP/HSRP/CARPは思いつくし、どうやらGLBPというのもあるらしい。
Protocol Summary
以下に各プロトコルに関する簡単な説明を記載する。
HSRP
Cisco(TM)によって設計・実装された冗長化プロトコル。1998年、RFC2281で説明されている。プロプラエタリ実装であり、仕様は非公開。
HSRPは非常に古いProtocolであり、現在はversion2が主流。v2でIPv6がサポートされ、実装状の改善(安定性の向上、規模拡張容易性等の向上など)もされているため、現時点で利用するならv2であるべきである。
複数のNode間で共通のIP Addressを保持し、その中から代表(Master)を選出し、Masterがパケットの転送を行う
HSRPはあくまで共通のIP Addressを選出するためのProtocolであり、動作中のRouterの各種状態(NAT状態や経路表)は同期しないので、状態をもつ上位層プロトコルの取り扱いには注意が必要。
VRRP
Virtual Router Redundancy Protocolの略
HSRPがプロプラエタリ実装であるため、さまざまな実装でHSRPで実装された機能を利用できるようにIETFで検討されたProtocol。
複数のNode間で共通のIP Addressを保持し、その中から代表(Master)を選出し、Masterがパケットの転送を行う
VRRPはあくまで共通のIP Addressを選出するためのProtocolであり、動作中のRouterの各種状態(NAT状態や経路表)は同期しないので、状態をもつ上位層プロトコルの取り扱いには注意が必要。
(2023現在)現実的には最も普及・利用されているL2 Redundancy Protocolと言えるだろう
VRRPは各種Network機器に実装されており、HSRPを開発したCisco社のNetwork機器でも利用可能なことが多い
Opensource実装
- https://gitlab.com/fredbcode/Vrrpd (Moved from GitHUB)
Advanced VRRPd (Archived at 2023/04/14)
- FRR Routing Daemon
他多数
CARP
Common Address Redundancy Protocolの略
OpenBSD Projectによって開発された VRRP 代替Protocol。
現在、OpenBSD, FreeBSD, NetBSDは標準でKernelもしくはKernel Moduleとして取り込まれている。LinuxやmacOSなどのPlatformでは、uCARP(Userland CARP)やCARP-rsなどの実装があるが、uCARP/CARP-rsはすでにArchive状態であり、更新は停止していると思われる。
簡単な歴史
IETFは1990年代後半、Routerの冗長性を確保するためのProtocol策定作業を開始した。Ciscoはこの分野における特許を取得していたため、それをIETFに通知、1998年にはHSRPに関する特許を通知した。さまざまな議論の末、IETF VRRP WGは、Ciscoが合理的で非差別的なライセンス条件の下で第三者に特許を利用できるようにする限り、特許技術に依存したまま、VRRPを承認することを決定した。その際、VRRPはHSRPプロトコルにあった問題を解決したため、CiscoはHSRPを独自のものとして主張しつつ、VRRPも使用し始めた。
以上の経緯より、Ciscoは、OpenBSD開発チームに対し、HSRPに特許を適用することを通告した。この際に提示されたCisco側のライセンス条件がOpenSourceとしてのVRRP実装を妨げたため、OpenBSD開発チームはVRRPの代替となるCARPの開発を開始した。OpenBSDはセキュリティに重点を置いており、CARPでやり取りされる通信を保護するために暗号技術を使用するようにCARPを設計した。また、Masterを決めるためのアルゴリズムも再設計したため、CARPはVRRPと根本的に異なる実装であって、Ciscoの特許を侵害しないことが保証された。
なお、Ciscoの保持するHSRPに関する米国特許は2014年に失効したが、このHSRP/VRRP/CARPの3つのプロトコルは現在も並行して共存している。
OpenBSDにおけるCARPにはL2でのLoad Balance機構(arpbalance)が実装されているが、FreeBSD 10.0以降では(CARPが再実装されたため)LB機能は実装されていない。(それ以前のFreeBSDでLB機構が実装されていたかは確認していない)。また、NetBSDは、Manual Pageを見る限りarpbalanceは実装されてるように見えるが、確認はしていない。このARP Balance機構を利用すると、複数ホストでLoad Balanceできる可能性がある。
VRRPとの非互換性
OpenBSDプロジェクトは、CARPのために、IANAに対し一意の番号を要求したが、拒否された。OpenBSDは特許対応等のためVRRPを「公式」な配布物に組み入れられないため、OpenBSDにおけるL2での冗長化ProtocolとしてはCARPを採用した。そのため、CARPに対し、他と競合しない(予定だった)IP Protocol 112に設定し、IANAに通知した。IANAはこれに対し、返事を拒否した。IANAではプロトコル番号112をVRRPに割り当て(1998年、RFC 2338)、現在でもプロトコル番号112はVRRPによって引き続き使用されている。このため、VRRPとCARPは現在でもプロトコル番号112で衝突したままである。
ただし、プロトコル番号が衝突していても、VRRPグループIDとCARP仮想ホストIDが異なる限り、同じブロードキャストドメインでVRRPとCARPを使用することは可能である。
GLBP
Gateway Load-Balancing Protolの略
Cisco(TM)によって設計・実装された冗長化プロトコル。
HSRP、VRRP、CARPが、複数台のnodeを 1 Master(Active) - Other Slave(Standby) 構成で冗長化を図るのに対し、GLBPは Multi Master構成で利用でき、負荷分散を図れるところが特徴。分散方法を決めるアルゴリズムとしては、host-depended/RoundRobin/Weightedの3種がある。
GLBPは、グループごとに1つのAVG(Active Virtual Gateway)を選択する。他のグループメンバーは、AVGに障害が発生した場合にAVGのバックアップとして機能する。AVGは、自身を含むGLBPグループの各メンバーに仮想MACアドレスを割り当て、AVF(Active Virtual Forwarders)を有効にする。各AVFは、仮想MACアドレスに送信されたパケットを転送する責任を負う。AVFは最大4台まで存在可能である。
IOS 12.2(33)SXIでGLBPがIPv6をサポートした。
その他
上記の他にもさまざまな実装がある。以下に一部を記載する
- Extreme Standby Router Protocol (ESRP)
- Extreme社製品に実装されている、高速FailoverおよびL2保護を実装したExtreme社独自プロトコル
- Routed Split multi-link trunking (R-SMLT)
- Avaya社独自プロトコル
- NetScreen Redundancy Protocol (NSRP)
- Juniper社独自プロトコル。元来は、Juniper社に買収されたNetscreen社の独自プロトコル
- Chassis Cluster Redundant Ethernet
- Juniper社独自プロトコル。SRXプラットフォームで使用されている
- Multi-active Gateway Protocol (MAGP)
- Mellanox社独自プロトコル。VRRPを元にした、Active-Acvive運用を可能にするプロトコル
- VRRPE
- Brocade社独自プロトコル
Protocol間比較
項目 | HSRP v1 | HSRP v2 | VRRP | CARP | GLBP |
---|---|---|---|---|---|
規格 | Cisco独自 | 同左 | RFC3768 | OpenBSD独自 | Cisco独自 |
グループ構成 | Active 1台 | 同左 | Master 1台 | Master 1台 | AVG 1台 |
Standby その他 | 同左 | Backup その他 | Backup その他 | AVF その他(最大4台) | |
最大グループ数 | 255 | 4095 | 255 | 255 | 1024 |
パケット転送 | Active機 | 同左 | Master機 | Master機 | AVF機 |
ARP Requestへの返答 | Active機 | 同左 | Master機 | Master機 | AVG機 |
Virtual IP Address | 未使用アドレス | 同左 | 物理I/Fもしくは未使用アドレス | 未使用アドレス | 未使用アドレス |
Virtual MAC Address | 0000.0c07.acXX | 0000.0c9f.fXXX | 0000.5e00.01XX | 0000.5e00.01XX | 0007.b400.XXYY |
XX = グループ番号 | 同左 | XX = グループ番号 | XX = グループ番号 | XX = グループ番号 | |
YY=MACアドレス番号 | |||||
Hello Multicast address | 224.0.0.2 | 224.0.0.102 | 224.0.0.18 | 224.0.0.18 | 224.0.0.102 |
Timer default | Hello 3s | 同左 | advertise 1s | advbase 1s | Hello 3s |
Hold 10s | 同左 | master-down 3s | advsket 0ms | Hold 10s | |
認証方式 | Plane text/MD5 | 同左 | Plane text/MD5 | SHA1 | Plane text/MD5 |
preempt | 無効 | 同左 | 有効 | 無効 | AVG:無効, AVF:有効 |
動作プロトコル | UDP上 | 同左 | IP上 | IP上 | UDP上 |
UDP/IPでカプセル化 | 同左 | IPでカプセル化 | IPでカプセル化 | UDP/IPでカプセル化 | |
メッセージ送信に使うポート | 1985/UDP | 同左 | 112/IP | 112/IP | 3222/UDP |