跳转至

dnsmasq

dnsmasq 近年来越来越受欢迎。它可以很容易地配置为支持 iPXE。

DHCP 代理

如果你无法修改现有的 DHCP,那么代理就是可行的方案。它使用 ''选项 43'' 显示菜单,并使用 UDP port 4011 进行 PXE 配置,而 IP 和其他信息由你的默认 DHCP 服务器提供。

要使用 PXE 链式加载,我们将配置 dnsmasq 向传统 PXE 客户端提供 undionly.kpxesnponly.efi,然后使用 tags 只向 iPXE 客户端分发"真正的"启动配置。将使用 iPXE 特性选项来验证它具备我们想要的所有特性,所有 iPXE 特有的选项请参见 dhcp 页面

需要修改的内容:

  • 10.1.1.0 —— 你的子网
  • eth0 —— 要监听的接口,或切换到 bind-dynamic
  • 10.1.1.2 —— 你的 TFTP 服务器 IP
  • http://boot.ipxe.org/demo/boot.php —— 进入 iPXE 后要运行的脚本
  # Known working dnsmasq version 2.85 config for iPXE proxydhcp usage
  # Debug logging
  log-debug

  # Disable DNS server
  port=0

  # send disable multicast and broadcast discovery, and to download the boot file immediately
  # DHCP_PXE_DISCOVERY_CONTROL, should be vendor option? Needs more understanding and source
  dhcp-option=vendor:PXEClient,6,2b

  # This range(s) is for the public interface, where dnsmasq functions
  # as a proxy DHCP server providing boot information but no IP leases.
  # Any ip in the subnet will do, so you may just put your server NIC ip here.
  dhcp-range=10.1.1.0,proxy

  interface=eth0
  # bind-dynamic - remove interface and use this instead to listen everywhere?
  # Disable re-use of the DHCP servername and filename fields as extra
  # option space. That's to avoid confusing some old or broken DHCP clients.
  dhcp-no-override

  #dhcp-match=set:<tag>,<option number>|option:<option name>|vi-encap:<enterprise>[,<value>]
  #dhcp-boot=[tag:<tag>,]<filename>,[<servername>[,<server address>|<tftp_servername>]]

  # Based on logic in https://gist.github.com/robinsmidsrod/4008017
  # iPXE sends a 175 option, checking suboptions
  dhcp-match=set:ipxe-http,175,19
  dhcp-match=set:ipxe-https,175,20
  dhcp-match=set:ipxe-menu,175,39
  # pcbios specific
  dhcp-match=set:ipxe-pxe,175,33
  dhcp-match=set:ipxe-bzimage,175,24
  dhcp-match=set:ipxe-iscsi,175,17
  # efi specific
  dhcp-match=set:ipxe-efi,175,36
  # combination
  # set ipxe-ok tag if we have correct combination
  # http && menu && iscsi ((pxe && bzimage) || efi)
  tag-if=set:ipxe-ok,tag:ipxe-http,tag:ipxe-menu,tag:ipxe-iscsi,tag:ipxe-pxe,tag:ipxe-bzimage
  tag-if=set:ipxe-ok,tag:ipxe-http,tag:ipxe-menu,tag:ipxe-iscsi,tag:ipxe-efi

  #pxe-service=[tag:<tag>,]<CSA>,<menu text>[,<basename>|<bootservicetype>][,<server address>|<server_name>]
  #pxe-prompt=[tag:<tag>,]<prompt>[,<timeout>]
  # these create option 43 cruft, which is required in proxy mode
  # TFTP IP is required on all dhcp-boot lines (unless dnsmasq itself acts as tftp server?)
  pxe-service=tag:!ipxe-ok,X86PC,PXE,undionly.kpxe,10.1.1.2
  pxe-service=tag:!ipxe-ok,IA32_EFI,PXE,snponlyx32.efi,10.1.1.2
  pxe-service=tag:!ipxe-ok,BC_EFI,PXE,snponly.efi,10.1.1.2
  pxe-service=tag:!ipxe-ok,X86-64_EFI,PXE,snponly.efi,10.1.1.2

  # later match overrides previous, keep ipxe script last
  # server address must be non zero, but can be anything as long as iPXE script is not fetched over TFTP
  dhcp-boot=tag:ipxe-ok,http://boot.ipxe.org/demo/boot.php,,0.0.0.1

  # To use internal TFTP server enabled these, recommended is otherwise atftp
  #enable-tftp
  #tftp-root=/tftproot/

此配置基于这个 gist