DHCP relay agent と giaddr と source address

DHCP relay agentとは

DHCP パッケットをDHCPサーバへ転送するエージェント。

DHCPclient -- DHCPrelayagent -- DHCPserver

みたいな感じで、DHCPclientとDHCPserverが同一セグメントにいない場合に間に入ってくれるやつ。

仕組みみたいなもの

clientから、DHCPDISCOVERがブロードキャストされると、relayagentは、giaddrにパケットを受け取ったインターフェースのアドレスを入れ、 serverがある方のインターフェースからパケットを送信

serverは受け取ったDHCPDISCOVERをもとにDHCPREPLYパケットを作成。このとき、OFFERするIPAddresは、giaddrを見て決める。 作成したパケットは、giaddr宛に送信。

relayagentは、DHCPREPLYパケットを受け取ったあと、giaddrを見て、送信するインターフェースを決め、そこからclientに向けてパケットを送信する。

relayagent から server に送信するとき、IPAddressはどれを使う?

DHCPclient -- ○DHCPrelayagent● -- DHCPserver

  • serverがいる方のアドレス(●)
  • clientがいる方のアドレス(○) 通常、ある端末からある端末へIPパケットを送信する時の、source addressは、宛先端末へ近いインターフェースのものを使う。

つまり、serverがいる方。ただ、serverからの戻りは、giaddrが宛先になっています。(でないとrelayagentがどのアドレスからそのパケットを送信すればよいか判断できなくなるため RFCに記載がある。)

困ること

relayagent と serverの間に、ステートフルなFirewallがあったりすると…… relayagentから送信したパケットの戻りが、同一ステートとみなされず、破棄されることが。

実際の実装

Cisco IOSは、relayagentのsource addressをgiaddrに合わせている。ASAは、serverに近い方のアドレスだったのを、IOSに合わせる変更を行っている (CSCuo89924)。

Juniperは、紆余曲折あったようで 最初はsource addressをgiaddrに合わせていて変更不可だったのを、serverに近い方のアドレスに変更し、最後には、source addressをgiaddrに合わせるのをデフォルトとして、設定で変更できるようにしている。

Linux(CentOS7)では、source addreessは、宛先端末へ近いインターフェースのものが使われる。

Firewall側で対応してほしい

ステートレスに扱うよう、対応してほしい。