Run Ubuntu updates through an approved outbound proxy
Outcome: A restricted Ubuntu host can run an actual APT index update through Data Relay Link without receiving general Internet access. An unrelated Internet hostname is denied.Example topology: Ubuntu host 10.20.30.15 → DRLink Internet Access listener at 10.20.30.5:6080 → approved Ubuntu mirrors only. Replace both addresses and check the actual listening port; 6080 is an illustration, not a guaranteed installation default.
Write down the actual hostnames and schemes. This example assumes HTTP requests to archive.ubuntu.com and security.ubuntu.com (TCP 80). A different mirror, proxy, PPA, CDN or HTTPS source needs its own narrowly scoped FQDN + port rule. Do not authorize an overly broad wildcard to make APT pass.
Figure 1. Internet Access before policy creation: No Policy, Unmatched DENY, FAIL CLOSED. This is NOT an approved-traffic result. CLI output example; sensitive addresses and hostnames are masked.Figure 2. Real Server diagnostics excerpt: verify role, source build and deployment/listener details. CLI output example; sensitive addresses and hostnames are masked.Server shell:
sudo drlink system versionsudo drlink system diagnosticssudo drlink show internet-access
Confirm the Server’s reachable Internet Access proxy endpoint and that the proxy sees 10.20.30.15 as the connecting source. With NAT, use the translated IP/CIDR actually observed by DRLink. External network firewall/security-group rules must allow the protected host to the proxy port; DRLink does not configure those firewalls.
set network-object apt-source type ip value 10.20.30.15set network-object ubuntu-archive type fqdn value archive.ubuntu.comset network-object ubuntu-security type fqdn value security.ubuntu.comset service-object apt-http type tcp port 80show network-objectsshow service-object apt-http
For HTTPS repositories, additionally define set service-object apt-https type tcp port 443 and create corresponding exact-destination rules for that service.
Figure 3. Real command help: test internet-access selects existing Objects/Groups and validates authorization only. CLI output example; sensitive addresses and hostnames are masked.Server REPL:
set internet-access apt-archive mode whitelist source apt-source destination ubuntu-archive service apt-http enabledset internet-access apt-security source apt-source destination ubuntu-security service apt-http enabledset internet-access enabledshow internet-accesstest internet-access source apt-source destination ubuntu-archive service apt-httptest internet-access source apt-source destination ubuntu-security service apt-http
Expected: WHITELIST enforcement active, both configured selectors ALLOW. Unmatched destinations are DENY. Internet Access does not support BLACKLIST, and disabling enforcement is DENY ALL, not ALLOW ALL.
Step 5 — run the real application with temporary proxy configuration
On the protected Ubuntu host, use the actual proxy endpoint; this temporary APT configuration avoids permanently rewriting system proxy files. It updates package indexes only; it does not install upgrades:
Expected: every required repository index is refreshed through the DRLink proxy. An unapproved mirror may fail the update; inspect which hostname it requests, authorize it individually if appropriate and retry. Never count a partial APT update as PASS merely because it returned exit status 0 on a platform with lenient APT error handling.
Expected: explicit proxy policy DENY for this unlisted domain. Review system audit and system diagnostics on the Server to distinguish deny from DNS/network failure. Also confirm approved APT traffic reached DRLink; a successful direct-to-Internet update does not prove this scenario.
The shell trap deletes the temporary APT proxy file at shell exit. Leave the approved policy only if required operationally; changing destination rules affects new connections. If APT fails, verify the requested mirror names and HTTP/HTTPS ports, listener reachability, NAT-visible source and Internet Access policy. Preserve existing long-lived application proxy settings rather than overwriting them for a test. Do not modify external firewall state just to manufacture a qualification result.
If diagnostics reports an invalid Internet Access listener, repair through the same-version Server installer using FRP_EGRESS_LISTEN_ADDR and, only when needed, FRP_EGRESS_LISTEN_PORT. These are installer-owned settings, not set server fields. Keep mode/identity unchanged, validate backup and retest actual APT traversal.Current CLI inventory · MCP compatibility
Last modified on October 28, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"DataRelay Link","description":"Lightweight secure connectivity for isolated and restricted networks with controlled remote access and agentless outbound egress.","colors":{"primary":"#C2410C","light":"#FB923C","dark":"#C75A00"},"logo":{"light":"https://mintcdn.com/data-relay/QdSvVfPZ7NEJSOWl/logo/light.svg?fit=max\u0026auto=format\u0026n=QdSvVfPZ7NEJSOWl\u0026q=85\u0026s=888463e35ab49f73f9b174030b3263d6","dark":"https://mintcdn.com/data-relay/QdSvVfPZ7NEJSOWl/logo/dark.svg?fit=max\u0026auto=format\u0026n=QdSvVfPZ7NEJSOWl\u0026q=85\u0026s=78944f5be2786c960ab6daaaf7ca870b","href":"https://link.datarelay.run"},"favicon":"https://mintcdn.com/data-relay/QdSvVfPZ7NEJSOWl/favicon.svg?fit=max\u0026auto=format\u0026n=QdSvVfPZ7NEJSOWl\u0026q=85\u0026s=d6f1dea7850d21b0c157e4be3317c226","appearance":{"default":"system","strict":false},"navbar":{"links":[{"href":"https://datarelay.run/","label":"DataRelay"},{"href":"https://link.datarelay.run/","label":"Link"},{"href":"https://control.datarelay.run/","label":"Control"},{"href":"https://grant.datarelay.run/","label":"Grant"},{"href":"https://engineering.datarelay.run/","label":"Engineering"},{"href":"https://github.com/datarelay-labs/datarelay-link","type":"github"}]},"search":{"prompt":"Search DataRelay Link docs..."},"seo":{"metatags":{"canonical":"https://link.datarelay.run"},"indexing":"navigable"},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","href":""},{"language":"ko","href":"ko"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"data-relay","hasAudioNarration":false,"actualSubdomain":"data-relay","customDomains":["link.datarelay.run"],"gitSource":{"type":"github","owner":"datarelay-labs","repo":"datarelay-link-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae2b51eefa5e7bcbb87bc8e","collectionId":"a1f69361-66ae-435c-96ea-5f84e3b497ae","liveDeploymentHistoryId":"6ae2b51eefa5e7bcbb87bc8e","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae2b51eefa5e7bcbb87bc8e","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"en","tag":"Practical Use Cases","count":13},{"language":"ko","tag":"실습: 활용 사례","count":13},{"language":"en","tag":"Getting Started","count":11},{"language":"ko","tag":"시작하기","count":10},{"language":"en","tag":"Security \u0026 Reference","count":9},{"language":"ko","tag":"보안 \u0026 참고","count":8},{"language":"en","tag":"Operations","count":7},{"language":"ko","tag":"운영 \u0026 문제 해결","count":7},{"language":"en","tag":"Remote Services \u0026 Access","count":5},{"language":"ko","tag":"Remote Service \u0026 Access","count":5},{"language":"en","tag":"AI Access","count":4},{"language":"ko","tag":"AI Access","count":4},{"language":"en","tag":"Deployment","count":3},{"language":"en","tag":"CLI \u0026 Configuration","count":3},{"language":"en","tag":"Managed Hosts \u0026 Objects","count":3},{"language":"ko","tag":"배포","count":3},{"language":"ko","tag":"CLI \u0026 Configuration","count":3},{"language":"ko","tag":"Managed Host \u0026 Object","count":3},{"language":"en","tag":"Internet Access","count":1},{"language":"ko","tag":"Internet Access","count":1}]},"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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--dr-brand:#C2410C;--dr-brand-hover:#9A3412;--dr-brand-soft:#FFF7ED;--dr-product-accent:#0369A1;--dr-bg:#FFFFFF;--dr-surface:#FFFFFF;--dr-surface-subtle:#FAFAF9;--dr-ink:#1C1917;--dr-muted:#57534E;--dr-border:#E7E5E4;--dr-border-strong:#D6D3D1;--dr-shadow-sm:0 1px 2px rgb(28 25 23 / 0.05);--dr-shadow-md:0 14px 34px rgb(28 25 23 / 0.09);--dr-radius-sm:10px;--dr-radius-md:16px;--dr-radius-lg:24px}.dark{--dr-brand:#FB923C;--dr-brand-hover:#FDBA74;--dr-brand-soft:#2A160D;--dr-product-accent:#38BDF8;--dr-bg:#0C0A09;--dr-surface:#141210;--dr-surface-subtle:#1C1917;--dr-ink:#FAFAF9;--dr-muted:#C7C2BC;--dr-border:#292524;--dr-border-strong:#44403C;--dr-shadow-sm:0 1px 2px rgb(0 0 0 / 0.25);--dr-shadow-md:0 18px 42px rgb(0 0 0 / 0.32)}html{scroll-behavior:smooth}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}#navbar-transition{background:rgb(255 255 255/.9)!important;border-color:rgb(120 113 108/.16)!important;backdrop-filter:blur(16px) saturate(150%);-webkit-backdrop-filter:blur(16px) saturate(150%)}.dark #navbar-transition{background:rgb(12 10 9/.88)!important;border-color:rgb(231 229 228/.1)!important}.nav-logo{height:2rem!important}body,main h1,main h2{color:var(--dr-ink)}main h1{letter-spacing:-.038em;font-weight:760;line-height:1.08}main h2{letter-spacing:-.025em;font-weight:700}main h3{letter-spacing:-.015em}main li,main p{line-height:1.72}main blockquote{border-left:3px solid var(--dr-product-accent)!important;background:var(--dr-surface-subtle);border-radius:0 var(--dr-radius-sm) var(--dr-radius-sm) 0;padding:.8rem 1rem}main pre{border:1px solid var(--dr-border)!important;border-radius:var(--dr-radius-md)!important;box-shadow:var(--dr-shadow-sm)}main table{border-color:var(--dr-border)!important;border-radius:var(--dr-radius-sm)}.dr-hero-kicker{display:inline-flex;align-items:center;gap:.5rem;margin:0 0 1rem;padding:.42rem .7rem;border:1px solid #fed7aa;border-radius:999px;background:#fff7ed;color:#9a3412;font-size:.72rem;font-weight:760;letter-spacing:.12em;text-transform:uppercase}.dark .dr-hero-kicker{border-color:#7c2d12;background:#2a160d;color:#fdba74}.dr-hero-kicker+h1{max-width:950px;margin-top:0!important;font-size:clamp(2.7rem,6vw,4.85rem)!important;line-height:.98!important;letter-spacing:-.055em!important}.dr-hero-actions{display:flex;flex-wrap:wrap;gap:.7rem;margin:1.55rem 0 1.35rem}.dr-button{display:inline-flex;min-height:2.75rem;align-items:center;justify-content:center;border-radius:.72rem;padding:.68rem 1rem;border:1px solid transparent;font-size:.9rem;font-weight:680;line-height:1;text-decoration:none!important;transition:transform 150ms ease,border-color 150ms ease,background-color 150ms ease,box-shadow 150ms ease}.dr-button:hover{transform:translateY(-1px)}.dr-button-primary{background:var(--dr-brand);color:#fff!important;box-shadow:0 6px 18px rgb(194 65 12/.2)}.dr-button-primary:hover{background:var(--dr-brand-hover)}.dark .dr-button-primary{color:#1c1917!important}.dr-button-secondary{background:var(--dr-surface);color:var(--dr-ink)!important;border-color:var(--dr-border-strong);box-shadow:var(--dr-shadow-sm)}.dr-button-secondary:hover{border-color:var(--dr-product-accent)}.dr-family-strip{display:flex;align-items:center;gap:.35rem;margin:0 0 2rem;padding:.4rem;width:fit-content;max-width:100%;overflow-x:auto;border:1px solid var(--dr-border);border-radius:.85rem;background:var(--dr-surface-subtle);scrollbar-width:none}.dr-family-strip::-webkit-scrollbar{display:none}.dr-family-strip .dr-family-current,.dr-family-strip a{display:inline-flex;align-items:center;min-height:2rem;padding:.42rem .68rem;border-radius:.56rem;white-space:nowrap;color:var(--dr-muted)!important;font-size:.78rem;font-weight:650;text-decoration:none!important}.dr-family-strip a:hover{color:var(--dr-ink)!important;background:var(--dr-surface)}.dr-family-strip .dr-family-current{color:#fff!important;background:var(--dr-product-accent);box-shadow:var(--dr-shadow-sm)}.dark .dr-family-strip .dr-family-current{color:#0c0a09!important}.card{border-color:var(--dr-border)!important;border-radius:var(--dr-radius-md)!important;background:var(--dr-surface)!important;box-shadow:var(--dr-shadow-sm);transition:transform 160ms ease,box-shadow 160ms ease,border-color 160ms ease!important}.card:hover{transform:translateY(-2px);border-color:var(--dr-product-accent)!important;box-shadow:var(--dr-shadow-md)}[data-component-part=card-title]{letter-spacing:-.012em}[data-component-part=card-icon]{color:var(--dr-product-accent)!important}.callout{border-radius:var(--dr-radius-md)!important}footer{border-top-color:var(--dr-border)!important}:where(a, button, input, select, textarea):focus-visible{outline:3px solid var(--dr-product-accent)!important;outline-offset:3px!important}@media (max-width:768px){.dr-hero-kicker+h1{font-size:clamp(2.35rem,13vw,3.55rem)!important}.dr-hero-actions{display:grid;grid-template-columns:1fr}.dr-button,.dr-family-strip{width:100%}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.card,.dr-button{transition:none!important}.card:hover,.dr-button:hover{transform:none}}"}],"page":{"pagePath":"use-cases/ubuntu-updates","slug":"/use-cases/ubuntu-updates","pageMetadata":{"title":"Use case: Ubuntu APT in a restricted network","description":"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.","href":"/use-cases/ubuntu-updates"},"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: \"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\"\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`,em:`em`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`run-ubuntu-updates-through-an-approved-outbound-proxy`,children:`Run Ubuntu updates through an approved outbound proxy`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Outcome:`}),` A restricted Ubuntu host can run an actual APT index update through Data Relay Link without receiving general Internet access. An unrelated Internet hostname is denied.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Example topology:`}),` Ubuntu host 10.20.30.15 → DRLink Internet Access listener at 10.20.30.5:6080 → approved Ubuntu mirrors only. Replace both addresses and check the `,_jsx(_components.strong,{children:`actual listening port`}),`; 6080 is an illustration, not a guaranteed installation default.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-1-—-identify-the-real-apt-destinations`,children:`Step 1 — identify the real APT destinations`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Protected Ubuntu host shell:`})}),`\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:`grep`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -R`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -hE`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '^(URIs:|deb |deb-src )'`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /etc/apt/sources.list`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` /etc/apt/sources.list.d/`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` 2>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/dev/null`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Write down the `,_jsx(_components.strong,{children:`actual hostnames and schemes`}),`. This example assumes HTTP requests to `,_jsx(_components.strong,{children:`archive.ubuntu.com`}),` and `,_jsx(_components.strong,{children:`security.ubuntu.com`}),` (TCP 80). A different mirror, proxy, PPA, CDN or HTTPS source needs its own narrowly scoped FQDN + port rule. Do not authorize an overly broad wildcard to make APT pass.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-2-—-confirm-the-listener-and-observed-source`,children:`Step 2 — confirm the listener and observed source`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=8c007cd29ba32924056c7baceaf547e4`,alt:`Real Data Relay Link CLI capture — Internet Access before policy creation: No Policy, Unmatched DENY, FAIL CLOSED. This is NOT an approved-traffic result.`,\"data-og-width\":`2040`,width:`2040`,\"data-og-height\":`836`,height:`836`,\"data-path\":`images/cli-captures/server-egress-default.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=280\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=46b1a066ffc63fd7a04886c889b3c64e 280w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=560\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=f8a8608f2ab2a341e4ac7ece016fba60 560w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=840\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=2a28383694a9840d20053a194c648197 840w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=1100\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=78d53214cfc0f4b559e775aab774d42b 1100w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=1650\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=51f4045170e85f589365f4bf3a2548e5 1650w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-egress-default.png?w=2500\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=d05128fddee6b35a3b4114452104f548 2500w`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`Figure 1. Internet Access before policy creation: No Policy, Unmatched DENY, FAIL CLOSED. This is NOT an approved-traffic result. CLI output example; sensitive addresses and hostnames are masked.`})}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=5553cb6903eb5b7c5aa52dc7b51d1be2`,alt:`Real Data Relay Link CLI capture — Real Server diagnostics excerpt: verify role, source build and deployment/listener details.`,\"data-og-width\":`2040`,width:`2040`,\"data-og-height\":`1480`,height:`1480`,\"data-path\":`images/cli-captures/server-diagnostics.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=280\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=5958b9786add51c095ebebe4c5326d0a 280w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=560\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=50c60573f6c373fbc9ba5d634e67ef30 560w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=840\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=6098ba73102a6d0cfc5a880173e012bf 840w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=1100\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=39bb26f104963c5883568cd31712da3e 1100w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=1650\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=9ae009b0bbd1d13ed51ad04cbad28e77 1650w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/server-diagnostics.png?w=2500\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=6523f5f8e977154d45719c267ccd7ffc 2500w`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`Figure 2. Real Server diagnostics excerpt: verify role, source build and deployment/listener details. CLI output example; sensitive addresses and hostnames are masked.`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Server shell:`})}),`\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:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` drlink`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` version`})]}),`\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:` drlink`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` system`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` diagnostics`})]}),`\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:` drlink`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` internet-access`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Confirm the Server’s reachable Internet Access proxy endpoint and that the proxy sees `,_jsx(_components.strong,{children:`10.20.30.15`}),` as the connecting source. With NAT, use the translated IP/CIDR actually observed by DRLink. External network firewall/security-group rules must allow the protected host to the proxy port; DRLink does not configure those firewalls.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-3-—-define-precise-objects`,children:`Step 3 — define precise objects`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Server REPL:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,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:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set network-object apt-source type ip value 10.20.30.15`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set network-object ubuntu-archive type fqdn value archive.ubuntu.com`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set network-object ubuntu-security type fqdn value security.ubuntu.com`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set service-object apt-http type tcp port 80`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`show network-objects`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`show service-object apt-http`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`For HTTPS repositories, additionally define `,_jsx(_components.code,{children:`set service-object apt-https type tcp port 443`}),` and create corresponding exact-destination rules for that service.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-4-—-enable-only-the-required-internet-access`,children:`Step 4 — enable only the required Internet Access`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=344354498e64d7008adce68c625646a7`,alt:`Real Data Relay Link CLI capture — Real command help: test internet-access selects existing Objects/Groups and validates authorization only.`,\"data-og-width\":`2040`,width:`2040`,\"data-og-height\":`1107`,height:`1107`,\"data-path\":`images/cli-captures/internet-test-syntax.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=280\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=8667025807b6f44cf858c9b5b8e3b4b9 280w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=560\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=3e2819bd58322ef73c03a76185e5231c 560w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=840\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=81bf4b4290e3e47aba3e4368ea49708b 840w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=1100\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=24bafc0d30ca11b5dd078f56cc799832 1100w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=1650\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=93804b6d646bc3578dbc9e46426ec043 1650w, https://mintcdn.com/data-relay/RzAl7zFhuZCRSIKj/images/cli-captures/internet-test-syntax.png?w=2500\u0026fit=max\u0026auto=format\u0026n=RzAl7zFhuZCRSIKj\u0026q=85\u0026s=7c3338eb83d347503e90f8a4f8a738b1 2500w`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`Figure 3. Real command help: test internet-access selects existing Objects/Groups and validates authorization only. CLI output example; sensitive addresses and hostnames are masked.`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Server REPL:`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,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:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set internet-access apt-archive mode whitelist source apt-source destination ubuntu-archive service apt-http enabled`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set internet-access apt-security source apt-source destination ubuntu-security service apt-http enabled`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`set internet-access enabled`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`show internet-access`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`test internet-access source apt-source destination ubuntu-archive service apt-http`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`test internet-access source apt-source destination ubuntu-security service apt-http`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Expected: WHITELIST enforcement active, both configured selectors `,_jsx(_components.strong,{children:`ALLOW`}),`. Unmatched destinations are `,_jsx(_components.strong,{children:`DENY`}),`. Internet Access does not support BLACKLIST, and disabling enforcement is `,_jsx(_components.strong,{children:`DENY ALL`}),`, not ALLOW ALL.`]}),`\n`,_jsx(Heading,{level:`2`,id:`step-5-—-run-the-real-application-with-temporary-proxy-configuration`,children:`Step 5 — run the real application with temporary proxy configuration`}),`\n`,_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`protected Ubuntu host`}),`, use the actual proxy endpoint; this temporary APT configuration avoids permanently rewriting system proxy files. It updates package indexes only; it does not install upgrades:`]}),`\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:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` PROXY_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"http://10.20.30.5:6080\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` APT_PROXY_CONFIG`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"$(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`mktemp`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`)\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` trap`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'rm -f \"$APT_PROXY_CONFIG\"'`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` EXIT`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` printf`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Acquire::http::Proxy \"%s\";\\\\nAcquire::https::Proxy \"%s\";\\\\n'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROXY_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROXY_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` >`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$APT_PROXY_CONFIG`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\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:` env`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` APT_CONFIG=\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$APT_PROXY_CONFIG`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` apt-get`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` APT::Update::Error-Mode=any`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` update`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Expected: every required repository index is refreshed through the DRLink proxy. An unapproved mirror may fail the update; inspect which hostname it requests, authorize it individually if appropriate and retry. Never count a partial APT update as PASS merely because it returned exit status 0 on a platform with lenient APT error handling.`}),`\n`,_jsx(Heading,{level:`2`,id:`step-6-—-prove-the-deny-boundary`,children:`Step 6 — prove the deny boundary`}),`\n`,_jsx(_components.p,{children:`From the same protected host:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,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:`2`,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:` --noproxy`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ''`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --verbose`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --proxy`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"http://10.20.30.5:6080\"`}),_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:` --head`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://example.org/`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Expected: explicit proxy policy `,_jsx(_components.strong,{children:`DENY`}),` for this unlisted domain. Review `,_jsx(_components.code,{children:`system audit`}),` and `,_jsx(_components.code,{children:`system diagnostics`}),` on the Server to distinguish deny from DNS/network failure. Also confirm approved APT traffic reached DRLink; a successful direct-to-Internet update does not prove this scenario.`]}),`\n`,_jsx(Heading,{level:`2`,id:`cleanup-and-troubleshooting`,children:`Cleanup and troubleshooting`}),`\n`,_jsxs(_components.p,{children:[`The shell trap deletes the temporary APT proxy file at shell exit. Leave the approved policy only if required operationally; changing destination rules affects `,_jsx(_components.strong,{children:`new`}),` connections. If APT fails, verify the requested mirror names and HTTP/HTTPS ports, listener reachability, NAT-visible source and Internet Access policy. Preserve existing long-lived application proxy settings rather than overwriting them for a test. Do not modify external firewall state just to manufacture a qualification result.`]}),`\n`,_jsx(Heading,{level:`2`,id:`current-behavior-check-—-2026-10-28`,children:`Current behavior check — 2026-10-28`}),`\n`,_jsx(_components.p,{children:`If diagnostics reports an invalid Internet Access listener, repair through the same-version Server installer using FRP_EGRESS_LISTEN_ADDR and, only when needed, FRP_EGRESS_LISTEN_PORT. These are installer-owned settings, not set server fields. Keep mode/identity unchanged, validate backup and retest actual APT traversal.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/drlink/cli-reference`,children:`Current CLI inventory`}),` · `,_jsx(_components.a,{href:`/reference/mcp-validation`,children:`MCP compatibility`})]})]})}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":"Use case: Ubuntu APT in a restricted network","description":"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.","href":"/use-cases/ubuntu-updates"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Run Ubuntu updates through an approved outbound proxy","slug":"run-ubuntu-updates-through-an-approved-outbound-proxy","depth":1,"children":[]},{"title":"Step 1 — identify the real APT destinations","slug":"step-1-—-identify-the-real-apt-destinations","depth":2,"children":[]},{"title":"Step 2 — confirm the listener and observed source","slug":"step-2-—-confirm-the-listener-and-observed-source","depth":2,"children":[]},{"title":"Step 3 — define precise objects","slug":"step-3-—-define-precise-objects","depth":2,"children":[]},{"title":"Step 4 — enable only the required Internet Access","slug":"step-4-—-enable-only-the-required-internet-access","depth":2,"children":[]},{"title":"Step 5 — run the real application with temporary proxy configuration","slug":"step-5-—-run-the-real-application-with-temporary-proxy-configuration","depth":2,"children":[]},{"title":"Step 6 — prove the deny boundary","slug":"step-6-—-prove-the-deny-boundary","depth":2,"children":[]},{"title":"Cleanup and troubleshooting","slug":"cleanup-and-troubleshooting","depth":2,"children":[]},{"title":"Current behavior check — 2026-10-28","slug":"current-behavior-check-—-2026-10-28","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"data-relay","siteName":"DataRelay Link","title":"Use case: Ubuntu APT in a restricted network - DataRelay Link","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/use-cases/ubuntu-updates","matchLevel":0},"ko":{"href":"/ko/use-cases/ubuntu-updates","matchLevel":1}}},"lastModified":"2026-10-28T14:45:52.451Z","gitLastModified":"2026-10-28T14:44:41.000Z","originalFileLocation":"use-cases/ubuntu-updates.mdx","locale":"en"},"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=\"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\">\u003cmeta data-mint-head name=\"application-name\" content=\"DataRelay Link\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_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/data-relay/gMMMsFWCyqO9qwwH/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Use case: Ubuntu APT in a restricted network - DataRelay Link\">\u003cmeta data-mint-head property=\"og:description\" content=\"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"DataRelay Link\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://link.datarelay.run/use-cases/ubuntu-updates\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://data-relay.mintlify.app/_mintlify/api/og/v2?division=Practical+Use+Cases\u0026amp;title=Use+case%3A+Ubuntu+APT+in+a+restricted+network\u0026amp;description=Permit+only+required+Ubuntu+repository+FQDNs+through+the+agentless+Internet+Access+proxy.\u0026amp;theme=60d049ab3c70b24e2c2b6ae4\u0026amp;signature=0cb6fa0714e7802fce854493950e47fd847644755950e957d8f89943494c4d61\">\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=\"Use case: Ubuntu APT in a restricted network - DataRelay Link\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://data-relay.mintlify.app/_mintlify/api/og/v2?division=Practical+Use+Cases\u0026amp;title=Use+case%3A+Ubuntu+APT+in+a+restricted+network\u0026amp;description=Permit+only+required+Ubuntu+repository+FQDNs+through+the+agentless+Internet+Access+proxy.\u0026amp;theme=60d049ab3c70b24e2c2b6ae4\u0026amp;signature=0cb6fa0714e7802fce854493950e47fd847644755950e957d8f89943494c4d61\">\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/data-relay/gMMMsFWCyqO9qwwH/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"DataRelay Link\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#C2410C\">\u003clink data-mint-head rel=\"canonical\" href=\"https://link.datarelay.run/use-cases/ubuntu-updates\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/use-cases/ubuntu-updates.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://link.datarelay.run/use-cases/ubuntu-updates\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://link.datarelay.run/ko/use-cases/ubuntu-updates\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://link.datarelay.run/use-cases/ubuntu-updates\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://link.datarelay.run/#organization\",\"name\":\"DataRelay Link\",\"url\":\"https://link.datarelay.run\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/data-relay/QdSvVfPZ7NEJSOWl/logo/light.svg?fit=max\u0026auto=format\u0026n=QdSvVfPZ7NEJSOWl\u0026q=85\u0026s=888463e35ab49f73f9b174030b3263d6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://link.datarelay.run#website\",\"name\":\"DataRelay Link\",\"url\":\"https://link.datarelay.run\",\"publisher\":{\"@id\":\"https://link.datarelay.run/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://link.datarelay.run/use-cases/ubuntu-updates#webpage\",\"url\":\"https://link.datarelay.run/use-cases/ubuntu-updates\",\"name\":\"Use case: Ubuntu APT in a restricted network\",\"description\":\"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\",\"dateModified\":\"2026-10-28T14:44:41.000Z\",\"isPartOf\":{\"@id\":\"https://link.datarelay.run#website\"},\"breadcrumb\":{\"@id\":\"https://link.datarelay.run/use-cases/ubuntu-updates#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://link.datarelay.run/use-cases/ubuntu-updates#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Practical Use Cases\",\"item\":\"https://link.datarelay.run/use-cases/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Use case: Ubuntu APT in a restricted network\",\"item\":\"https://link.datarelay.run/use-cases/ubuntu-updates\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://link.datarelay.run/use-cases/ubuntu-updates#article\",\"headline\":\"Use case: Ubuntu APT in a restricted network\",\"name\":\"Use case: Ubuntu APT in a restricted network\",\"description\":\"Permit only required Ubuntu repository FQDNs through the agentless Internet Access proxy.\",\"url\":\"https://link.datarelay.run/use-cases/ubuntu-updates\",\"mainEntityOfPage\":{\"@id\":\"https://link.datarelay.run/use-cases/ubuntu-updates#webpage\"},\"dateModified\":\"2026-10-28T14:44:41.000Z\",\"publisher\":{\"@id\":\"https://link.datarelay.run/#organization\"},\"isPartOf\":{\"@id\":\"https://link.datarelay.run#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"DataRelay Link\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"DataRelay Link","nav":{"global":null,"languages":[{"language":"en","groups":[{"group":"Getting Started","icon":"rocket","pages":[{"title":"DataRelay Link","href":""},{"title":"What is DataRelay Link?","sidebarTitle":"What is DataRelay Link?","href":"/getting-started/overview"},{"title":"Concepts \u0026 Mental Model","sidebarTitle":"Concepts \u0026 Mental Model","icon":"diagram-project","href":"/getting-started/concepts"},{"title":"OCI Free Tier Server Preparation","sidebarTitle":"OCI Free Tier Server","icon":"cloud","href":"/getting-started/oci-free-tier-server"},{"title":"OCI Network and VM","sidebarTitle":"OCI Network \u0026 VM","icon":"cloud","href":"/getting-started/oci-network-vm"},{"title":"Install DataRelay Link on OCI","sidebarTitle":"Install DataRelay Link","icon":"server","href":"/getting-started/oci-drlink-install"},{"title":"Quick Start","href":"/getting-started/quickstart"},{"title":"Server Installation","href":"/getting-started/server-installation"},{"title":"Linux Agent Host","sidebarTitle":"Linux Agent Host","href":"/getting-started/linux-client"},{"title":"macOS Agent Host","sidebarTitle":"macOS Agent Host","href":"/getting-started/macos-client"},{"title":"Windows Agent Host","sidebarTitle":"Windows Agent Host","href":"/getting-started/windows-client"}]},{"group":"Practical Use Cases","icon":"list-check","pages":[{"title":"Scenario Playbooks","sidebarTitle":"Use Cases","href":"/use-cases/index"},{"title":"Use case: Remote SSH through NAT","href":"/use-cases/remote-ssh"},{"title":"Use case: One LAN gateway, multiple services","href":"/use-cases/lan-relay"},{"title":"Use case: Private HTTPS console","href":"/use-cases/private-web"},{"title":"Use case: Office-only Remote Access","href":"/use-cases/office-allowlist"},{"title":"Use case: Fixed TCP remote database","description":"Reach a legacy TCP database through an Agent-owned Fixed TCP Remote Service.","href":"/use-cases/fixed-tcp-database"},{"title":"Use case: Ubuntu APT in a restricted network","href":"/use-cases/ubuntu-updates"},{"title":"Use case: Git and HTTPS API from a restricted host","description":"Make proxy-aware Git and API traffic work with narrow Internet Access allowlists.","href":"/use-cases/github-egress"},{"title":"Use case: Read-only AI / MCP access","href":"/use-cases/ai-readonly"},{"title":"Use case: AI Server files, Git and jobs","href":"/use-cases/ai-server-control"},{"title":"Use case: Enroll multiple branch hosts","href":"/use-cases/bulk-onboarding"},{"title":"Use case: ConfigurationBundle safely","href":"/use-cases/configuration-bundle"},{"title":"Use case: Backup and restore","href":"/use-cases/backup-recovery"}]},{"group":"Managed Hosts \u0026 Objects","icon":"network-wired","pages":[{"title":"Managed Host Enrollment","sidebarTitle":"Managed Host Enrollment","href":"/guides/enrollment"},{"title":"Zero-Touch Enrollment","href":"/guides/zero-touch"},{"title":"Objects \u0026 Groups","sidebarTitle":"Objects \u0026 Groups","href":"/guides/groups"}]},{"group":"Remote Services \u0026 Access","icon":"arrow-right-to-bracket","pages":[{"title":"SSH","href":"/guides/ssh"},{"title":"Remote Services","sidebarTitle":"Remote Services","href":"/guides/services"},{"title":"HTTP \u0026 HTTPS","href":"/guides/http-https"},{"title":"Custom TCP \u0026 LAN Targets","href":"/guides/custom-tcp-lan"},{"title":"Remote Access","href":"/guides/remote-access"}]},{"group":"Internet Access","icon":"globe","pages":[{"title":"Internet Access","href":"/guides/internet-access"}]},{"group":"AI Access","icon":"robot","pages":[{"title":"AI Access \u0026 MCP","href":"/guides/ai-access"},{"title":"Claude \u0026 ChatGPT MCP Setup","href":"/guides/mcp-clients"},{"title":"MCP Tool Reference","href":"/reference/mcp-tools"},{"title":"MCP Compatibility","href":"/reference/mcp-validation"}]},{"group":"CLI \u0026 Configuration","icon":"terminal","pages":[{"title":"drlink Guide","href":"/drlink/overview"},{"title":"CLI Reference","href":"/drlink/cli-reference"},{"title":"ConfigurationBundle","href":"/drlink/configuration-bundle"}]},{"group":"Deployment","icon":"route","pages":[{"title":"Deployment Modes","href":"/deployment/modes"},{"title":"Firewall \u0026 NAT","href":"/deployment/firewall-nat"},{"title":"DNS \u0026 Public Hostname","href":"/deployment/dns-hostname"}]},{"group":"Operations","icon":"screwdriver-wrench","pages":[{"title":"Operations Overview","sidebarTitle":"Operations Overview","icon":"screwdriver-wrench","href":"/operations/maintenance"},{"title":"Updates","href":"/operations/updates"},{"title":"Backup \u0026 Restore","href":"/operations/backup-restore"},{"title":"Diagnostics","href":"/operations/diagnostics"},{"title":"Lifecycle Semantics","href":"/operations/lifecycle"},{"title":"Troubleshooting","href":"/troubleshooting/overview"},{"title":"Feedback","href":"/feedback/index"}]},{"group":"Security \u0026 Reference","icon":"shield-halved","pages":[{"title":"Security Overview","href":"/security/overview"},{"title":"Architecture","sidebarTitle":"Architecture","icon":"sitemap","href":"/reference/architecture"},{"title":"DataRelay Link and Managed Alternatives","sidebarTitle":"Compare Alternatives","href":"/reference/alternatives"},{"title":"Supported Platforms","href":"/reference/platforms"},{"title":"Network Ports","href":"/reference/network-ports"},{"title":"Version \u0026 Updates","href":"/reference/release-status"},{"title":"Glossary","sidebarTitle":"Glossary","icon":"book-open","href":"/reference/glossary"},{"title":"Known Limits","href":"/reference/limitations"},{"title":"License","sidebarTitle":"License","icon":"scale-balanced","href":"/reference/license"}]}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/use-cases/ubuntu-updates"}]}]},"basePath":"","title":"Use case: Ubuntu APT in a restricted network - DataRelay Link","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}