[{"data":1,"prerenderedAt":641},["ShallowReactive",2],{"blog-\u002Fposts\u002Fproxy-dhcp-booting":3,"blog-sidebar-posts":590},{"id":4,"title":5,"body":6,"category":574,"date":575,"description":576,"draft":577,"extension":578,"icon":579,"meta":580,"navigation":391,"order":103,"path":581,"section":574,"seo":582,"sidebarTitle":583,"stem":584,"tags":585,"updated":583,"__hash__":589},"blog\u002Fposts\u002Fproxy-dhcp-booting.md","Proxy DHCP PXE Booting",{"type":7,"value":8,"toc":569},"minimark",[9,13,24,27,32,35,38,42,52,56,565],[10,11,12],"p",{},"Most router appliances do not allow the user to properly configure multi-arch pxe booting without modifying the base operating system. These changes would be overwritten on the next firmware update, requiring you to redeploy the changes.",[10,14,15,16,23],{},"You can get around this by running ",[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Fgithub.com\u002Fposeidon\u002Fdnsmasq",[21],"nofollow","poseidon\u002Fdnsmasq"," in a container for running DHCP, proxy DHCP, DNS and\u002For TFTP.",[10,25,26],{},"This can be easily deployed on a raspberry pi or other machine stuffed in the back of your lab. This also can be combined with matchbox to facilitate bootstraping nodes with Talos.",[28,29,31],"h2",{"id":30},"how-this-works","How This Works",[10,33,34],{},"When your machine wants to connect to the internet, it creates a DHCP Request asking for a address on your local network. Your router usually responds to this request and hands out an address.",[10,36,37],{},"Dnsmasq in proxy mode listens for this request, and sends out a second answer to the client with the options required to allow PXE Booting. Dnsmasq simply says: \"Hey! You can boot from this server over here. Here's the details if you need them.\"\nIt doesn't interfer with any of your router's dhcp options, and your machine will always prefer the dhcp response from your router over the proxy.",[28,39,41],{"id":40},"requirements","Requirements",[43,44,45,49],"ul",{},[46,47,48],"li",{},"A device seperate from your cluster.",[46,50,51],{},"Device must share an address from the network you are running the proxy on.",[28,53,55],{"id":54},"create-the-container","Create The Container",[57,58,59,369],"code-group",{},[60,61,67],"pre",{"className":62,"code":63,"filename":64,"language":65,"meta":66,"style":66},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","  docker run -d \\\n    --cap-add NET_BIND_SERVICE \\\n    --cap-add NET_ADMIN \\\n    --cap-add NET_RAW \\\n    --name dhcp-relay \\\n    --network host \\\n    --restart always \\\n    quay.io\u002Fposeidon\u002Fdnsmasq:v0.5.0-31-gdc1adc8@sha256:6a839fde323fb405f6be84003a6b9019d9151caa983bfdcbc8cc1b51b1f8627d \\\n    --log-dhcp --log-queries --no-daemon \\\n    --port=0 \\\n    --dhcp-range=\u003CYour Network Gateway>,proxy,255.255.255.0 \\\n    --enable-tftp \\\n    --tftp-root=\u002Fvar\u002Flib\u002Ftftpboot \\\n    --pxe-service=net:#ipxe,x86PC,,undionly.kpxe \\\n    --pxe-service=net:#ipxe,X86-64_EFI,,ipxe.efi \\\n    --dhcp-match=set:bios,option:client-arch,0 \\\n    --dhcp-boot=tag:bios,undionly.kpxe \\\n    --dhcp-match=set:efi32,option:client-arch,6 \\\n    --dhcp-boot=tag:efi32,ipxe.efi \\\n    --dhcp-match=set:efibc,option:client-arch,7 \\\n    --dhcp-boot=tag:efibc,ipxe.efi \\\n    --dhcp-match=set:efi64,option:client-arch,9 \\\n    --dhcp-boot=tag:efi64,ipxe.efi \\\n    --dhcp-match=set:arm64,option:client-arch,11 \\\n    --dhcp-boot=tag:arm64,ipxe-arm64.efi \\\n    --dhcp-userclass=set:ipxe,iPXE \\\n    --dhcp-boot=tag:ipxe,http:\u002F\u002F\u003CTFTP Server>\u002Fboot.ipxe\n","\u002Fbin\u002Fbash","bash","",[68,69,70,90,101,111,121,132,143,154,162,176,184,214,222,230,239,254,267,275,283,291,299,307,315,323,331,339,347],"code",{"__ignoreMap":66},[71,72,75,79,83,86],"span",{"class":73,"line":74},"line",1,[71,76,78],{"class":77},"sBMFI","  docker",[71,80,82],{"class":81},"sfazB"," run",[71,84,85],{"class":81}," -d",[71,87,89],{"class":88},"sTEyZ"," \\\n",[71,91,93,96,99],{"class":73,"line":92},2,[71,94,95],{"class":81},"    --cap-add",[71,97,98],{"class":81}," NET_BIND_SERVICE",[71,100,89],{"class":88},[71,102,104,106,109],{"class":73,"line":103},3,[71,105,95],{"class":81},[71,107,108],{"class":81}," NET_ADMIN",[71,110,89],{"class":88},[71,112,114,116,119],{"class":73,"line":113},4,[71,115,95],{"class":81},[71,117,118],{"class":81}," NET_RAW",[71,120,89],{"class":88},[71,122,124,127,130],{"class":73,"line":123},5,[71,125,126],{"class":81},"    --name",[71,128,129],{"class":81}," dhcp-relay",[71,131,89],{"class":88},[71,133,135,138,141],{"class":73,"line":134},6,[71,136,137],{"class":81},"    --network",[71,139,140],{"class":81}," host",[71,142,89],{"class":88},[71,144,146,149,152],{"class":73,"line":145},7,[71,147,148],{"class":81},"    --restart",[71,150,151],{"class":81}," always",[71,153,89],{"class":88},[71,155,157,160],{"class":73,"line":156},8,[71,158,159],{"class":81},"    quay.io\u002Fposeidon\u002Fdnsmasq:v0.5.0-31-gdc1adc8@sha256:6a839fde323fb405f6be84003a6b9019d9151caa983bfdcbc8cc1b51b1f8627d",[71,161,89],{"class":88},[71,163,165,168,171,174],{"class":73,"line":164},9,[71,166,167],{"class":81},"    --log-dhcp",[71,169,170],{"class":81}," --log-queries",[71,172,173],{"class":81}," --no-daemon",[71,175,89],{"class":88},[71,177,179,182],{"class":73,"line":178},10,[71,180,181],{"class":81},"    --port=0",[71,183,89],{"class":88},[71,185,187,190,194,197,200,203,206,209,212],{"class":73,"line":186},11,[71,188,189],{"class":81},"    --dhcp-range=",[71,191,193],{"class":192},"sMK4o","\u003C",[71,195,196],{"class":81},"Your",[71,198,199],{"class":81}," Network",[71,201,202],{"class":81}," Gatewa",[71,204,205],{"class":88},"y",[71,207,208],{"class":192},">",[71,210,211],{"class":81},",proxy,255.255.255.0",[71,213,89],{"class":88},[71,215,217,220],{"class":73,"line":216},12,[71,218,219],{"class":81},"    --enable-tftp",[71,221,89],{"class":88},[71,223,225,228],{"class":73,"line":224},13,[71,226,227],{"class":81},"    --tftp-root=\u002Fvar\u002Flib\u002Ftftpboot",[71,229,89],{"class":88},[71,231,233,236],{"class":73,"line":232},14,[71,234,235],{"class":81},"    --pxe-service=net:",[71,237,238],{"class":88},"#ipxe,x86PC,,undionly.kpxe \\\n",[71,240,242,245,248,251],{"class":73,"line":241},15,[71,243,244],{"class":88},"    --pxe-service",[71,246,247],{"class":192},"=",[71,249,250],{"class":81},"net:",[71,252,253],{"class":88},"#ipxe,X86-64_EFI,,ipxe.efi \\\n",[71,255,257,260,262,265],{"class":73,"line":256},16,[71,258,259],{"class":88},"    --dhcp-match",[71,261,247],{"class":192},[71,263,264],{"class":81},"set:bios,option:client-arch,0",[71,266,89],{"class":77},[71,268,270,273],{"class":73,"line":269},17,[71,271,272],{"class":81},"    --dhcp-boot=tag:bios,undionly.kpxe",[71,274,89],{"class":88},[71,276,278,281],{"class":73,"line":277},18,[71,279,280],{"class":81},"    --dhcp-match=set:efi32,option:client-arch,6",[71,282,89],{"class":88},[71,284,286,289],{"class":73,"line":285},19,[71,287,288],{"class":81},"    --dhcp-boot=tag:efi32,ipxe.efi",[71,290,89],{"class":88},[71,292,294,297],{"class":73,"line":293},20,[71,295,296],{"class":81},"    --dhcp-match=set:efibc,option:client-arch,7",[71,298,89],{"class":88},[71,300,302,305],{"class":73,"line":301},21,[71,303,304],{"class":81},"    --dhcp-boot=tag:efibc,ipxe.efi",[71,306,89],{"class":88},[71,308,310,313],{"class":73,"line":309},22,[71,311,312],{"class":81},"    --dhcp-match=set:efi64,option:client-arch,9",[71,314,89],{"class":88},[71,316,318,321],{"class":73,"line":317},23,[71,319,320],{"class":81},"    --dhcp-boot=tag:efi64,ipxe.efi",[71,322,89],{"class":88},[71,324,326,329],{"class":73,"line":325},24,[71,327,328],{"class":81},"    --dhcp-match=set:arm64,option:client-arch,11",[71,330,89],{"class":88},[71,332,334,337],{"class":73,"line":333},25,[71,335,336],{"class":81},"    --dhcp-boot=tag:arm64,ipxe-arm64.efi",[71,338,89],{"class":88},[71,340,342,345],{"class":73,"line":341},26,[71,343,344],{"class":81},"    --dhcp-userclass=set:ipxe,iPXE",[71,346,89],{"class":88},[71,348,350,353,355,358,361,364,366],{"class":73,"line":349},27,[71,351,352],{"class":81},"    --dhcp-boot=tag:ipxe,http:\u002F\u002F",[71,354,193],{"class":192},[71,356,357],{"class":81},"TFTP",[71,359,360],{"class":81}," Serve",[71,362,363],{"class":88},"r",[71,365,208],{"class":192},[71,367,368],{"class":81},"\u002Fboot.ipxe\n",[60,370,375],{"className":371,"code":372,"filename":373,"language":374,"meta":66,"style":66},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=dhcp-relay\n\n[Container]\nAddCapability=NET_BIND_SERVICE\nAddCapability=NET_ADMIN\nAddCapability=NET_RAW\nContainerName=dhcp-relay\nExec=--log-dhcp --log-queries --no-daemon \\\n  --port=0 \\\n  --dhcp-range=\u003CYour Network Gateway>,proxy,255.255.255.0 \\\n  --enable-tftp \\\n  --tftp-root=\u002Fvar\u002Flib\u002Ftftpboot \\\n  --pxe-service=net:#ipxe,x86PC,,undionly.kpxe \\\n  --pxe-service=net:#ipxe,X86-64_EFI,,ipxe.efi \\\n  --dhcp-match=set:bios,option:client-arch,0 \\\n  --dhcp-boot=tag:bios,undionly.kpxe \\\n  --dhcp-match=set:efi32,option:client-arch,6 \\\n  --dhcp-boot=tag:efi32,ipxe.efi \\\n  --dhcp-match=set:efibc,option:client-arch,7 \\\n  --dhcp-boot=tag:efibc,ipxe.efi \\\n  --dhcp-match=set:efi64,option:client-arch,9 \\\n  --dhcp-boot=tag:efi64,ipxe.efi \\\n  --dhcp-match=set:arm64,option:client-arch,11 \\\n  --dhcp-boot=tag:arm64,ipxe-arm64.efi \\\n  --dhcp-userclass=set:ipxe,iPXE \\\n  --dhcp-boot=tag:ipxe,http:\u002F\u002F\u003CTFTP Server>\u002Fboot.ipxe\nImage=quay.io\u002Fposeidon\u002Fdnsmasq:v0.5.0-31-gdc1adc8@sha256:6a839fde323fb405f6be84003a6b9019d9151caa983bfdcbc8cc1b51b1f8627d\nNetwork=host\n\n[Service]\nRestart=always\nTimeoutStartSec=900\n\n[Install]\nWantedBy=multi-user.target default.target\n","podman.container","ini",[68,376,377,382,387,393,398,403,408,413,418,423,428,433,438,443,448,453,458,463,468,473,478,483,488,493,498,503,508,513,519,525,530,536,542,548,553,559],{"__ignoreMap":66},[71,378,379],{"class":73,"line":74},[71,380,381],{},"[Unit]\n",[71,383,384],{"class":73,"line":92},[71,385,386],{},"Description=dhcp-relay\n",[71,388,389],{"class":73,"line":103},[71,390,392],{"emptyLinePlaceholder":391},true,"\n",[71,394,395],{"class":73,"line":113},[71,396,397],{},"[Container]\n",[71,399,400],{"class":73,"line":123},[71,401,402],{},"AddCapability=NET_BIND_SERVICE\n",[71,404,405],{"class":73,"line":134},[71,406,407],{},"AddCapability=NET_ADMIN\n",[71,409,410],{"class":73,"line":145},[71,411,412],{},"AddCapability=NET_RAW\n",[71,414,415],{"class":73,"line":156},[71,416,417],{},"ContainerName=dhcp-relay\n",[71,419,420],{"class":73,"line":164},[71,421,422],{},"Exec=--log-dhcp --log-queries --no-daemon \\\n",[71,424,425],{"class":73,"line":178},[71,426,427],{},"  --port=0 \\\n",[71,429,430],{"class":73,"line":186},[71,431,432],{},"  --dhcp-range=\u003CYour Network Gateway>,proxy,255.255.255.0 \\\n",[71,434,435],{"class":73,"line":216},[71,436,437],{},"  --enable-tftp \\\n",[71,439,440],{"class":73,"line":224},[71,441,442],{},"  --tftp-root=\u002Fvar\u002Flib\u002Ftftpboot \\\n",[71,444,445],{"class":73,"line":232},[71,446,447],{},"  --pxe-service=net:#ipxe,x86PC,,undionly.kpxe \\\n",[71,449,450],{"class":73,"line":241},[71,451,452],{},"  --pxe-service=net:#ipxe,X86-64_EFI,,ipxe.efi \\\n",[71,454,455],{"class":73,"line":256},[71,456,457],{},"  --dhcp-match=set:bios,option:client-arch,0 \\\n",[71,459,460],{"class":73,"line":269},[71,461,462],{},"  --dhcp-boot=tag:bios,undionly.kpxe \\\n",[71,464,465],{"class":73,"line":277},[71,466,467],{},"  --dhcp-match=set:efi32,option:client-arch,6 \\\n",[71,469,470],{"class":73,"line":285},[71,471,472],{},"  --dhcp-boot=tag:efi32,ipxe.efi \\\n",[71,474,475],{"class":73,"line":293},[71,476,477],{},"  --dhcp-match=set:efibc,option:client-arch,7 \\\n",[71,479,480],{"class":73,"line":301},[71,481,482],{},"  --dhcp-boot=tag:efibc,ipxe.efi \\\n",[71,484,485],{"class":73,"line":309},[71,486,487],{},"  --dhcp-match=set:efi64,option:client-arch,9 \\\n",[71,489,490],{"class":73,"line":317},[71,491,492],{},"  --dhcp-boot=tag:efi64,ipxe.efi \\\n",[71,494,495],{"class":73,"line":325},[71,496,497],{},"  --dhcp-match=set:arm64,option:client-arch,11 \\\n",[71,499,500],{"class":73,"line":333},[71,501,502],{},"  --dhcp-boot=tag:arm64,ipxe-arm64.efi \\\n",[71,504,505],{"class":73,"line":341},[71,506,507],{},"  --dhcp-userclass=set:ipxe,iPXE \\\n",[71,509,510],{"class":73,"line":349},[71,511,512],{},"  --dhcp-boot=tag:ipxe,http:\u002F\u002F\u003CTFTP Server>\u002Fboot.ipxe\n",[71,514,516],{"class":73,"line":515},28,[71,517,518],{},"Image=quay.io\u002Fposeidon\u002Fdnsmasq:v0.5.0-31-gdc1adc8@sha256:6a839fde323fb405f6be84003a6b9019d9151caa983bfdcbc8cc1b51b1f8627d\n",[71,520,522],{"class":73,"line":521},29,[71,523,524],{},"Network=host\n",[71,526,528],{"class":73,"line":527},30,[71,529,392],{"emptyLinePlaceholder":391},[71,531,533],{"class":73,"line":532},31,[71,534,535],{},"[Service]\n",[71,537,539],{"class":73,"line":538},32,[71,540,541],{},"Restart=always\n",[71,543,545],{"class":73,"line":544},33,[71,546,547],{},"TimeoutStartSec=900\n",[71,549,551],{"class":73,"line":550},34,[71,552,392],{"emptyLinePlaceholder":391},[71,554,556],{"class":73,"line":555},35,[71,557,558],{},"[Install]\n",[71,560,562],{"class":73,"line":561},36,[71,563,564],{},"WantedBy=multi-user.target default.target\n",[566,567,568],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":66,"searchDepth":92,"depth":92,"links":570},[571,572,573],{"id":30,"depth":92,"text":31},{"id":40,"depth":92,"text":41},{"id":54,"depth":92,"text":55},"guides","2024-09-17","Utilize dnsmasq to allow PXE bootstraping your Kubernetes nodes seamlessly.",false,"md","i-ph-arrows-left-right",{},"\u002Fposts\u002Fproxy-dhcp-booting",{"title":5,"description":576},null,"posts\u002Fproxy-dhcp-booting",[586,587,588],"talos","pxe","networking","VnAWkcLOcP5-c8Huq8FgmHuFQQW9Ra5pz-guxl6qaIQ",[591,599,606,611,612,617,622,627,632,636],{"title":592,"sidebarTitle":583,"description":593,"path":594,"icon":595,"order":583,"section":596,"category":597,"date":598},"Hello, world","The site has a blog now. Here's what to expect.","\u002Fposts\u002Fhello-world","i-ph-hand-waving","blog","meta","2026-10-05",{"title":600,"sidebarTitle":583,"description":601,"path":602,"icon":603,"order":92,"section":604,"category":604,"date":605},"Github Repository","Some of the things I do in my github repository that isn't shown","\u002Fposts\u002Fgithub-repository","i-ph-github-logo","homelab","2024-09-21",{"title":607,"sidebarTitle":608,"description":66,"path":609,"icon":610,"order":113,"section":574,"category":574,"date":575},"Allowing Custom Secure Boot Keys on the Minisforum MS-01","MS-01 Secure Boot","\u002Fposts\u002Fms01-secure-boot","i-ph-key",{"title":5,"sidebarTitle":583,"description":576,"path":581,"icon":579,"order":103,"section":574,"category":574,"date":575},{"title":613,"sidebarTitle":583,"description":614,"path":615,"icon":616,"order":92,"section":574,"category":574,"date":575},"Understanding Talos","Talos provides a secure, immutable, minimal and confusing operating system for new users.","\u002Fposts\u002Funderstanding-talos","i-ph-bird",{"title":618,"sidebarTitle":583,"description":66,"path":619,"icon":620,"order":74,"section":604,"category":604,"date":621},"Cloud Dependencies","\u002Fposts\u002Fcloud-dependencies","i-ph-cloud","2024-09-16",{"title":623,"sidebarTitle":583,"description":624,"path":625,"icon":595,"order":74,"section":604,"category":626,"date":621},"Introduction","The nodes and the bees.","\u002Fposts\u002Fintroduction","welcome",{"title":628,"sidebarTitle":583,"description":629,"path":630,"icon":631,"order":113,"section":604,"category":604,"date":621},"Janky Networking","See how my network comes to a crawl once RSTP is disabled...","\u002Fposts\u002Fnetworking","i-ph-network",{"title":633,"sidebarTitle":583,"description":66,"path":634,"icon":635,"order":92,"section":604,"category":626,"date":621},"Special Thanks","\u002Fposts\u002Fspecial-thanks","i-ph-medal",{"title":637,"sidebarTitle":583,"description":66,"path":638,"icon":639,"order":92,"section":604,"category":640,"date":621},"TrueNAS","\u002Fposts\u002Ftruenas","i-simple-icons-truenas","storage",1792630417123]