既存のDHCPサーバが存在する場合でもPXE Bootをする(dnsmasqを使ったProxy DHCPの設定)

はじめに

PXE BootをするためにはDHCPサーバにブート情報を設定する必要があるが,Buffalo等の家庭用ルータが設置してあるとこれができない.だからといって別途サブネットを分けたりするのも面倒.

そこで,Proxy DHCPという仕組みを使うと,既存のDHCPサーバの設定を変更せずにブート情報を流すことができる. (参考:PXEには3種類ある

今回はdnsmasqを使ってProxy DHCPの設定を行う.

環境

  • サブネット:192.168.11.0/24
  • Proxyサーバ(dnsmasq):192.168.11.100
  • TFTPサーバ:192.168.11.201
  • (既存のBuffaloルータ:192.168.11.1)

ブートの流れ

  1. PXE ClientがDHCP要求を行う
  2. 既存のDHCPサーバ(Buffaloルータ)が応答する(DHCP Offer)
  3. Proxyサーバ(dnsmasq)がnext-serverとbootfile-nameを載せて応答する(DHCP Offer)
  4. PXE Clientが既存DHCPサーバに対してDHCP Requestを行う
  5. 既存DHCPサーバがDHCP Ackを返す
  6. PXE ClientがProxyサーバに対してDHCP Requestを行う
    • ClientとProxy間はポート4011/UDPが使用される
  7. Proxyサーバがnext-serverとbootfile-nameを載せてACKを返す
  8. PXE ClientがTFTPサーバへアクセスする

dnsmasqの設定

(参考:PXE Server on Existing Network (DHCP Proxy) with Ubuntu | manski's blog

ここではTFTPサーバの設定方法は割愛する.

  • /etc/dnsmasq.conf に以下を追記
port=0
log-dhcp
dhcp-range=192.168.11.0,proxy
dhcp-boot=pxelinux.0,192.168.11.201
pxe-service=x86PC,"Network Boot",pxelinux,192.168.11.201

ここでpxe-service オプションにTFTPサーバのIPアドレスを書かないと,next-serverにProxyサーバIPアドレスが設定されてしまうので注意. dhcp-bootにしか書かないと”ブートの流れ”の3と7でnext-serverのIPアドレスが変わり,PXEブートに失敗する. (参考:[Dnsmasq-discuss] dnsmasq dhcpProxy and PXE next-server not working

あとはdnsmasqを再起動すれば設定完了.

パケットキャプチャしてみた

PXEブート時のDHCPパケットをキャプチャするとこのようになった.

f:id:jackson58:20180531185459p:plain

192.168.11.26PXE Clientに割り当てられたIPアドレス

4011/UDPの通信はプロトコルBOOTP/DHCPに変えてあげることでパースしてくれる. f:id:jackson58:20180531185858p:plain