跳转到主要内容

简化版的BOOTP/DHCP/PXE/TFTP服务器

项目描述

概述

PyBootd 是一个守护进程,支持BOOTP、DHCP、PXE和TFTP协议的一部分,并有一些有用的扩展。

其主要目标之一是提供一个简单的解决方案来启动任何启用PXE的个人计算机,无需其他工具,只需一个标准的Python安装即可。

Pybootd 可用于任何网络启动,或在没有物理支持(如USB密钥或CD/DVD)的情况下安装操作系统。

要求

Python

权限

  • DHCP协议要求守护进程监听端口67。

  • TFTP协议要求守护进程监听端口69。

由于这些端口在服务器范围内(<1024),在Unix主机(Linux、Mac OS X等)上启动这些守护进程需要超级用户权限。

状态

此项目处于测试开发阶段。

支持的功能

  • 访问控制

  1. 无(任何远程主机都可以提供服务)

  2. MAC地址ACL

  3. 基于UUID的ACL - 需要 PXE协议

  4. HTTP转发 - 使用简单的HTTP GET请求将授权委托给远程服务器

  • 本地或远程文件服务

  • 例如,可以从互联网直接启动完整的Debian系统,而无需在pybootd主机机器上存储任何文件

  • 通过UDP消息通知客户端请求

  • 文件名转换

    • 从TFTP客户端请求的文件可以使用过滤器进行过滤并转换为本地文件名

  • 可以使用pybootd仅使用一个服务,即TFTP或DHCP

常见问题解答

常见错误

pybootd.pxed.BootpError: 无法检测网络配置

此错误通常在pool_start地址不是有效网络的一部分时触发。请检查网络配置并修复[bootp]部分,使其与实际网络匹配。

配置

pybootd有几个选项开关。服务器提供两种服务:bootp(支持Dhcp和PXE扩展)和tftp。可以禁用任一服务。

用法:pybootd.py [选项]

PXE启动服务器,一个微型的BOOTP/DHCP/TFTP服务器

选项
-h--help

显示此帮助信息并退出

-c CONFIG--config=CONFIG

配置文件

-p--pxe

仅启用BOOTP/DHCP/PXE服务器

-t--tftp

仅启用TFTP服务器

pybootd守护进程使用配置文件(.ini格式)来配置所有其他选项。

某些选项接受布尔值。以下值被识别

  • 真值:ontrueenableenabledyeshighok1

  • 假值:offfalsedisabledisablednolowko0

BOOTP守护进程将每个MAC地址关联到一个分配的IP地址。只要BOOTP守护进程正在运行,同一个IP地址就总是分配给同一个客户端。该地址永远不会返回到池中,即即使租约到期,也不能将其重新分配给另一台机器。

这对于完全基于网络的安装特别有用,其中每个客户端至少请求两次IP地址

  • 当BIOS启动时,它的PXE ROM代码请求一个IP地址,然后请求一个可执行文件来运行,

  • 当可执行文件运行时,它通常会启动一个操作系统(Linux等),然后它会再次请求一个IP地址以继续安装。

[logger]部分

type

日志记录器的类型,如果有。可以是stderrfilesyslognone

level

日志记录器详细程度的级别。可以是criticalerrorinfodebug

file

如果type设置为file,则输出日志文件的路径。

[bootp]部分

access

访问控制列表的类型。如果没有定义此选项,只要定义的池未耗尽,就会为所有BOOTP请求提供服务。可以是以下选项之一

  • mac:根据请求者的MAC地址过滤掉传入的BOOTP请求。

  • uuid:根据请求的UUID对传入的PXE请求进行过滤。UUID不会从简单的BOOTP或DHCP客户端发出,因此此选项仅对启用PXE的客户端有意义。

  • http:通过简单的HTTP GET请求将传入请求转发到另一个主机。如果存在,将MAC地址和UUID发送到HTTP服务器,服务器回复允许或拒绝请求者的访问。

应该存在一个以所选选项命名的部分来定义访问列表。

地址

指定监听接收传入BOOTP请求的网络的地址。在大多数主机上,唯一的有效地址是0.0.0.0。一些主机接受子网(例如192.168.1.0)。建议不要定义此选项,而使用ACL拒绝客户端。具有多个网络接口的主机可能无法监听单个网络。实现此类功能需要使用原始套接字,这超出了此简单服务器的范围。

allow_simple_dhcp

默认行为是期望PXE请求。为了服务简单的BOOTP或DHCP请求,应启用此选项。此选项接受布尔值。

boot_file

发送回BOOTP客户端的启动文件名,客户端通常在分配网络地址后通过TFTP请求此类文件以启动。

域名

客户端FQDN的域名部分,即网络域名。

dns

DNS服务器的IP地址。服务器只接受单个地址。

lease_time

DHCP租约的有效性(以秒为单位)。请注意,BOOTP守护程序不管理租约到期;因此,此值几乎没有意义。

pool_start

为BOOT客户端分配的第一个地址。

pool_count

可以服务的最大客户端数量。

notify

当定义时,将UDP通知消息发送到定义的IP地址和端口(使用列分隔符:a.b.c.d:p),每当客户端向BOOTP守护程序请求IP地址时。

端口

传入BOOTP请求的替代端口。

timeout

当启用ACL并设置为使用HTTP协议时,从远程认证主机接收响应的超时时间(以秒为单位)。如果未从远程主机收到答案,BOOTP守护程序将忽略传入的BOOTP/DHCP请求。

servername

BOOTP服务器的名称。

[mac]部分

[mac]部分包含一个条目,用于允许或阻止每个MAC地址。每个条目的值是一个布尔值,即

AA-BB-CC-DD-EE-FF = enable

[uuid]部分

[uuid]部分包含一个条目,用于允许或阻止每个UUID。每个条目的值是一个布尔值,即

xxxxxxxx-aaaa-bbbb-cccc-yyyyyyyyyyyy = enable

[http]部分

位置

用于联系远程服务器以获取引导权限的URL前缀。

pxe

当请求者发出PXE信息时,将其附加到URL前缀的路径。具有PXE功能的普通PC在BIOS启动时发出PXE引导请求。因此,远程HTTP服务器可以在从pybootd守护程序接收到此类请求时识别BIOS引导序列。

dhcp

当请求者发出简单DHCP信息时,将其附加到URL前缀的路径。普通OS在启动时发出简单的DHCP请求。因此,远程HTTP服务器可以在从pybootd守护程序接收到此类请求时识别OS引导序列。

pxe/dhcp选项对允许远程HTTP服务器识别引导阶段:是BIOS初始化还是操作系统引导序列。当这种区分没有用时,这两个选项可以指向相同的路径。

[tftp] 部分

地址

监听传入TFTP请求的地址。当启用BOOTP守护进程时,最好省略此选项,因为地址会自动从BOOTP守护进程接收。

blocksize

每个交换数据块的大小。建议保留默认值,因为一些客户端可能不接受其他值。

端口

传入TFTP请求的备用端口。

timeout

等待从TFTP客户端收到确认的超时时间(秒)。如果超时到期,TFTP服务器将重新发送最后一个数据包。它可以表示为一个实数值。

root

TFTP服务的根目录。此路径会自动添加到从TFTP客户端发出的路径名之前。它可以是一个相对路径,绝对路径,或者访问远程文件的URL前缀。

  • 一个相对路径到守护进程目录,当root选项以./开头时;

  • 一个绝对路径,当root选项以/开头时;

  • 一个URL前缀,用于访问远程文件。

[filters] 部分

filters部分允许动态路径名转换。当TFTP客户端请求某些特定文件名时,tftp服务器可以将它们转换为其他文件。

此选项有助于为任何远程客户端提供相同的配置文件(例如,pxelinux.cfg),从而加快引导过程。此选项还允许访问不在当前配置路径中存储的文件(见root选项)。

filters部分的每个选项代表一个匹配文件模式的模式。它接受标准通配符:*?。选项的值定义了转换后的路径。

value部分可以包含变量。变量用大括号括起来,例如{varname}

目前,唯一支持的变量是filename,它会被替换为实际请求的文件名。

value部分还可以包含一个特殊标记,告诉tftp守护进程从文件中读取替换模式。这个特殊标记应该用大括号括起来,例如[file]

示例

以下过滤器

pxelinux.cfg/* = pybootd/etc/pxe.cfg

告诉tftp服务器,所有匹配pxelinux.cfg/*模式的客户端请求应提供pybootd/etc/pxe.cfg文件。这防止客户端在最终回退到简单的pxelinux.cfg文件之前,执行通常耗时回退请求,使用UUID、MAC和后缀地址。

以下过滤器

startup = [dir/{filename}.cfg]

告诉tftp服务器,当请求启动文件时,它应从dir/startup.cfg文件中读取实际的文件名。

基于HTTP的认证

此选项启用将BOOTP授权委派给远程Web服务器。由于pybootd发出标准的HTTP GET请求并期望标准的HTTP回复代码,因此可以使用任何Web服务器来管理授权。

此Web服务器接收以下格式的HTTP GET请求

http://server/path?mac=AA-BB-CC-DD-EE-FF&uuid=xxxxxxxx-aaaa-bbbb-cccc-yyyyyyyyyyyy

其中

  • http://serverlocation选项匹配;

  • /path 匹配 [http] 部分的 pxedhcp 选项。

Web 服务器应该回复以下之一:

  • 200 Ok 结果,如果请求者将被分配 IP 地址,或者

  • 401 Unauthorized 结果,如果它应该被忽略。

pybootd 软件包包含一个演示此功能的简化 HTTP 服务器。它位于 tests/ 子目录中。请参阅此测试守护进程的 config.ini 文件。测试守护进程期望 pxe 路径设置为 /boot,而 dhcp 路径设置为 /linux

示例配置

从官方存档安装 Debian 6.0 机器

由于 tftp 守护进程能够使用 HTTP 协议检索远程文件,因此不需要从 Debian 镜像手动下载任何文件。守护进程将代表正在安装的客户端将所有文件请求转发到镜像。

pybootd.ini 应包含以下内容:

[logger]
; show requests on the standard error output of the daemon
type = stderr
; show informative and error messages only (disable verbose mode)
level = info

[bootp]
; do not force a full PXE boot-up cycle to accept the client
allow_simple_dhcp = enable
; First BOOTP/DHCP address to generate
pool_start = 192.168.1.100
; Google DNS
dns = 8.8.8.8
; boot-up executable the client should request through TFTP
boot_file = pxelinux.0

[tftp]
; URL to install a Debian 6.0 Intel/AMD 64-bit network installation
root = http://http.us.debian.org/debian/dists/squeeze/main/installer-amd64/current/images/netboot

[filters]
; serve a simple configuration file to the linux PXE helper
pxelinux.cfg/* = pybootd/etc/pxe.cfg

pool_start 参数应该是主机网络上的有效地址,而 root URL 可以更改以使用替代镜像和路径。

请注意,为了完成网络安装,客户端应该能够自行访问其远程资源 - 就像网络 ISO 映像安装一样。有两种方法可以实现这一点

  • 要么在 pybootd 主机上启用 IP 转发(请参阅 pybootd 软件包中的 forward.sh 脚本),或者

  • 确保一旦第一个安装阶段完成,就将客户端的网络线缆连接到具有直接访问互联网的局域网。

项目详情


由以下提供支持