All apps · 0 apps
EasyPXE-DNSMasq
Docker app from xXNielsjhuhXx's Repository
Overview
Readme
View on GitHubUnraid PXE Server (custom iPXE stack, proxyDHCP)
A self-hosted PXE boot server for Unraid built from:
- dnsmasq — proxyDHCP responder + TFTP server (coexists with your router's DHCP, no router changes needed)
- nginx — HTTP server for iPXE menus, kernels, and your ISOs
- iPXE — the bootloader and menu system
- netboot.xyz — available as a submenu entry for downloading/booting any OS online
Works with both UEFI and Legacy BIOS clients (auto-detected per client).
How it works
- A client PXE-boots and gets its IP from your existing router as usual.
- dnsmasq (in proxyDHCP mode) chimes in with only the PXE boot info: "fetch
undionly.kpxe(BIOS) oripxe.efi(UEFI) from my TFTP." - The client runs iPXE, which re-requests DHCP. dnsmasq detects iPXE and now answers: "chain
http://UNRAID_IP:8080/boot.ipxe." - iPXE downloads the menu over HTTP and shows it. Everything big (kernels, ISOs) travels over fast HTTP instead of TFTP.
Setup on Unraid
1. Copy this folder to Unraid
Place the whole pxe-server/ folder at:
/mnt/user/appdata/pxe-server/
2. Configure .env
Edit .env and set:
| Variable | Meaning | Example |
|---|---|---|
UNRAID_IP |
Static LAN IP of your Unraid server | 192.168.1.10 |
SUBNET |
Your LAN network address | 192.168.1.0 |
HTTP_PORT |
HTTP port (80 is used by Unraid's UI) | 8080 |
3. Download the iPXE bootloaders (one time)
From the Unraid terminal:
cd /mnt/user/appdata/pxe-server
sh setup.sh
This fetches undionly.kpxe, ipxe.efi, and snponly.efi into tftp/.
4. Point it at your ISOs
The compose file bind-mounts /mnt/user/isos (read-only) into the web server
as http://UNRAID_IP:8080/isos/. If your ISO share has a different path, edit
the volume line in docker-compose.yml.
Then add menu entries for your ISOs in http/menus/local.ipxe (templates and
examples are included in that file). Changes take effect immediately — no
container restart needed, menus are fetched fresh on every boot.
5. Start the stack
Either install the Compose Manager plugin (Apps tab) and add this folder as a stack, or from the Unraid terminal:
cd /mnt/user/appdata/pxe-server
docker compose up -d
6. Boot a client
Enable network/PXE boot in the client's firmware and boot. You should see the menu within a few seconds.
Verifying it works
From another machine on the LAN:
# TFTP serving the bootloader? (UDP 69)
tftp 192.168.1.10 -c get undionly.kpxe
# HTTP serving the menu?
curl http://192.168.1.10:8080/boot.ipxe
# Browse your ISOs
# open http://192.168.1.10:8080/isos/ in a browser
Watch dnsmasq's view of PXE requests:
docker logs -f pxe-dnsmasq
Best first test: an Unraid VM (or any VM on the LAN with bridged networking) set to network boot — try once with OVMF (UEFI) and once with SeaBIOS.
Adding your own ISO menu entries
Open http/menus/local.ipxe. Two patterns are provided:
sanboot(memdisk-free, simplest) — works for many modern hybrid/live ISOs (GParted, Clonezilla, many rescue tools):sanboot ${http-root}/isos/gparted-live.isoExtract kernel/initrd (most reliable for installers) — extract
vmlinuz+initrdfrom the ISO intohttp/boot/<name>/, then boot them and pass the ISO URL as a kernel argument. Examples for Ubuntu and Debian are included inlocal.ipxe.
For Windows installers you need wimboot — easiest path is to just use
the netboot.xyz menu entry, which handles that for you.
Known caveats
- Secure Boot: iPXE binaries are unsigned, so disable Secure Boot on clients. (The alternative — a signed shim chain — is significantly more work and not included here.)
- Not every ISO sanboots. UEFI in particular is picky about
sanboot. If an ISO hangs or errors, use the extract-kernel/initrd pattern instead. - Host networking is required. dnsmasq must see LAN DHCP broadcasts
(UDP 67/68) and serve TFTP (UDP 69) + proxyDHCP (UDP 4011). Both containers
run with
network_mode: host. If your LAN uses VLANs, the PXE clients must be on the same L2 segment/VLAN as the Unraid server (DHCP broadcasts don't cross VLANs without a relay). - Two PXE servers on one LAN will conflict — make sure nothing else (e.g. your router, another netboot container) is answering PXE.
- Port conflicts on the host: nothing else on Unraid may bind UDP 69
or TCP
HTTP_PORT.
Project layout
pxe-server/
docker-compose.yml # dnsmasq + nginx, host networking
.env # UNRAID_IP, SUBNET, HTTP_PORT
setup.sh # one-time: fetch iPXE binaries into tftp/
dnsmasq/
dnsmasq.conf.template # proxyDHCP + TFTP config (envsubst'd at start)
nginx/
default.conf.template # HTTP server config (envsubst'd at start)
tftp/ # iPXE bootloaders (filled by setup.sh)
http/ # nginx web root
boot.ipxe # main menu
menus/local.ipxe # your local ISO entries
boot/ # extracted kernels/initrds go here
Install EasyPXE-DNSMasq on Unraid in a few clicks.
Find EasyPXE-DNSMasq in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
EasyPXE-Nginx must also be installed and running. The Unraid server must use a static LAN IP. No other PXE, TFTP, or proxyDHCP service may use UDP ports 69 or 4011 on the same host.
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
4km3/dnsmasq:2.90-r3Runtime arguments
- Network
host- Shell
sh- Privileged
- false
- Extra Params
--cap-add=NET_ADMIN --entrypoint=/bin/sh
Template configuration
Static LAN IP address of the Unraid server.
- Target
- UNRAID_IP
- Default
- 192.168.1.10
- Value
- 192.168.1.10
LAN network address used by proxyDHCP. Enter the network address, not a DHCP range.
- Target
- SUBNET
- Default
- 192.168.1.0
- Value
- 192.168.1.0
HTTP port used by the EasyPXE Nginx container.
- Target
- HTTP_PORT
- Default
- 8080
- Value
- 8080
Path to the EasyPXE dnsmasq configuration template.
- Target
- /etc/dnsmasq.conf.template
- Default
- /mnt/user/appdata/easypxe/dnsmasq/dnsmasq.conf.template
- Value
- /mnt/user/appdata/easypxe/dnsmasq/dnsmasq.conf.template
Directory containing the Legacy BIOS and UEFI iPXE bootloader files.
- Target
- /tftpboot
- Default
- /mnt/user/appdata/easypxe/tftp
- Value
- /mnt/user/appdata/easypxe/tftp