Linux. AF_XDP is a Linux kernel facility, so there’s no macOS or Windows build.
Kernel
5.4 or newer. 5.9+ is strongly preferred, for the reason below.
Privileges
root, or the cap_net_raw, cap_bpf and cap_sys_resource capabilities.
NIC
Anything AF_XDP works on. Fastest on drivers with native XDP support: Intel ixgbe and i40e, Mellanox mlx5, AWS ena.
Locked memory
A few hundred MB, depending on queue count. The default limit is usually too low. See Locked memory.
Why 5.9+ matters. On 5.9 and later the XDP program is held by a BPF link that the kernel tears down when the process dies, so a crashed or kill -9’d Wireblast cleans up after itself. On older kernels a dead process can leave the program attached, and you clear it by hand with sudo ip link set dev eth1 xdp off.
Swap amd64 for arm64 on ARM hardware. The releases/latest/download/… URLs always resolve to the newest release, so they’re safe to script against. Each release also publishes a checksums.txt for verification.The arm64 build runs on modern 64-bit Raspberry Pis (Pi 4, Pi 5, Zero 2 W and newer, on a 64-bit OS). Their onboard NIC has no native XDP, though, so Wireblast falls back to generic mode there: it works, just not at line rate.
Needs Go 1.25 or newer.
go install github.com/atoonk/wireblast/cmd/wireblast@latest
That drops the binary in $(go env GOPATH)/bin. Since Wireblast needs root, copy it somewhere on root’s PATH or invoke the full path. sudo wireblast will not find a binary that only exists in your user’s GOPATH.
The simple answer is sudo wireblast. AF_XDP has to create raw sockets and load an XDP program, and both need privileges.If you’d rather not run it as root, grant the capabilities once:
After that it runs as your normal user. Re-apply it whenever you replace the binary, since capabilities are attached to the file rather than the name.Skip this and Wireblast tells you before it touches anything:
error insufficient privileges AF_XDP needs to create raw sockets and load an XDP program, which requires root or CAP_NET_RAW.
This is the one that catches people on the first run.AF_XDP packet buffers live in a UMEM, a region of memory the kernel keeps locked into RAM, one per queue. A 12-queue run needs roughly 120 MB of locked memory, and the common default limit is 8 MB.Wireblast raises its own soft limit to the hard limit automatically before it checks. If that still isn’t enough, it stops and hands you the exact command:
error locked-memory limit too low this run needs about 118 MiB of locked memory (12 queues x 4096 frames x 2048 bytes), but the limit is 8 MiB. Raise it for this shell: ulimit -l 121634 or permanently in /etc/security/limits.conf: * hard memlock unlimited * soft memlock unlimited Alternatively use fewer queues (--queues 3).
All three fixes work. ulimit -l is fine for a one-off, limits.conf if you’ll be doing this regularly, and --queues if you’d rather not change host settings at all.
Wireblast never reconfigures your host. It will tell you that ip link set eth1 mtu 3000 would help. It will not run it. That applies to MTU, queue counts, routes, addresses and every other system-wide setting: the recommendations are yours to accept or ignore.
You don’t need a NIC, a link, or root for that one. To actually put packets on a wire, head to the quickstart, which also shows you how to build a throwaway veth pair if you don’t have a spare interface to point it at.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Wireblast","description":"Wireblast is a fast, easy-to-use AF_XDP traffic generator for Linux. The iPerf of packet generators.","colors":{"primary":"#1F6FEB","light":"#58A6FF","dark":"#1158C7"},"logo":{"light":"https://mintcdn.com/wireblast/9ffcJQm-uOjAU3Wq/logo/light.svg?fit=max\u0026auto=format\u0026n=9ffcJQm-uOjAU3Wq\u0026q=85\u0026s=6677037cb407a0c9bdc4ebd72e4d39ad","dark":"https://mintcdn.com/wireblast/9ffcJQm-uOjAU3Wq/logo/dark.svg?fit=max\u0026auto=format\u0026n=9ffcJQm-uOjAU3Wq\u0026q=85\u0026s=f021350df1d0fd459de6cd9c5c14ade9"},"favicon":"https://mintcdn.com/wireblast/9ffcJQm-uOjAU3Wq/favicon.svg?fit=max\u0026auto=format\u0026n=9ffcJQm-uOjAU3Wq\u0026q=85\u0026s=0acf10b75df30f8456d9edc1dcddf71f","navbar":{"links":[{"href":"https://github.com/atoonk/wireblast","label":"GitHub"}],"primary":{"type":"button","label":"Download","href":"https://github.com/atoonk/wireblast/releases"}},"footer":{"socials":{"x":"https://x.com/atoonk","github":"https://github.com/atoonk/wireblast"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"wireblast","hasAudioNarration":false,"actualSubdomain":"wireblast","customDomains":[],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-teraplane-ba8cc216","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6aea215ebe297e7f1a4d9676:success","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Guides","count":6},{"language":"default","tag":"Concepts","count":5},{"language":"default","tag":"Getting started","count":5},{"language":"default","tag":"Traffic patterns","count":3},{"language":"default","tag":"Reference","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"install","slug":"/install","pageMetadata":{"title":"Install","description":"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.","icon":"download","href":"/install"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tab,Table,Tabs,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Wireblast is one static binary with no runtime dependencies. No libpcap, no DPDK, no kernel modules, no cgo.`}),`\n`,_jsx(Heading,{level:`2`,id:`requirements`,children:`Requirements`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`OS`})}),_jsx(_components.td,{children:`Linux. AF_XDP is a Linux kernel facility, so there’s no macOS or Windows build.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Kernel`})}),_jsx(_components.td,{children:`5.4 or newer. 5.9+ is strongly preferred, for the reason below.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Privileges`})}),_jsxs(_components.td,{children:[`root, or the `,_jsx(_components.code,{children:`cap_net_raw`}),`, `,_jsx(_components.code,{children:`cap_bpf`}),` and `,_jsx(_components.code,{children:`cap_sys_resource`}),` capabilities.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`NIC`})}),_jsxs(_components.td,{children:[`Anything AF_XDP works on. Fastest on drivers with native XDP support: Intel `,_jsx(_components.code,{children:`ixgbe`}),` and `,_jsx(_components.code,{children:`i40e`}),`, Mellanox `,_jsx(_components.code,{children:`mlx5`}),`, AWS `,_jsx(_components.code,{children:`ena`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Locked memory`})}),_jsxs(_components.td,{children:[`A few hundred MB, depending on queue count. The default limit is usually too low. See `,_jsx(_components.a,{href:`#locked-memory`,children:`Locked memory`}),`.`]})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Why 5.9+ matters.`}),` On 5.9 and later the XDP program is held by a BPF link that the kernel tears down when the process dies, so a crashed or `,_jsx(_components.code,{children:`kill -9`}),`’d Wireblast cleans up after itself. On older kernels a dead process can leave the program attached, and you clear it by hand with `,_jsx(_components.code,{children:`sudo ip link set dev eth1 xdp off`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`get-the-binary`,children:`Get the binary`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Release binary`,id:`release-binary`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Platform`}),_jsx(_components.th,{children:`Architecture`}),_jsx(_components.th,{children:`Download`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Linux`}),_jsx(_components.td,{children:`x86-64 / amd64`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`wireblast_linux_amd64.tar.gz`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Linux`}),_jsx(_components.td,{children:`arm64 / aarch64`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`wireblast_linux_arm64.tar.gz`})})]})]})]}),_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -sSL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://github.com/atoonk/wireblast/releases/latest/download/wireblast_linux_amd64.tar.gz`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` tar`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` xz`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0755`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` wireblast`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /usr/local/bin/`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`wireblast`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --version`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Swap `,_jsx(_components.code,{children:`amd64`}),` for `,_jsx(_components.code,{children:`arm64`}),` on ARM hardware. The `,_jsx(_components.code,{children:`releases/latest/download/…`}),` URLs always resolve to the newest release, so they’re safe to script against. Each release also publishes a `,_jsx(_components.code,{children:`checksums.txt`}),` for verification.`]}),_jsx(_components.p,{children:`The arm64 build runs on modern 64-bit Raspberry Pis (Pi 4, Pi 5, Zero 2 W and newer, on a 64-bit OS). Their onboard NIC has no native XDP, though, so Wireblast falls back to generic mode there: it works, just not at line rate.`})]}),_jsxs(Tab,{title:`go install`,id:`go-install`,children:[_jsx(_components.p,{children:`Needs Go 1.25 or newer.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`go`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` github.com/atoonk/wireblast/cmd/wireblast@latest`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`That drops the binary in `,_jsx(_components.code,{children:`$(go env GOPATH)/bin`}),`. Since Wireblast needs root, copy it somewhere on root’s `,_jsx(_components.code,{children:`PATH`}),` or invoke the full path. `,_jsx(_components.code,{children:`sudo wireblast`}),` will not find a binary that only exists in your user’s `,_jsx(_components.code,{children:`GOPATH`}),`.`]})]}),_jsxs(Tab,{title:`From source`,id:`from-source`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`git`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` clone`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://github.com/atoonk/wireblast`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` wireblast`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`CGO_ENABLED`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`0`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` go`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` build`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` wireblast`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./cmd/wireblast`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0755`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` wireblast`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /usr/local/bin/`})]}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`CGO_ENABLED=0`}),` is the point: you get a fully static binary you can copy to any Linux box of the same architecture.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`privileges`,children:`Privileges`}),`\n`,_jsxs(_components.p,{children:[`The simple answer is `,_jsx(_components.code,{children:`sudo wireblast`}),`. AF_XDP has to create raw sockets and load an XDP program, and both need privileges.`]}),`\n`,_jsx(_components.p,{children:`If you’d rather not run it as root, grant the capabilities once:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` setcap`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` cap_net_raw,cap_bpf,cap_sys_resource+ep`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` $(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`command`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -v`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` wireblast`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`After that it runs as your normal user. Re-apply it whenever you replace the binary, since capabilities are attached to the file rather than the name.`}),`\n`,_jsx(_components.p,{children:`Skip this and Wireblast tells you before it touches anything:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`error insufficient privileges`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` AF_XDP needs to create raw sockets and load an XDP program, which`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` requires root or CAP_NET_RAW.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`locked-memory`,children:`Locked memory`}),`\n`,_jsx(_components.p,{children:`This is the one that catches people on the first run.`}),`\n`,_jsx(_components.p,{children:`AF_XDP packet buffers live in a UMEM, a region of memory the kernel keeps locked into RAM, one per queue. A 12-queue run needs roughly 120 MB of locked memory, and the common default limit is 8 MB.`}),`\n`,_jsxs(_components.p,{children:[`Wireblast raises `,_jsx(_components.strong,{children:`its own`}),` soft limit to the hard limit automatically before it checks. If that still isn’t enough, it stops and hands you the exact command:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`error locked-memory limit too low`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` this run needs about 118 MiB of locked memory (12 queues x 4096 frames`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` x 2048 bytes), but the limit is 8 MiB.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Raise it for this shell:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ulimit -l 121634`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` or permanently in /etc/security/limits.conf:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` * hard memlock unlimited`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` * soft memlock unlimited`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Alternatively use fewer queues (--queues 3).`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`All three fixes work. `,_jsx(_components.code,{children:`ulimit -l`}),` is fine for a one-off, `,_jsx(_components.code,{children:`limits.conf`}),` if you’ll be doing this regularly, and `,_jsx(_components.code,{children:`--queues`}),` if you’d rather not change host settings at all.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Wireblast never reconfigures your host. It will tell you that `,_jsx(_components.code,{children:`ip link set eth1 mtu 3000`}),` would help. It will not run it. That applies to MTU, queue counts, routes, addresses and every other system-wide setting: the recommendations are yours to accept or ignore.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`check-it-works`,children:`Check it works`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`wireblast`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --version`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`You don’t need a NIC, a link, or root for that one. To actually put packets on a wire, head to the `,_jsx(_components.a,{href:`/quickstart`,children:`quickstart`}),`, which also shows you how to build a throwaway `,_jsx(_components.code,{children:`veth`}),` pair if you don’t have a spare interface to point it at.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Install","description":"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.","icon":"download","href":"/install"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Requirements","slug":"requirements","depth":2,"children":[]},{"title":"Get the binary","slug":"get-the-binary","depth":2,"children":[]},{"title":"Privileges","slug":"privileges","depth":2,"children":[]},{"title":"Locked memory","slug":"locked-memory","depth":2,"children":[]},{"title":"Check it works","slug":"check-it-works","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"wireblast","siteName":"Wireblast","title":"Install - Wireblast","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-02T02:22:28.227Z","originalFileLocation":"install.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Wireblast\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Install - Wireblast\">\u003cmeta data-mint-head property=\"og:description\" content=\"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Wireblast\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://wireblast.mintlify.app/install\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://wireblast.mintlify.site/_mintlify/api/og/v2?division=Getting+started\u0026amp;title=Install\u0026amp;description=Get+the+binary%2C+check+the+handful+of+requirements%2C+and+fix+the+one+setting+that+trips+up+first+runs.\u0026amp;theme=a04843baeb3b476d6279de7a\u0026amp;signature=34798f0b1c5537ac906fcf44a232e943ff25a20b2358db68596034ce29f9d494\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Install - Wireblast\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://wireblast.mintlify.site/_mintlify/api/og/v2?division=Getting+started\u0026amp;title=Install\u0026amp;description=Get+the+binary%2C+check+the+handful+of+requirements%2C+and+fix+the+one+setting+that+trips+up+first+runs.\u0026amp;theme=a04843baeb3b476d6279de7a\u0026amp;signature=34798f0b1c5537ac906fcf44a232e943ff25a20b2358db68596034ce29f9d494\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/wireblast/vqsDD_0yzbJvMeDW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Wireblast\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1F6FEB\">\u003clink data-mint-head rel=\"canonical\" href=\"https://wireblast.mintlify.app/install\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/install.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://wireblast.mintlify.app/#organization\",\"name\":\"Wireblast\",\"url\":\"https://wireblast.mintlify.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/wireblast/9ffcJQm-uOjAU3Wq/logo/light.svg?fit=max\u0026auto=format\u0026n=9ffcJQm-uOjAU3Wq\u0026q=85\u0026s=6677037cb407a0c9bdc4ebd72e4d39ad\"}},{\"@type\":\"WebSite\",\"@id\":\"https://wireblast.mintlify.app#website\",\"name\":\"Wireblast\",\"url\":\"https://wireblast.mintlify.app\",\"publisher\":{\"@id\":\"https://wireblast.mintlify.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://wireblast.mintlify.app/install#webpage\",\"url\":\"https://wireblast.mintlify.app/install\",\"name\":\"Install\",\"description\":\"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\",\"dateModified\":\"2026-08-02T02:22:28.227Z\",\"isPartOf\":{\"@id\":\"https://wireblast.mintlify.app#website\"},\"breadcrumb\":{\"@id\":\"https://wireblast.mintlify.app/install#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://wireblast.mintlify.app/install#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting started\",\"item\":\"https://wireblast.mintlify.app/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Install\",\"item\":\"https://wireblast.mintlify.app/install\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://wireblast.mintlify.app/install#article\",\"headline\":\"Install\",\"name\":\"Install\",\"description\":\"Get the binary, check the handful of requirements, and fix the one setting that trips up first runs.\",\"url\":\"https://wireblast.mintlify.app/install\",\"mainEntityOfPage\":{\"@id\":\"https://wireblast.mintlify.app/install#webpage\"},\"dateModified\":\"2026-08-02T02:22:28.227Z\",\"publisher\":{\"@id\":\"https://wireblast.mintlify.app/#organization\"},\"isPartOf\":{\"@id\":\"https://wireblast.mintlify.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Wireblast\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Wireblast","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"Wireblast","description":"A fast, easy-to-use AF_XDP traffic generator for Linux. The iPerf of packet generators.","sidebarTitle":"What is Wireblast","icon":"house","href":"/index"},{"title":"Install","icon":"download","href":"/install"},{"title":"Quickstart","description":"Traffic on the wire in about a minute. No spare NIC needed.","icon":"rocket","href":"/quickstart"},{"title":"Common tasks","icon":"list-check","href":"/recipes"},{"title":"Runnable examples","icon":"play","href":"/examples"}]},{"group":"Concepts","icon":"lightbulb","pages":[{"title":"How it works","icon":"diagram-project","href":"/concepts/how-it-works"},{"title":"Transmit and receive","icon":"shield-check","href":"/concepts/receive"},{"title":"Hardware and drivers","icon":"microchip","href":"/concepts/hardware"},{"title":"Reading the numbers","icon":"chart-line","href":"/concepts/numbers"},{"title":"Performance","icon":"gauge","href":"/concepts/performance"}]},{"group":"Traffic patterns","icon":"shapes","pages":[{"title":"Choosing a pattern","icon":"shapes","href":"/patterns/overview"},{"title":"Flows and addressing","icon":"arrows-split-up-and-left","href":"/patterns/flows"},{"title":"PCAP replay","icon":"file-arrow-up","href":"/patterns/pcap"}]},{"group":"Guides","icon":"book-open","pages":[{"title":"Try it with no spare NIC","icon":"flask","href":"/guides/namespace-lab"},{"title":"Two-box test","icon":"right-left","href":"/guides/two-box"},{"title":"Scripting and automation","icon":"terminal","href":"/guides/scripting"},{"title":"Finding your max rate","icon":"gauge-high","href":"/guides/max-rate"},{"title":"VLAN-tagged traffic","icon":"tag","href":"/guides/vlan"},{"title":"Troubleshooting","icon":"wrench","href":"/guides/troubleshooting"}]},{"group":"Reference","icon":"list","pages":[{"title":"All the flags","icon":"list","href":"/reference/cli"},{"title":"Keys and saved settings","icon":"keyboard","href":"/reference/keys-and-files"},{"title":"FAQ","icon":"circle-question","href":"/reference/faq"}]}]},"basePath":"","title":"Install - Wireblast","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}