#author("2023-05-29T12:22:15+00:00","default:mogamin","mogamin")
#author("2023-05-29T13:41:11+00:00;2023-05-29T12:22:27+00:00","default:mogamin","mogamin")
* DHCPサーバの冗長化でハマった話 [#f2ef4b58]
|この記事を書いた日は 2021/01/29 です|

DHCPの冗長化手法の一つに、アドレスプールが重複しないように設定した DHCP サーバを 同一セグメントに複数配置する方法があります。

自分が愛用しているヤマハの RTX や NVR シリーズに内蔵されている DHCP サーバ機能でもこの方法は可能なのですが、 実際に試したときにハマったところがあったので、今後のためにメモしておきます。 

** TL;DR [#lccbf07f]
- クライアントのリース延長要求に対して、選択されていないDHCPサーバが DHCPNAK を送っていたのが原因
- DHCP サーバの実装や、準拠する RFC のバージョンによっては、アドレスプール外の DHCPREQUEST に対して DHCPNAK を投げるものがある
- ヤマハルータの DHCP 機能を使って同一セグメントに複数の DHCP サーバを設置する場合はdhcp server rfc2131 compliant onしておく
- ヤマハルータの DHCP 機能を使って同一セグメントに複数の DHCP サーバを設置する場合は `dhcp server rfc2131 compliant on` しておく

** 環境 [#i9e04e03]
RTX1210 2台を使用し、VRRP で冗長構成を組んでいます。 この構成で DHCP サーバも二重化するため、2台の RTX1210 の DHCP サーバ機能を有効化し、IPアドレスの範囲をずらして各々に設定しました。 

#ref(./20190619-rtx-vrrp-dhcp-001.png,wrap)

** 現象 [#ebedf40f]
この構成に変更して以降、NW内の端末で数秒~十数秒程度の瞬断が発生するようになりました。 頻度は1日に1回程度で、タイミングは各端末ともバラバラ。 

** 原因 [#lcc44a15]
直接の原因は、DHCP の再取得のときに選択されていない方の RTX1210 が DHCPNAK メッセージを投げていたことでした。

DHCP クライアントは DHCP で取得したIPアドレスをリース延長などで再取得するとき、 Requested IP Address に現在のIPアドレスを指定した DHCPREQUEST をブロードキャストします。 これに対し、現在のIPアドレスをリースしている方の RTX1210 は DHCPACK を返します。

ここまでは意図した通りの動作です。

ところが、もう一方の RTX1210 はリース情報を持たないクライアントからの DHCPREQUEST を受け取ることになるため、DHCPNAK を返してしまうのです。 

*** 切断発生までの DHCP メッセージのやり取り [#v0f324b2]
#ref(./20190619-rtx-vrrp-dhcp-002.png,wrap)

DHCPNAK を受け取ったクライアントは DHCP の規定により、アドレス設定シーケンスをふりだしから始めなければならないため、現在のIPアドレスを破棄してしまうわけです。 

** 対処 [#s4e61a7d]
RTX の DHCP サーバが RFC2131 準拠で動作するようにします 

RTX1210 config:
 dhcp server rfc2131 compliant on
 # または
 no dhcp server rfc2131 compliant

** 備考 [#mb1b8f57]
DHCP の仕様を規定した RFC1541 では、サーバが DHCPREQUEST の要件に応じることができない場合、 DHCPNAK を返す[[規定:https://tools.ietf.org/html/rfc1541#page-13]]があります。

つまり、アドレスプール外のIPアドレスが指定された DHCPREQUEST に対して DHCPNAK を返すのは RFC1541 準拠で動作する場合は適切な挙動のようです。 

一方、RFC1541 の差し替え版に当たる RFC2131 にも同様の規定がありますが、 こちらはサーバ内でクライアントのリクエストが適切でない保証が取れない場合には DHCPNAK を 返すべきではないという[[条件付き:https://tools.ietf.org/html/rfc2131#page-19]]になっています。 

RTX1210 のコンフィグでは `dhcp server rfc2131 compliant` で動作をどちらの RFC に合わせるかの選択が可能です。

この設定が `off` または `except remain-silent` になっていると、未知の DHCPREQUEST に対して DHCPNAK を返す動作になります。

RTX1200 以降の機種では工場出荷時の設定で `dhcp server rfc2131 compliant except remain-silent` が入っているので、他の DHCP サーバと併せて運用する場合は注意が必要です。 

** 参考情報 [#w73fdaad]
- [[RFC2131 - Dynamic Host Configuration Protocol:https://tools.ietf.org/html/rfc2131]]
- [[RFC1541 - Dynamic Host Configuration Protocol (Obsoleted):https://tools.ietf.org/html/rfc1541]]
- [[RFC2131 対応動作の設定 - ヤマハルーター技術情報:http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_server_rfc2131_compliant.html]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS