How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.
Public security bureaus, procuratorates, courts, government agencies, and similar organizations separate their internal network from the public internet with a cross-domain solution (CDS), which controls what may pass between security domains. The CDS only allows specific business protocols
and doesn’t let ordinary TCP / UDP pass through directly, so the audio and video platform’s APIs, signaling, and media streams can’t get across.On site, the CDS usually already has an RTSP video service channel open. Our solution takes advantage of this: a tunnel gateway sits on each side of the CDS
and wraps the platform’s traffic in standard RTSP sessions to cross it, restoring it on the other side. Users on the public internet and on the internal network can then talk to each other in the same meeting.
APIs and signaling (TCP): for each connection a public-internet user opens, the outer gateway opens an RTSP session carried over RTSP over TCP, for reliable, ordered delivery
Audio and video (UDP): when the outer gateway receives a user’s first media packet, it opens an RTSP session carried over RTP over UDP, for real-time delivery
Once a session is established, traffic flows both ways, and the platform’s responses return the same way
Only standard RTSP / RTP crosses the CDS, so it only needs to allow the RTSP service—no general forwarding
End-to-end encryption
The gateways don’t decrypt data; HTTPS, encrypted signaling, and encrypted media pass through as is, and certificates stay only on the internal platform
Transparent to the business
Neither the platform nor the clients need changes for the CDS; web, Android, iOS, and PC can all connect
Few channels
All users share one media port, so public-internet access needs only 3 channels (one each for APIs, signaling, and media), regardless of user count
No extra relay
No separate TURN relay or media conversion service is needed
Internal-network and public-internet users in one meeting
Users on the public internet and on the internal network exchange audio and video in the same meeting
Session isolation
Each public-internet connection has its own RTSP session, reclaimed automatically when idle, with concurrency limits per port
One on each side of the CDS, running the outer gateway and the inner gateway respectively
Public address
The outer gateway needs an IP or domain reachable by public-internet users
CDS policy
Allow the RTSP control ports (for example, 3 TCP ports) and the RTP media port range (UDP, one pair per public-internet media connection, sized by concurrent public-internet users) between the two gateways. Specific ports are agreed with the CDS vendor during implementation
Public-internet-side ports
The outer gateway opens 443/TCP, 18883/TCP, and 39001/UDP externally, matching the platform ports
Internal-side connectivity
The inner gateway can reach the platform’s 443/TCP, 18883/TCP, and 39001/UDP
Users on the public internet must explicitly use the “public internet” line. After passing through the gateways, the platform sees the gateway as the source address instead of the user,
so it can’t tell the internal network from the public internet by IP. Your business system must keep users coming through the public-internet entry on the public-internet line (for example, by access domain); otherwise they enter meetings with no video.
Content auditing: data passes through encrypted end to end, and the CDS sees only the RTSP / RTP wrapping, not the business content. If the customer requires the CDS to audit content, discuss it in advance
Source IP: in platform logs, public-internet users’ source addresses appear as the gateway address
Capacity planning: each public-internet user takes about 2 media sessions and 3–4 API connections; we recommend a load test before large-scale rollout
Implementation: CDS traversal is implemented per project and requires us, the customer, and the CDS vendor to agree on ports and policies; contact us
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"STMLink Docs","description":"STMLink 开发者文档:SRTC 音视频 SDK(频道通信、云录制与直播、语音录制、语音识别)与 SMeeting 会议 SDK(房间、会议管理),覆盖 iOS / Android / Windows / Web / 微信小程序 / C(服务端·嵌入式)多端接入与服务端 API。 STMLink developer docs: the SRTC audio/video SDK (channels, cloud recording and live streaming, voice recording, speech recognition) and the SMeeting conferencing SDK (rooms and meetings), covering client integration on iOS, Android, Windows, Web, WeChat Mini Programs and C (server/embedded), plus the Server API.","colors":{"primary":"#0066FF","light":"#3385FF","dark":"#0052CC"},"logo":{"light":"https://mintcdn.com/freewind/-N23X1jpF3KMqIP_/logo/light.svg?fit=max\u0026auto=format\u0026n=-N23X1jpF3KMqIP_\u0026q=85\u0026s=c87be878176892b493466cf0647c68cc","dark":"https://mintcdn.com/freewind/-N23X1jpF3KMqIP_/logo/dark.svg?fit=max\u0026auto=format\u0026n=-N23X1jpF3KMqIP_\u0026q=85\u0026s=d6697b8422020261e5703917bcf26a6b"},"favicon":"https://mintcdn.com/freewind/-N23X1jpF3KMqIP_/favicon.svg?fit=max\u0026auto=format\u0026n=-N23X1jpF3KMqIP_\u0026q=85\u0026s=dcf59f85b4c1c24462b5f99c37ff73d4","footer":{"socials":{"website":"https://www.stmlink.com"},"links":[{"header":"产品","items":[{"label":"官网","href":"https://www.stmlink.com"},{"label":"SRTC 音视频 SDK","href":"https://docs.stmlink.com/zh/rtc/overview"},{"label":"SMeeting 会议 SDK","href":"https://docs.stmlink.com/zh/meeting/overview"}]},{"header":"支持","items":[{"label":"联系我们","href":"https://www.stmlink.com"}]}]},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"markdown":{"instructions":["对外开放的服务端接口有两组前缀,都用同一套鉴权:`/server/v1/...`(SRTC 与 SMeeting 的主接口)和 `/stm/srvapi/v1/...`(SMeeting 的用户体系,服务端极简对接会用到)。鉴权是 app_id + nonce + timestamp + signature 四个请求头,用 app_key 做 HMAC-SHA256 签名,只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口,不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.","app_key 是服务端密钥,绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发(SRTC 走 `/server/v1/channel/grant`,SMeeting 走 `/stm/srvapi/v1/member/grant`)。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).","SRTC 与 SMeeting 是上下两层不同的产品,术语不通用:SRTC 是音视频底座,说「频道 channel」「加入 / 退出」;SMeeting 建在 SRTC 之上,说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语,不要把「房间」「会议」安到 SRTC 的接口上,也不要用「频道」「加入 / 离开」描述 SMeeting 的概念(接口标识符原样保留)。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply \"room\" or \"meeting\" to SRTC APIs, and never describe SMeeting concepts in prose with \"channel\", \"join\", or \"leave\" (API identifiers such as `force_join` keep their literal names).","同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API,不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK(Swift 原生与 Objective-C),两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed."]},"styling":{"latex":false},"navigation":{"languages":[{"language":"zh","href":"zh/rtc/overview"},{"language":"en","footer":{"socials":{"website":"https://www.stmlink.com/en"},"links":[{"header":"Products","items":[{"label":"Website","href":"https://www.stmlink.com/en"},{"label":"SRTC Audio \u0026 Video SDK","href":"https://docs.stmlink.com/en/rtc/overview"},{"label":"SMeeting Conferencing SDK","href":"https://docs.stmlink.com/en/meeting/overview"}]},{"header":"Support","items":[{"label":"Contact us","href":"https://www.stmlink.com/en"}]}]},"href":"en/rtc/overview"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"freewind","hasAudioNarration":false,"actualSubdomain":"freewind","customDomains":["docs.stmlink.com"],"gitSource":{"type":"github","owner":"seastart","repo":"stmlink-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae435eba5e160088bd3a3ba","collectionId":"fcfc5d16-ae47-45ed-aef8-5f89524c8998","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae435eba5e160088bd3a3ba"},"entitlements":{},"buildId":"6ae435eba5e160088bd3a3ba","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"zh","tag":"SRTC 音视频 SDK","count":168},{"language":"en","tag":"SRTC Audio \u0026 Video SDK","count":153},{"language":"zh","tag":"SMeeting 会议 SDK","count":142},{"language":"en","tag":"SMeeting Conferencing SDK","count":116},{"language":"zh","tag":"接口文档","count":103},{"language":"en","tag":"API reference","count":101},{"language":"zh","tag":"进阶实践","count":69},{"language":"en","tag":"Android SDK","count":64},{"language":"zh","tag":"Android SDK","count":64},{"language":"en","tag":"Advanced","count":49},{"language":"en","tag":"Swift SDK (iOS/macOS)","count":44},{"language":"zh","tag":"Swift SDK(iOS/macOS)","count":44},{"language":"en","tag":"Windows SDK","count":41},{"language":"zh","tag":"HarmonyOS SDK","count":41},{"language":"zh","tag":"Windows SDK","count":41},{"language":"en","tag":"Web SDK","count":30},{"language":"zh","tag":"Web SDK","count":30},{"language":"en","tag":"iOS SDK (Objective-C)","count":27},{"language":"zh","tag":"iOS SDK","count":27},{"language":"en","tag":"Server API","count":22}]},"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":"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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/product/deploy/optical-gap","slug":"/en/product/deploy/optical-gap","pageMetadata":{"title":"Access across a cross-domain solution","description":"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.","href":"/en/product/deploy/optical-gap"},"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: \"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\"\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`,hr:`hr`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Mermaid,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Public security bureaus, procuratorates, courts, government agencies, and similar organizations separate their internal network from the public internet with a `,_jsx(_components.strong,{children:`cross-domain solution (CDS)`}),`, which controls what may pass between security domains. The CDS only allows specific business protocols\nand doesn’t let ordinary TCP / UDP pass through directly, so the audio and video platform’s APIs, signaling, and media streams can’t get across.`]}),`\n`,_jsxs(_components.p,{children:[`On site, the CDS usually already has an `,_jsx(_components.strong,{children:`RTSP video service`}),` channel open. Our solution takes advantage of this: a `,_jsx(_components.strong,{children:`tunnel gateway`}),` sits on each side of the CDS\nand wraps the platform’s traffic in standard RTSP sessions to cross it, restoring it on the other side. Users on the public internet and on the internal network can then talk to each other in the same meeting.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`deployment-architecture`,children:`Deployment architecture`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n subgraph EXT[\"Public internet\"]\n U1[\"Public-internet users\u003cbr/>browser / App / PC\"]\n end\n\n subgraph DMZ[\"Public-internet side of the CDS\"]\n OG[\"Outer gateway\u003cbr/>443/TCP · 18883/TCP · 39001/UDP\"]\n end\n\n GAP{{\"CDS\u003cbr/>allows RTSP only\"}}\n\n subgraph IN[\"Internal network\"]\n IG[\"Inner gateway\"]\n PF[\"Audio and video platform\"]\n I1[\"Internal-network users\"]\n end\n\n U1 --> OG\n OG == \"RTSP tunnel\" ==> GAP\n GAP ==> IG\n IG --> PF\n I1 -- \"Direct\" --> PF`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Component`}),_jsx(_components.th,{children:`Location`}),_jsx(_components.th,{children:`Role`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Outer gateway`}),_jsx(_components.td,{children:`Public-internet side of the CDS`}),_jsx(_components.td,{children:`Provides access ports for public-internet users and wraps traffic in RTSP sessions sent into the CDS`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Inner gateway`}),_jsx(_components.td,{children:`Internal side of the CDS`}),_jsx(_components.td,{children:`Restores the RTSP sessions coming through the CDS into the original traffic and hands it to the platform`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Audio and video platform`}),_jsx(_components.td,{children:`Internal network`}),_jsx(_components.td,{children:`Deployed normally; internal-network users access it directly`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`APIs and signaling (TCP)`}),`: for each connection a public-internet user opens, the outer gateway opens an RTSP session carried over RTSP over TCP, for reliable, ordered delivery`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Audio and video (UDP)`}),`: when the outer gateway receives a user’s first media packet, it opens an RTSP session carried over RTP over UDP, for real-time delivery`]}),`\n`,_jsx(_components.li,{children:`Once a session is established, traffic flows both ways, and the platform’s responses return the same way`}),`\n`]}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant C as Public-internet user\n participant O as Outer gateway\n participant G as CDS\n participant I as Inner gateway\n participant P as Platform\n\n C->>O: Open connection / send media packet\n O->>G: RTSP handshake\n G->>I: Forward RTSP handshake\n I->>P: Connect to the matching platform port\n C->>O: Original data\n O->>G: Wrapped as RTP\n G->>I: RTP\n I->>P: Restored to original data\n P-->>C: Responses return the same way`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`highlights`,children:`Highlights`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Highlight`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Complies with CDS controls`}),_jsx(_components.td,{children:`Only standard RTSP / RTP crosses the CDS, so it only needs to allow the RTSP service—no general forwarding`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`End-to-end encryption`}),_jsx(_components.td,{children:`The gateways don’t decrypt data; HTTPS, encrypted signaling, and encrypted media pass through as is, and certificates stay only on the internal platform`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Transparent to the business`}),_jsx(_components.td,{children:`Neither the platform nor the clients need changes for the CDS; web, Android, iOS, and PC can all connect`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Few channels`}),_jsxs(_components.td,{children:[`All users share one media port, so public-internet access needs only `,_jsx(_components.strong,{children:`3 channels`}),` (one each for APIs, signaling, and media), regardless of user count`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No extra relay`}),_jsx(_components.td,{children:`No separate TURN relay or media conversion service is needed`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Internal-network and public-internet users in one meeting`}),_jsx(_components.td,{children:`Users on the public internet and on the internal network exchange audio and video in the same meeting`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Session isolation`}),_jsx(_components.td,{children:`Each public-internet connection has its own RTSP session, reclaimed automatically when idle, with concurrency limits per port`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Item`}),_jsx(_components.th,{children:`Requirement`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Servers`}),_jsx(_components.td,{children:`One on each side of the CDS, running the outer gateway and the inner gateway respectively`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Public address`}),_jsx(_components.td,{children:`The outer gateway needs an IP or domain reachable by public-internet users`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CDS policy`}),_jsx(_components.td,{children:`Allow the RTSP control ports (for example, 3 TCP ports) and the RTP media port range (UDP, one pair per public-internet media connection, sized by concurrent public-internet users) between the two gateways. Specific ports are agreed with the CDS vendor during implementation`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Public-internet-side ports`}),_jsx(_components.td,{children:`The outer gateway opens 443/TCP, 18883/TCP, and 39001/UDP externally, matching the platform ports`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Internal-side connectivity`}),_jsx(_components.td,{children:`The inner gateway can reach the platform’s 443/TCP, 18883/TCP, and 39001/UDP`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Platform configuration`}),_jsxs(_components.td,{children:[`Deploy the platform with `,_jsx(_components.a,{href:`/en/product/deploy/networks`,children:`internal-network and public-internet lines`}),`, with `,_jsx(_components.strong,{children:`the public-internet line’s addresses pointing to the outer gateway`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`License`}),_jsx(_components.td,{children:`The tunnel gateways need a separate license`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Capacity`}),_jsx(_components.td,{children:`Size the gateways’ concurrent sessions and the CDS’s throughput by the number of concurrent public-internet members`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`usage-notes`,children:`Usage notes`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Users on the public internet must explicitly use the “public internet” line.`}),` After passing through the gateways, the platform sees the gateway as the source address instead of the user,\nso it can’t tell the internal network from the public internet by IP. Your business system must keep users coming through the public-internet entry on the public-internet line (for example, by access domain); otherwise they enter meetings with no video.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Content auditing`}),`: data passes through encrypted end to end, and the CDS sees only the RTSP / RTP wrapping, not the business content. If the customer requires the CDS to audit content, discuss it in advance`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Source IP`}),`: in platform logs, public-internet users’ source addresses appear as the gateway address`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Capacity planning`}),`: each public-internet user takes about 2 media sessions and 3–4 API connections; we recommend a load test before large-scale rollout`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Implementation`}),`: CDS traversal is implemented per project and requires us, the customer, and the CDS vendor to agree on ports and policies; contact us`]}),`\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":"Access across a cross-domain solution","description":"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.","href":"/en/product/deploy/optical-gap"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Deployment architecture","slug":"deployment-architecture","depth":2,"children":[]},{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Highlights","slug":"highlights","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Usage notes","slug":"usage-notes","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"freewind","siteName":"STMLink Docs","title":"Access across a cross-domain solution - STMLink Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"zh":{"href":"/zh/product/deploy/optical-gap","matchLevel":1},"en":{"href":"/en/product/deploy/optical-gap","matchLevel":0}}},"lastModified":"2026-10-24T10:00:14.744Z","originalFileLocation":"en/product/deploy/optical-gap.md","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=\"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\">\u003cmeta data-mint-head name=\"application-name\" content=\"STMLink Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_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/freewind/ZKlibvJ7BVLSobx8/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Access across a cross-domain solution - STMLink Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"STMLink Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.stmlink.com/en/product/deploy/optical-gap\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://freewind.mintlify.app/_mintlify/api/og/v2?division=Self-hosted+deployment\u0026amp;title=Access+across+a+cross-domain+solution\u0026amp;description=How+public-internet+users+enter+meetings+when+the+platform+sits+behind+a+cross-domain+solution+%28CDS%29%3A+the+RTSP+tunnel%2C+architecture%2C+what+the+gateway+must+allow\u0026amp;theme=654b2206dad3993961863283\u0026amp;signature=51c11f1c500f01d2ea40fdf8ad17dde3a22f410b813e2b183f1221248838e883\">\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=\"Access across a cross-domain solution - STMLink Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://freewind.mintlify.app/_mintlify/api/og/v2?division=Self-hosted+deployment\u0026amp;title=Access+across+a+cross-domain+solution\u0026amp;description=How+public-internet+users+enter+meetings+when+the+platform+sits+behind+a+cross-domain+solution+%28CDS%29%3A+the+RTSP+tunnel%2C+architecture%2C+what+the+gateway+must+allow\u0026amp;theme=654b2206dad3993961863283\u0026amp;signature=51c11f1c500f01d2ea40fdf8ad17dde3a22f410b813e2b183f1221248838e883\">\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/freewind/ZKlibvJ7BVLSobx8/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"STMLink Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0066FF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.stmlink.com/en/product/deploy/optical-gap\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/product/deploy/optical-gap.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.stmlink.com/en/product/deploy/optical-gap\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.stmlink.com/zh/product/deploy/optical-gap\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.stmlink.com/zh/product/deploy/optical-gap\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.stmlink.com/#organization\",\"name\":\"STMLink Docs\",\"url\":\"https://docs.stmlink.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/freewind/-N23X1jpF3KMqIP_/logo/light.svg?fit=max\u0026auto=format\u0026n=-N23X1jpF3KMqIP_\u0026q=85\u0026s=c87be878176892b493466cf0647c68cc\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.stmlink.com#website\",\"name\":\"STMLink Docs\",\"url\":\"https://docs.stmlink.com\",\"publisher\":{\"@id\":\"https://docs.stmlink.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.stmlink.com/en/product/deploy/optical-gap#webpage\",\"url\":\"https://docs.stmlink.com/en/product/deploy/optical-gap\",\"name\":\"Access across a cross-domain solution\",\"description\":\"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\",\"dateModified\":\"2026-10-24T10:00:14.744Z\",\"isPartOf\":{\"@id\":\"https://docs.stmlink.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.stmlink.com/en/product/deploy/optical-gap#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.stmlink.com/en/product/deploy/optical-gap#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self-hosted deployment\",\"item\":\"https://docs.stmlink.com/en/product/deploy/architecture\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access across a cross-domain solution\",\"item\":\"https://docs.stmlink.com/en/product/deploy/optical-gap\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.stmlink.com/en/product/deploy/optical-gap#article\",\"headline\":\"Access across a cross-domain solution\",\"name\":\"Access across a cross-domain solution\",\"description\":\"How public-internet users enter meetings when the platform sits behind a cross-domain solution (CDS): the RTSP tunnel, architecture, what the gateway must allow, only 3 channels needed, prerequisites, and limits. For strongly isolated government networks.\",\"url\":\"https://docs.stmlink.com/en/product/deploy/optical-gap\",\"mainEntityOfPage\":{\"@id\":\"https://docs.stmlink.com/en/product/deploy/optical-gap#webpage\"},\"dateModified\":\"2026-10-24T10:00:14.744Z\",\"publisher\":{\"@id\":\"https://docs.stmlink.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.stmlink.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"STMLink Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"STMLink Docs","nav":{"global":null,"languages":[{"language":"zh","pages":[{"title":"zh","href":"/zh/product/deploy/optical-gap"}]},{"language":"en","footer":{"socials":{"website":"https://www.stmlink.com/en"},"links":[{"header":"Products","items":[{"label":"Website","href":"https://www.stmlink.com/en"},{"label":"SRTC Audio \u0026 Video SDK","href":"https://docs.stmlink.com/en/rtc/overview"},{"label":"SMeeting Conferencing SDK","href":"https://docs.stmlink.com/en/meeting/overview"}]},{"header":"Support","items":[{"label":"Contact us","href":"https://www.stmlink.com/en"}]}]},"tabs":[{"tab":"SRTC Audio \u0026 Video SDK","pages":[{"title":"SRTC Audio \u0026 Video SDK","href":"/en/rtc/overview"}]},{"tab":"SMeeting Conferencing SDK","pages":[{"title":"SMeeting Conferencing SDK","href":"/en/meeting/overview"}]},{"tab":"Product \u0026 deployment","groups":[{"group":"Overview","pages":[{"title":"Product overview","href":"/en/product/overview"},{"title":"Admin console features","href":"/en/product/admin-console"},{"title":"Try it online","href":"/en/product/demos"}]},{"group":"Room Connector","pages":[{"title":"Room Connector overview","sidebarTitle":"Overview","href":"/en/product/device-access/overview"},{"title":"SIP / H.323 endpoints","href":"/en/product/device-access/sip-h323"},{"title":"Connect phone lines","sidebarTitle":"Phone lines (SIP)","href":"/en/product/device-access/phone-lines"},{"title":"GB28181 cameras","href":"/en/product/device-access/gb28181"},{"title":"RTSP streams","href":"/en/product/device-access/rtsp"},{"title":"Room Connector FAQ","sidebarTitle":"FAQ","href":"/en/product/device-access/faq"}]},{"group":"Endpoint apps","pages":[{"title":"Soft SIP / H.323 endpoint","sidebarTitle":"Soft SIP / H.323 endpoint","href":"/en/product/terminals/softsip"},{"title":"STM Link Rooms (Android TV edition)","sidebarTitle":"STM Link Rooms (TV edition)","href":"/en/product/terminals/tv"}]},{"group":"Self-hosted deployment","pages":[{"title":"Components and architecture","href":"/en/product/deploy/architecture"},{"title":"Network and port requirements","href":"/en/product/deploy/ports"},{"title":"Internal network and public internet","href":"/en/product/deploy/networks"},{"title":"Multiple nodes and nearest access","description":"Deploying when one media server isn't enough or users are spread across data centers and regions: how multiple media nodes share channels by load, how a meeting overflows to other nodes when its node is full, how users connect to the nearest node by server group, plus capacity settings, prerequisites, and limits. Read before planning high-concurrency or multi-region deployments.","href":"/en/product/deploy/multi-node"},{"title":"Access across a cross-domain solution","href":"/en/product/deploy/optical-gap"}]}]}]}]},"title":"Access across a cross-domain solution - STMLink Docs","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}