Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.
By default, a Celesto sandbox uses a private NAT network that provides convenient host access and can enforce outbound network controls. Bridged networking is an opt-in alternative on Linux hosts that connects the sandbox directly to an existing host bridge (for example br10). The sandbox appears on that network as a separate computer, with its own MAC address and a guest-managed IP (DHCP or static configured inside the guest).Use bridged networking when you need the sandbox to be a first-class peer on your network — for example, to receive inbound connections from other devices on a LAN, get a real DHCP lease from your router, or run services that expect to bind to a routable address.
Bridge mode is only supported on Linux hosts, and it deliberately turns off several Celesto conveniences that assume a private NAT network. In bridge mode:
No Celesto SSH channel from the host.celesto sandbox ssh and expose_local() do not apply — connect to guest services over the bridged network instead.
No workspace or host mounts. File sharing that depends on the private network is disabled.
No host port forwards.celesto sandbox port expose is unavailable.
No Celesto-managed outbound controls.internet_settings is not supported with bridge mode.
No host-visible IP.Celesto.get_ip() raises a clear error because the guest — not the host — owns the address. Read the address from inside the guest (for example over the fast shell channel).
You can still use celesto sandbox shell in bridge mode; it uses a direct host-to-guest control channel that does not depend on the network.
A bridged sandbox sends traffic directly onto the selected network with its own MAC address. Misconfiguration or untrusted guest software can affect other devices through duplicate IPs, address spoofing, or unwanted services. Only use bridge mode on a network where that access is acceptable.
The host must already have a Linux bridge that is:
Connected to the target network (usually by enslaving a physical interface).
Not carrying any host addresses itself, including automatic IPv6 addresses on the bridge or its member interfaces.
Celesto never creates, reconfigures, or deletes the bridge — it only inspects it. Create the bridge yourself with your distribution’s networking tools (for example systemd-networkd, netplan, NetworkManager, or nmcli).A minimal example using ip:
# Create a bridge and attach an interfacesudo ip link add name br10 type bridgesudo ip link set eth1 master br10sudo ip link set br10 upsudo ip link set eth1 up# Remove any host-side addresses from the bridge and its memberssudo ip addr flush dev br10sudo ip addr flush dev eth1
Persist the bridge with your usual networking tooling so it survives reboots.
Run the preflight command to confirm the bridge is ready:
celesto bridge check br10
Successful output looks like:
Bridge 'br10' is ready for bridged networking.
If the bridge is missing, has an assigned address, or otherwise cannot be used, the command exits non-zero and prints the reason. Add --json to get a structured envelope that includes the ok flag and a machine-readable reason.
Both --network bridge and --bridge <name> are required together. Passing --bridge without --network bridge, or --network bridge without a name, is rejected up front.The default Celesto Alpine image already understands the boot-time celesto.network=guest marker and asks the network for an address using DHCP. To use a static address instead, add an executable /etc/celesto/network.sh script inside the guest disk. Celesto passes the guest NIC name (typically eth0) as the first argument to that script on every boot.You can open a shell before the guest has an address, because celesto sandbox shell uses the direct control channel:
celesto sandbox shell demo# inside the guestip -4 addr show eth0
celesto sandbox info reports the network mode and, when relevant, the attached bridge. In bridge mode the IP address row shows Managed inside guest, because the guest — not Celesto — owns the address:
Network Mode bridgeBridge br10IP Address Managed inside guestSSH Port -
celesto sandbox list includes the mode and bridge in its JSON output so you can filter or script over them.
Bridge mode is also available when you build a VMConfig directly. Set the network attachment to bridge and provide the bridge name:
from celesto import Celestofrom celesto.types import NetworkAttachmentConfig, VMConfigconfig = VMConfig( guest_managed_networking=True, network_attachment=NetworkAttachmentConfig(mode="bridge", bridge="br10"), # ... other fields)with Celesto(config=config) as vm: # get_ip() is unavailable in bridge mode; read the address from the guest. result = vm.run("ip -4 -o addr show eth0") print(result.stdout)
Custom images must understand the celesto.network=guest boot marker and configure the primary NIC themselves. Celesto refuses to start older images that don’t handle guest-managed networking rather than booting them with a broken configuration.
Snapshots capture the bridge attachment. On restore, Celesto re-runs the same bridge preflight and reattaches the sandbox to the persisted bridge. If the bridge no longer exists or has changed in a way that breaks the checks, the restore fails with an explicit error instead of silently downgrading to NAT.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Celesto AI","description":"Celesto runs your GitHub Actions builds and tests on managed runners. Choose a runner size, keep your existing workflows, and measure runtime and cost.","colors":{"primary":"#52525B","light":"#A1A1AA","dark":"#3F3F46"},"logo":{"light":"https://mintcdn.com/celestoai/LDwunL2Vt9Pis6a0/assets/celesto-logo.png?fit=max\u0026auto=format\u0026n=LDwunL2Vt9Pis6a0\u0026q=85\u0026s=c21396f68593db7d457f2e5477c89d78","dark":"https://mintcdn.com/celestoai/LDwunL2Vt9Pis6a0/assets/celesto-logo.png?fit=max\u0026auto=format\u0026n=LDwunL2Vt9Pis6a0\u0026q=85\u0026s=c21396f68593db7d457f2e5477c89d78"},"favicon":{"light":"https://mintcdn.com/celestoai/_KrDBqGM7BwH7_KV/favicon.png?fit=max\u0026auto=format\u0026n=_KrDBqGM7BwH7_KV\u0026q=85\u0026s=42350ed1a82c10328a4f80146196f5a1","dark":"https://mintcdn.com/celestoai/KTxjKnCVde3ZGE8i/images/logo-v2.png?fit=max\u0026auto=format\u0026n=KTxjKnCVde3ZGE8i\u0026q=85\u0026s=fcd49a67a17fdab035b626a455d198e9"},"appearance":{"default":"dark"},"background":{"decoration":"grid"},"navbar":{"links":[{"icon":"envelope","href":"mailto:aniket@celesto.ai","label":"Support"},{"icon":"discord","href":"https://discord.gg/KNb5UkrAmm","label":"Discord"},{"icon":"github","href":"https://github.com/celestoai","label":"GitHub"}],"primary":{"type":"button","label":"Home","href":"https://celesto.ai"}},"footer":{"socials":{"x":"https://x.com/celestoai","github":"https://github.com/celestoai","linkedin":"https://linkedin.com/company/celestoai","discord":"https://discord.gg/KNb5UkrAmm"}},"seo":{"indexing":"navigable"},"fonts":{"heading":{"family":"Geist"}},"styling":{"latex":false},"integrations":{"gtm":{"tagId":"G-EYNQCSCZVJ"},"posthog":{"apiKey":"phc_vjIHlkZ5iOYWdZx0LXiifLKGl53QehS8LjudWiuSRND","sessionRecording":true}},"banner":{"content":"Celesto is open source. ⭐ [Star Celesto on GitHub →](https://github.com/CelestoAI/celesto)","dismissible":true},"errors":{"404":{"redirect":false,"title":"I can't be found","description":"\u003cimg src='/assets/undraw_page-eaten_b2rt.svg'/>"}},"contextual":{"options":["copy","chatgpt","mcp","claude"],"display":"header"},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"navigation":{"global":{},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"celestoai","hasAudioNarration":false,"actualSubdomain":"celestoai","customDomains":["celesto.ai"],"gitSource":{"type":"github","owner":"celestoai","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aeccc2bbba8b341cc926c67","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Open source","count":68},{"language":"default","tag":"Reference","count":43},{"language":"default","tag":"CLI commands","count":22},{"language":"default","tag":"Python API","count":20},{"language":"default","tag":"Sandboxes","count":19},{"language":"default","tag":"GitHub Actions","count":12},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"Run sandboxes","count":6},{"language":"default","tag":"How it works","count":5},{"language":"default","tag":"Connect AI agents","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"aniket@celesto.ai","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"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}],"starterQuestions":[{"_id":"69d0086691d46a89b83ff9ce","deploymentId":"68fc2513e3244c7a0ec6558e","questionText":"Docker vs microVM","status":"active","generatedBy":"manual","createdAt":"2026-04-03T18:35:18.161Z","updatedAt":"2026-04-03T18:35:18.161Z","__v":0},{"_id":"69d0085191d46a89b83ff98d","deploymentId":"68fc2513e3244c7a0ec6558e","questionText":"What is computer-use agent?","status":"active","generatedBy":"manual","createdAt":"2026-04-03T18:34:57.827Z","updatedAt":"2026-04-03T18:34:57.827Z","__v":0},{"_id":"69d0084791d46a89b83ff96f","deploymentId":"68fc2513e3244c7a0ec6558e","questionText":"Does it support on-prem deployment?","status":"active","generatedBy":"manual","createdAt":"2026-04-03T18:34:47.327Z","updatedAt":"2026-04-03T18:34:47.327Z","__v":0}],"googleFontsInlined":true},"customCss":[{"filePath":"language-selector.css","content":"#sdk-language-selector-slot{display:inline-flex;align-items:center;gap:0.625rem;max-width:100%;margin:1.125rem 0 1.5rem;padding:0;border:0;background:transparent}#sdk-language-selector-slot:empty{display:none!important;margin:0!important}html[data-current-path^=\"/celesto-sdk/\"] #table-of-contents #multi-view-dropdown{display:none!important}#sdk-language-selector-slot #multi-view-dropdown{width:12.5rem!important;max-width:min(12.5rem, calc(100vw - 3rem))!important;margin-bottom:0!important;z-index:30}#multi-view-dropdown[data-sdk-language-selector-extra=\"true\"]{display:none!important}#sdk-language-selector-slot .multi-view-dropdown-trigger{min-height:2.5rem;padding:0.375rem 0.625rem!important;border-color:rgba(255, 255, 255, 0.09)!important;background:rgba(255, 255, 255, 0.035)}html.dark #sdk-language-selector-slot .multi-view-dropdown-trigger{border-color:rgba(255, 255, 255, 0.1)!important;background:rgba(255, 255, 255, 0.04)}html:not(.dark) #sdk-language-selector-slot .multi-view-dropdown-trigger{border-color:rgba(17, 24, 39, 0.1)!important;background:rgba(255, 255, 255, 0.86)}#sdk-language-selector-slot .multi-view-dropdown-trigger span{font-size:0.9375rem!important;line-height:1.25rem!important}@media (max-width: 768px){#sdk-language-selector-slot{display:flex;width:100%;margin-top:1.25rem}#sdk-language-selector-slot #multi-view-dropdown{width:100%!important;max-width:100%!important}}"}],"page":{"pagePath":"celesto/features/bridged-networking","slug":"/celesto/features/bridged-networking","pageMetadata":{"title":"Bridged networking","description":"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.","href":"/celesto/features/bridged-networking"},"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: \"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\"\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`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`By default, a Celesto sandbox uses a private `,_jsx(_components.a,{href:`/celesto/concepts/networking`,children:`NAT network`}),` that provides convenient host access and can enforce `,_jsx(_components.a,{href:`/celesto/features/network-controls`,children:`outbound network controls`}),`. Bridged networking is an opt-in alternative on `,_jsx(_components.strong,{children:`Linux hosts`}),` that connects the sandbox directly to an existing host bridge (for example `,_jsx(_components.code,{children:`br10`}),`). The sandbox appears on that network as a separate computer, with its own MAC address and a guest-managed IP (DHCP or static configured inside the guest).`]}),`\n`,_jsx(_components.p,{children:`Use bridged networking when you need the sandbox to be a first-class peer on your network — for example, to receive inbound connections from other devices on a LAN, get a real DHCP lease from your router, or run services that expect to bind to a routable address.`}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-use-it`,children:`When to use it`}),`\n`,_jsx(_components.p,{children:`Choose bridged networking when:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Other machines on your network need to reach the sandbox at a stable, routable address.`}),`\n`,_jsx(_components.li,{children:`You want the sandbox to obtain an address, DNS, and gateway from your existing DHCP server.`}),`\n`,_jsx(_components.li,{children:`You are integrating the sandbox into a lab or home-network topology that already has a Linux bridge.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Stick with the default NAT mode when you need:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Celesto’s fast host-to-guest SSH channel and automatic port forwarding.`}),`\n`,_jsx(_components.li,{children:`Shared workspace mounts from the host.`}),`\n`,_jsx(_components.li,{children:`Celesto-managed outbound access controls.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`requirements-and-tradeoffs`,children:`Requirements and tradeoffs`}),`\n`,_jsx(_components.p,{children:`Bridge mode is only supported on Linux hosts, and it deliberately turns off several Celesto conveniences that assume a private NAT network. In bridge mode:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No Celesto SSH channel from the host.`}),` `,_jsx(_components.code,{children:`celesto sandbox ssh`}),` and `,_jsx(_components.code,{children:`expose_local()`}),` do not apply — connect to guest services over the bridged network instead.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No workspace or host mounts.`}),` File sharing that depends on the private network is disabled.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No host port forwards.`}),` `,_jsx(_components.code,{children:`celesto sandbox port expose`}),` is unavailable.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No Celesto-managed outbound controls.`}),` `,_jsx(_components.code,{children:`internet_settings`}),` is not supported with bridge mode.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No host-visible IP.`}),` `,_jsx(_components.code,{children:`Celesto.get_ip()`}),` raises a clear error because the guest — not the host — owns the address. Read the address from inside the guest (for example over the fast shell channel).`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You can still use `,_jsx(_components.code,{children:`celesto sandbox shell`}),` in bridge mode; it uses a direct host-to-guest control channel that does not depend on the network.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`A bridged sandbox sends traffic directly onto the selected network with its own MAC address. Misconfiguration or untrusted guest software can affect other devices through duplicate IPs, address spoofing, or unwanted services. Only use bridge mode on a network where that access is acceptable.`})}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`The host must already have a Linux bridge that is:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Connected to the target network (usually by enslaving a physical interface).`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Not`}),` carrying any host addresses itself, including automatic IPv6 addresses on the bridge or its member interfaces.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Celesto never creates, reconfigures, or deletes the bridge — it only inspects it. Create the bridge yourself with your distribution’s networking tools (for example `,_jsx(_components.code,{children:`systemd-networkd`}),`, `,_jsx(_components.code,{children:`netplan`}),`, `,_jsx(_components.code,{children:`NetworkManager`}),`, or `,_jsx(_components.code,{children:`nmcli`}),`).`]}),`\n`,_jsxs(_components.p,{children:[`A minimal example using `,_jsx(_components.code,{children:`ip`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,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:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Create a bridge and attach an interface`})}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` link`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` type`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bridge`})]}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` link`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` eth1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` master`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`})]}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` link`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`})]}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` link`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` eth1`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` up`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Remove any host-side addresses from the bridge and its members`})}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` addr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` flush`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` dev`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`})]}),`\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:` ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` addr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` flush`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` dev`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` eth1`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Persist the bridge with your usual networking tooling so it survives reboots.`}),`\n`,_jsx(Heading,{level:`2`,id:`check-a-bridge-before-you-use-it`,children:`Check a bridge before you use it`}),`\n`,_jsx(_components.p,{children:`Run the preflight command to confirm the bridge is ready:`}),`\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:`celesto`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bridge`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` check`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Successful output looks like:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,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:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Bridge 'br10' is ready for bridged networking.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`If the bridge is missing, has an assigned address, or otherwise cannot be used, the command exits non-zero and prints the reason. Add `,_jsx(_components.code,{children:`--json`}),` to get a structured envelope that includes the `,_jsx(_components.code,{children:`ok`}),` flag and a machine-readable `,_jsx(_components.code,{children:`reason`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`create-a-bridged-sandbox`,children:`Create a bridged sandbox`}),`\n`,_jsx(_components.p,{children:`Once the preflight passes, create a sandbox in bridge mode:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,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:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`celesto`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sandbox`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` create`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` demo`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --os`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` alpine`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --network`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bridge`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --bridge`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` br10`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Both `,_jsx(_components.code,{children:`--network bridge`}),` and `,_jsx(_components.code,{children:`--bridge \u003cname>`}),` are required together. Passing `,_jsx(_components.code,{children:`--bridge`}),` without `,_jsx(_components.code,{children:`--network bridge`}),`, or `,_jsx(_components.code,{children:`--network bridge`}),` without a name, is rejected up front.`]}),`\n`,_jsxs(_components.p,{children:[`The default Celesto Alpine image already understands the boot-time `,_jsx(_components.code,{children:`celesto.network=guest`}),` marker and asks the network for an address using DHCP. To use a static address instead, add an executable `,_jsx(_components.code,{children:`/etc/celesto/network.sh`}),` script inside the guest disk. Celesto passes the guest NIC name (typically `,_jsx(_components.code,{children:`eth0`}),`) as the first argument to that script on every boot.`]}),`\n`,_jsxs(_components.p,{children:[`You can open a shell before the guest has an address, because `,_jsx(_components.code,{children:`celesto sandbox shell`}),` uses the direct control channel:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`celesto`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sandbox`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` shell`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` demo`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# inside the guest`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -4`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` addr`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` eth0`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`inspecting-a-bridged-sandbox`,children:`Inspecting a bridged sandbox`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`celesto sandbox info`}),` reports the network mode and, when relevant, the attached bridge. In bridge mode the IP address row shows `,_jsx(_components.code,{children:`Managed inside guest`}),`, because the guest — not Celesto — owns the address:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,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:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Network Mode bridge`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Bridge br10`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`IP Address Managed inside guest`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`SSH Port -`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`celesto sandbox list`}),` includes the mode and bridge in its JSON output so you can filter or script over them.`]}),`\n`,_jsx(Heading,{level:`2`,id:`using-bridge-mode-from-the-sdk`,children:`Using bridge mode from the SDK`}),`\n`,_jsxs(_components.p,{children:[`Bridge mode is also available when you build a `,_jsx(_components.code,{children:`VMConfig`}),` directly. Set the network attachment to `,_jsx(_components.code,{children:`bridge`}),` and provide the bridge name:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`python`,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:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` celesto `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Celesto`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` celesto.types `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` NetworkAttachmentConfig, VMConfig`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`config `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` VMConfig(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` guest_managed_networking`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` network_attachment`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`NetworkAttachmentConfig(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"bridge\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`bridge`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"br10\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ... other fields`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Celesto(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`config`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`config) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` vm:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # get_ip() is unavailable in bridge mode; read the address from the guest.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` result `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` vm.run(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ip -4 -o addr show eth0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(result.stdout)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Custom images must understand the `,_jsx(_components.code,{children:`celesto.network=guest`}),` boot marker and configure the primary NIC themselves. Celesto refuses to start older images that don’t handle guest-managed networking rather than booting them with a broken configuration.`]}),`\n`,_jsx(Heading,{level:`2`,id:`snapshots`,children:`Snapshots`}),`\n`,_jsx(_components.p,{children:`Snapshots capture the bridge attachment. On restore, Celesto re-runs the same bridge preflight and reattaches the sandbox to the persisted bridge. If the bridge no longer exists or has changed in a way that breaks the checks, the restore fails with an explicit error instead of silently downgrading to NAT.`}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related pages`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/celesto/features/network-controls`,children:`Network controls`}),` — open, off, and restricted access for private-network sandboxes`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/celesto/features/port-forwarding`,children:`Port forwarding`}),` — expose NAT-mode guest ports on the host`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/celesto/concepts/networking`,children:`Network configuration`}),` — how Celesto’s default private network works`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/celesto/cli/create`,children:_jsx(_components.code,{children:`celesto sandbox create`})}),` — full CLI reference`]}),`\n`]})]})}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":"Bridged networking","description":"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.","href":"/celesto/features/bridged-networking"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"When to use it","slug":"when-to-use-it","depth":2,"children":[]},{"title":"Requirements and tradeoffs","slug":"requirements-and-tradeoffs","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Check a bridge before you use it","slug":"check-a-bridge-before-you-use-it","depth":2,"children":[]},{"title":"Create a bridged sandbox","slug":"create-a-bridged-sandbox","depth":2,"children":[]},{"title":"Inspecting a bridged sandbox","slug":"inspecting-a-bridged-sandbox","depth":2,"children":[]},{"title":"Using bridge mode from the SDK","slug":"using-bridge-mode-from-the-sdk","depth":2,"children":[]},{"title":"Snapshots","slug":"snapshots","depth":2,"children":[]},{"title":"Related pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/celestoai/57979735173e757b/language-selector.js"],"subdomain":"celestoai","siteName":"Celesto AI","title":"Bridged networking - Celesto AI","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T21:41:27.625Z","gitLastModified":"2026-10-27T21:41:15.000Z","originalFileLocation":"celesto/features/bridged-networking.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=\"dark\"}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=\"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Celesto AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_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=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bridged networking - Celesto AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Celesto AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://celesto.ai/docs/celesto/features/bridged-networking\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://celestoai.mintlify.site/docs/_mintlify/api/og/v2?division=Files+and+networking\u0026amp;title=Bridged+networking\u0026amp;description=Connect+a+Linux+sandbox+directly+to+a+host+bridge+so+it+joins+your+network+like+a+regular+machine%2C+with+its+own+MAC+address+and+an+IP+from+your+router.\u0026amp;theme=87418bc7e82b6efc9a409775\u0026amp;signature=33fa3088b6131eca47e83da49d86f3fee6b2e4cbc54b07eef3db8e7b4b5e72a8\">\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=\"Bridged networking - Celesto AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://celestoai.mintlify.site/docs/_mintlify/api/og/v2?division=Files+and+networking\u0026amp;title=Bridged+networking\u0026amp;description=Connect+a+Linux+sandbox+directly+to+a+host+bridge+so+it+joins+your+network+like+a+regular+machine%2C+with+its+own+MAC+address+and+an+IP+from+your+router.\u0026amp;theme=87418bc7e82b6efc9a409775\u0026amp;signature=33fa3088b6131eca47e83da49d86f3fee6b2e4cbc54b07eef3db8e7b4b5e72a8\">\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=\"/docs/mintlify-assets/_mintlify/favicons/celestoai/-bRUTa7-LfylkDcu/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Celesto AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#52525B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://celesto.ai/docs/celesto/features/bridged-networking\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/celesto/features/bridged-networking.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://celesto.ai/#organization\",\"name\":\"Celesto AI\",\"url\":\"https://celesto.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/celestoai/LDwunL2Vt9Pis6a0/assets/celesto-logo.png?fit=max\u0026auto=format\u0026n=LDwunL2Vt9Pis6a0\u0026q=85\u0026s=c21396f68593db7d457f2e5477c89d78\"}},{\"@type\":\"WebSite\",\"@id\":\"https://celesto.ai/docs#website\",\"name\":\"Celesto AI\",\"url\":\"https://celesto.ai/docs\",\"publisher\":{\"@id\":\"https://celesto.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://celesto.ai/docs/celesto/features/bridged-networking#webpage\",\"url\":\"https://celesto.ai/docs/celesto/features/bridged-networking\",\"name\":\"Bridged networking\",\"description\":\"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\",\"dateModified\":\"2026-10-27T21:41:15.000Z\",\"isPartOf\":{\"@id\":\"https://celesto.ai/docs#website\"},\"breadcrumb\":{\"@id\":\"https://celesto.ai/docs/celesto/features/bridged-networking#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://celesto.ai/docs/celesto/features/bridged-networking#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Files and networking\",\"item\":\"https://celesto.ai/docs/celesto/features/host-mounts\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bridged networking\",\"item\":\"https://celesto.ai/docs/celesto/features/bridged-networking\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://celesto.ai/docs/celesto/features/bridged-networking#article\",\"headline\":\"Bridged networking\",\"name\":\"Bridged networking\",\"description\":\"Connect a Linux sandbox directly to a host bridge so it joins your network like a regular machine, with its own MAC address and an IP from your router.\",\"url\":\"https://celesto.ai/docs/celesto/features/bridged-networking\",\"mainEntityOfPage\":{\"@id\":\"https://celesto.ai/docs/celesto/features/bridged-networking#webpage\"},\"dateModified\":\"2026-10-27T21:41:15.000Z\",\"publisher\":{\"@id\":\"https://celesto.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://celesto.ai/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Celesto AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Celesto AI","nav":{"global":{},"tabs":[{"tab":"GitHub Actions","pages":[{"title":"GitHub Actions","href":"/ci"}]},{"tab":"Sandboxes","pages":[{"title":"Sandboxes","href":"/cloud/overview"}]},{"tab":"Open source","groups":[{"group":"Get started","pages":[{"title":"Celesto: secure microVM sandboxes for AI agents","sidebarTitle":"Introduction","href":"/celesto/introduction"},{"title":"Install Celesto on Linux or macOS","sidebarTitle":"Installation","href":"/celesto/installation"},{"title":"Basic usage","sidebarTitle":"Run your first commands","href":"/celesto/guides/basic-usage"}]},{"group":"Run sandboxes","pages":[{"title":"VM lifecycle management","sidebarTitle":"Start, pause, and stop","href":"/celesto/guides/vm-lifecycle"},{"title":"Environment variables in Celesto sandboxes","sidebarTitle":"Environment variables","href":"/celesto/guides/environment-variables"},{"title":"Run Docker in a Celesto sandbox","sidebarTitle":"Docker","href":"/celesto/features/docker"},{"title":"Browser sandboxes","sidebarTitle":"Browser sandboxes","href":"/celesto/features/browser-sandboxes"},{"title":"Disposable macOS environments","sidebarTitle":"macOS sandboxes","href":"/celesto/guides/macos-sandboxes"},{"title":"Windows sandboxes in Celesto","sidebarTitle":"Windows sandboxes","href":"/celesto/guides/windows-guests"}]},{"group":"Images and snapshots","pages":[{"title":"Published images","href":"/celesto/concepts/published-images"},{"title":"Custom Sandbox Images with Docker","sidebarTitle":"Custom images","href":"/celesto/guides/custom-images"},{"title":"Snapshot and restore Celesto sandboxes","sidebarTitle":"Save and restore snapshots","href":"/celesto/features/snapshots"}]},{"group":"Files and networking","pages":[{"title":"Mount Folders and Data","sidebarTitle":"Share local folders","href":"/celesto/features/host-mounts"},{"title":"Port Forwarding","sidebarTitle":"Forward ports","href":"/celesto/features/port-forwarding"},{"title":"Control sandbox internet access","sidebarTitle":"Internet access rules","description":"Set an egress allowlist for local Linux sandboxes, allow specific destination addresses, or turn outbound internet access off.","href":"/celesto/features/network-controls"},{"title":"Bridged networking","href":"/celesto/features/bridged-networking"}]},{"group":"Connect AI agents","pages":[{"title":"Framework Integration","sidebarTitle":"Agent frameworks","description":"Wire Celesto into PydanticAI, the OpenAI Agents SDK, LangChain, and other agent frameworks so AI agents can run untrusted code inside isolated microVMs.","href":"/celesto/guides/ai-agent-integration"},{"title":"Run callbacks and safety hooks","sidebarTitle":"Command hooks","href":"/celesto/features/callbacks"}]},{"group":"How it works","pages":[{"title":"Celesto architecture overview","sidebarTitle":"Architecture","href":"/celesto/concepts/overview"},{"title":"Security model","href":"/celesto/concepts/security"},{"title":"Firecracker, QEMU, and libkrun backends","sidebarTitle":"Runtime backends","href":"/celesto/concepts/backends"},{"title":"Network configuration","href":"/celesto/concepts/networking"},{"title":"Control channel","href":"/celesto/concepts/control-channel"}]},{"group":"Performance and troubleshooting","pages":[{"title":"Performance benchmarks","href":"/celesto/advanced/performance"},{"title":"Troubleshooting guide","sidebarTitle":"Troubleshooting","href":"/celesto/advanced/troubleshooting"}]},{"group":"Reference","pages":[{"title":"Use the Celesto HTTP API and TypeScript SDK","sidebarTitle":"HTTP API and TypeScript SDK","href":"/celesto/guides/http-api-typescript-sdk"},{"group":"Python API","expanded":false,"pages":[{"title":"Celesto Python class reference","href":"/celesto/api/celesto"},{"title":"Browser and desktop sandboxes","href":"/celesto/api/browsersession"},{"title":"Browser and desktop options","href":"/celesto/api/browsersessionconfig"},{"title":"Display sandbox object","href":"/celesto/api/browsersessioninfo"},{"title":"Callback hooks Python reference","href":"/celesto/api/callbacks"},{"title":"CommandResult","href":"/celesto/api/commandresult"},{"title":"Exceptions","href":"/celesto/api/exceptions"},{"title":"HostManager","href":"/celesto/api/hostmanager"},{"title":"BootImage and boot helpers","href":"/celesto/api/bootimage"},{"title":"DockerRootfsBuilder","href":"/celesto/api/dockerrootfsbuilder"},{"title":"ImageBuilder","href":"/celesto/api/imagebuilder"},{"title":"ImageManager","href":"/celesto/api/imagemanager"},{"title":"ImageSource","href":"/celesto/api/imagesource"},{"title":"InternetSettings","href":"/celesto/api/internetsettings"},{"title":"Kernel helpers","href":"/celesto/api/kernelhelpers"},{"title":"NetworkConfig","href":"/celesto/api/networkconfig"},{"title":"SnapshotInfo","href":"/celesto/api/snapshotinfo"},{"title":"SSHClient","href":"/celesto/api/sshclient"},{"title":"VMConfig Python reference","href":"/celesto/api/vmconfig"},{"title":"VMInfo","href":"/celesto/api/vminfo"}]},{"group":"CLI commands","expanded":false,"pages":[{"title":"CLI overview","href":"/celesto/cli/overview"},{"title":"celesto sandbox create","href":"/celesto/cli/create"},{"title":"celesto sandbox list","href":"/celesto/cli/list"},{"title":"celesto sandbox shell","href":"/celesto/cli/shell"},{"title":"celesto sandbox ssh","href":"/celesto/cli/ssh"},{"title":"celesto sandbox exec","href":"/celesto/cli/exec"},{"title":"celesto sandbox logs","href":"/celesto/cli/logs"},{"title":"celesto sandbox stop","href":"/celesto/cli/stop"},{"title":"celesto sandbox delete","href":"/celesto/cli/cleanup"},{"title":"celesto sandbox prune","href":"/celesto/cli/sandbox-prune"},{"title":"celesto sandbox file","href":"/celesto/cli/file"},{"title":"celesto sandbox env","href":"/celesto/cli/env"},{"title":"celesto sandbox port","href":"/celesto/cli/port"},{"title":"celesto sandbox snapshot","href":"/celesto/cli/snapshot"},{"title":"celesto server","href":"/celesto/cli/server"},{"title":"celesto ui","href":"/celesto/cli/ui"},{"title":"celesto doctor","href":"/celesto/cli/doctor"},{"title":"celesto update","href":"/celesto/cli/update"},{"title":"celesto image","href":"/celesto/cli/image"},{"title":"celesto prune","href":"/celesto/cli/prune"},{"title":"celesto completion","href":"/celesto/cli/completion"},{"title":"celesto windows","href":"/celesto/cli/windows"}]}]}]}]},"basePath":"","title":"Bridged networking - Celesto AI","buildId":"dpl_BSPUBxEoKhhK7HzXVDPxdPvWx4xc","deploymentId":"dpl_BSPUBxEoKhhK7HzXVDPxdPvWx4xc","dynamics":["10e4515597"],"chunks":["BannerMarkdown--rjwFo9x.js","dist-qmLwQyWY.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-apD-Q0Oo.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}