简化版的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等)上启动这些守护进程需要超级用户权限。
状态
此项目处于测试开发阶段。
支持的功能
访问控制
无(任何远程主机都可以提供服务)
MAC地址ACL
基于UUID的ACL - 需要 PXE协议
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格式)来配置所有其他选项。
某些选项接受布尔值。以下值被识别
真值:on,true,enable,enabled,yes,high,ok,1
假值:off,false,disable,disabled,no,low,ko,0
BOOTP守护进程将每个MAC地址关联到一个分配的IP地址。只要BOOTP守护进程正在运行,同一个IP地址就总是分配给同一个客户端。该地址永远不会返回到池中,即即使租约到期,也不能将其重新分配给另一台机器。
这对于完全基于网络的安装特别有用,其中每个客户端至少请求两次IP地址
当BIOS启动时,它的PXE ROM代码请求一个IP地址,然后请求一个可执行文件来运行,
当可执行文件运行时,它通常会启动一个操作系统(Linux等),然后它会再次请求一个IP地址以继续安装。
[logger]部分
- type
日志记录器的类型,如果有。可以是stderr,file,syslog或none。
- level
日志记录器详细程度的级别。可以是critical,error,info或debug。
- 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://server与location选项匹配;
/path 匹配 [http] 部分的 pxe 或 dhcp 选项。
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 脚本),或者
确保一旦第一个安装阶段完成,就将客户端的网络线缆连接到具有直接访问互联网的局域网。