다음을 통해 공유


호출 트래픽이 자체 서버에서 프록시되도록 강제 적용

이 자습서에서는 자체 서버에서 Azure Communication Services 호출 트래픽을 프록시하는 방법을 알아봅니다.

특정 상황에서는 모든 클라이언트 트래픽을 제어할 수 있는 서버로 프록시하는 것이 유용할 수 있습니다. SDK가 초기화될 때 트래픽을 라우팅하려는 서버의 세부 정보를 제공할 수 있습니다. 사용하도록 설정되면 모든 미디어 트래픽(오디오/비디오/화면 공유)이 Azure Communication Services 기본값 대신 제공된 TURN 서버를 통해 이동합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • TURN 서버를 설정합니다.
  • 신호 프록시 서버를 설정합니다.

필수 조건

None

프록시 기능은 Azure Communication Services 통화 SDK의 공용 버전 1.25.1부터 일반 공급됩니다. 이 기능을 사용하려고 할 때 이 SDK 또는 이후 버전의 SDK를 사용해야 합니다. 이 자습서에서는 이 기능이 공개 미리 보기에서 처음 제공되는 통화 SDK 1.13.0-beta.1 버전을 사용합니다.

프록시 통화 미디어 트래픽

다음 섹션에서는 미디어 트래픽을 프록시로 호출하는 방법을 설명합니다.

TURN 서버란?

두 피어 간에 네트워크 연결을 설정하는 것이 간단하지 않은 경우가 많습니다. 다음과 같은 이유로 직접 연결이 작동하지 않을 수 있습니다.

  • 엄격한 규칙이 있는 방화벽.
  • 프라이빗 네트워크 뒤에 있는 피어입니다.
  • NAT(네트워크 주소 변환) 환경에서 실행되는 컴퓨터입니다.

이러한 네트워크 연결 문제를 해결하기 위해 네트워크 트래픽을 릴레이하는 데 릴레이 TURN(Traversal Using Relay NAT) 프로토콜을 사용하는 서버를 사용할 수 있습니다. NAT(STUN) 및 TURN 서버용 세션 순회 유틸리티는 릴레이 서버입니다.

SDK에 TURN 서버 세부 정보 제공

TURN 서버의 세부 정보를 제공하려면 CallClient를 초기화하는 동안 CallClientOptions의 일부로 사용할 TURN 서버에 대한 세부 정보를 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Web SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

import { CallClient } from '@azure/communication-calling'; 

const myTurn1 = {
    urls: [
        'turn:turn.azure.com:3478?transport=udp',
        'turn:turn1.azure.com:3478?transport=udp',
    ],
    username: 'turnserver1username',
    credential: 'turnserver1credentialorpass'
};

const myTurn2 = {
    urls: [
        'turn:20.202.255.255:3478',
        'turn:20.202.255.255:3478?transport=tcp',
    ],
    username: 'turnserver2username',
    credential: 'turnserver2credentialorpass'
};

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        turn: {
            iceServers: [
                myTurn1,
                myTurn2
            ]
        }
    }
});




// ...continue normally with your SDK setup and usage.

Important

CallClient를 초기화하는 동안 TURN 서버 세부 정보를 제공한 경우 모든 미디어 트래픽이 이러한 TURN 서버를 통해 독점적으로 흐릅니다. 호출을 만들 때 일반적으로 생성되는 다른 ICE 후보는 피어 간의 연결을 설정하는 동안 고려되지 않습니다. 즉, relay 후보만 고려됩니다. 다양한 유형의 Ice 후보에 대해 자세히 알아보려면 RTCIceCandidate: type 속성을 참조하세요.

?transport 쿼리 매개 변수가 TURN URL의 일부로 존재하지 않거나 udp, tcp 또는 tls 값 중 하나가 아닌 경우 기본 동작은 UDP입니다.

제공된 URL 중 하나라도 유효하지 않거나 turn:, turns: 또는 stun: 스키마 중 하나가 없는 경우 CallClient 초기화가 실패하고 그에 따라 오류가 throw됩니다. throw되는 오류 메시지는 문제가 발생하는 경우 문제를 해결하는 데 도움이 됩니다.

CallClientOptions 개체에 대한 API 참조와 개체 내의 networkConfiguration 속성은 CallClientOptions를 참조하세요.

Azure에서 TURN 서버 설정

Azure Portal에서 Linux 가상 머신을 만들 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요. TURN 서버를 배포하려면 coturn을 사용합니다. Coturn은 VoIP 및 WebRTC용 TURN 및 STUN 서버의 무료 오픈 소스 구현입니다.

TURN 서버를 설정한 후 WebRTC Trickle ICE 웹 페이지의 지침을 사용하여 테스트할 수 있습니다.

프록시 신호 트래픽

프록시 서버의 URL을 제공하려면 CallClient를 초기화하는 동안 CallClientOptions의 일부로 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Web SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

import { CallClient } from '@azure/communication-calling'; 

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        proxy: {
            url: 'https://myproxyserver.com'
        }
    }
});

// ...continue normally with your SDK setup and usage.

참고 항목

제공된 프록시 URL이 잘못된 URL인 경우 CallClient 초기화가 실패하고 그에 따라 오류가 throw됩니다. throw된 오류 메시지는 문제가 발생하는 경우 문제를 해결하는 데 도움이 됩니다.

CallClientOptions 개체에 대한 API 참조와 개체 내의 networkConfiguration 속성은 CallClientOptions를 참조하세요.

Express.js에서 신호 프록시 미들웨어 설정

또한 http-proxy-middleware npm 패키지를 사용하여 모든 URL을 리디렉션하도록 Express.js 서버 설정에서 프록시 미들웨어를 만들 수 있습니다. 해당 패키지의 createProxyMiddleware 함수는 간단한 리디렉션 프록시 설정에 필요한 항목을 포함해야 합니다. 다음은 모든 URL이 예상대로 작동할 수 있도록 SDK에 필요한 몇 가지 옵션 설정과 함께 사용하는 예제입니다.

const proxyRouter = (req) => {
    // Your router function if you don't intend to set up a direct target

    // An example:
    if (!req.originalUrl && !req.url) {
        return '';
    }

    const incomingUrl = req.originalUrl || req.url;
    if (incomingUrl.includes('/proxy')) {
        return 'https://microsoft.com/forwarder/';
    }
    
    return incomingUrl;
}

const myProxyMiddleware = createProxyMiddleware({
    target: 'https://microsoft.com', // This will be ignored if a router function is provided, but createProxyMiddleware still requires this to be passed in (see its official docs on the npm page for the most recent changes)
    router: proxyRouter,
    changeOrigin: true,
    secure: false, // If you have proper SSL setup, set this accordingly
    followRedirects: true,
    ignorePath: true,
    ws: true,
    logLevel: 'debug'
});

// And finally pass in your proxy middleware to your express app depending on your URL/host setup
app.use('/proxy', myProxyMiddleware);

SSL 문제가 있는 경우 cors 패키지를 참조하세요.

Azure에서 신호 프록시 서버 설정

Azure Portal에서 Linux 가상 머신을 만들고 NGINX 서버를 배포할 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요.

샘플로 사용할 수 있는 NGINX 구성은 다음과 같습니다.

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

프록시 기능은 Teams ID 및 Azure Communication Services Teams 상호 운용성 작업에 사용할 수 없습니다.

프록시 통화 미디어 트래픽

다음 섹션에서는 미디어 트래픽을 프록시로 호출하는 방법을 설명합니다.

TURN 서버란?

두 피어 간에 네트워크 연결을 설정하는 것이 간단하지 않은 경우가 많습니다. 다음과 같은 이유로 직접 연결이 작동하지 않을 수 있습니다.

  • 엄격한 규칙이 있는 방화벽.
  • 프라이빗 네트워크 뒤에 있는 피어입니다.
  • NAT(네트워크 주소 변환) 환경에서 실행되는 컴퓨터입니다.

이러한 네트워크 연결 문제를 해결하기 위해 네트워크 트래픽을 릴레이하는 데 릴레이 TURN(Traversal Using Relay NAT) 프로토콜을 사용하는 서버를 사용할 수 있습니다. NAT(STUN) 및 TURN 서버용 세션 순회 유틸리티는 릴레이 서버입니다.

SDK를 사용하여 TURN 서버 세부 정보 제공

TURN 서버의 세부 정보를 제공하려면 CallClient를 초기화하는 동안 CallClientOptions의 일부로 사용할 TURN 서버에 대한 세부 정보를 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services iOS SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

let callClientOptions = new CallClientOptions()
let callNetworkOptions = new CallNetworkOptions()

let iceServer = IceServer()
iceServer.urls = ["turn:20.202.255.255"]
iceServer.udpPort = 3478
iceServer.realm = "turn.azure.com"
iceServer.username = "turnserver1username"
iceServer.password = "turnserver1password"

callNetworkOptions.iceServers = [iceServer]

// Supply the network options when creating an instance of the CallClient
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions);

Important

CallClient를 초기화하는 동안 TURN 서버 세부 정보를 제공한 경우 모든 미디어 트래픽이 이러한 TURN 서버를 통해 독점적으로 흐릅니다. 호출을 만들 때 일반적으로 생성되는 다른 ICE 후보는 피어 간의 연결을 설정하는 동안 고려되지 않습니다. 즉, relay 후보만 고려됩니다. 다양한 유형의 Ice 후보에 대해 자세히 알아보려면 RTCIceCandidate: type 속성을 참조하세요.

현재 Android SDK는 미디어 프록시에 대해 단일 IPv4 주소 1개UDP 프로토콜만 지원합니다. UDP 포트가 제공되지 않으면 기본 UDP 포트 3478이 사용됩니다. SDK는 다음과 같이 지원되지 않는 입력으로 setIceServer를 호출할 때 Failed to set media proxy 오류를 throw합니다.

  • IceServers 목록에는 두 개 이상의 ICE 서버가 제공됩니다.
  • IceServer의 URL 목록에는 하나 이상의 URL이 제공됩니다.
  • IPv6 URL은 URL 목록에 제공됩니다.
  • TCP 포트만 제공됩니다.
  • 영역 정보가 제공되지 않습니다.

제공된 ICE 서버 정보가 유효하지 않으면 CallClient 초기화가 실패하고 이에 따라 오류가 throw됩니다.

Azure에서 TURN 서버 설정

Azure Portal에서 Linux 가상 머신을 만들 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요. TURN 서버를 배포하려면 coturn을 사용합니다. Coturn은 VoIP 및 WebRTC용 TURN 및 STUN 서버의 무료 오픈 소스 구현입니다.

TURN 서버를 설정한 후 WebRTC Trickle ICE 웹 페이지의 지침을 사용하여 테스트할 수 있습니다.

프록시 신호 트래픽

프록시 서버의 URL을 제공하려면 CallClient를 초기화하는 동안 해당 속성 Network를 통해 CallClientOptions의 일부로 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services iOS SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

let callClientOptions = CallClientOptions()
let callNetworkOptions = CallNetworkOptions()
callNetworkOptions.proxyUrl = proxyUrl
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions)

// ...continue normally with your SDK setup and usage.

Azure에서 신호 프록시 서버 설정

Azure Portal에서 Linux 가상 머신을 만들고 NGINX 서버를 배포할 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요.

샘플로 사용할 수 있는 NGINX 구성은 다음과 같습니다.

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

프록시 기능은 Teams ID 및 Azure Communication Services Teams 상호 운용성 작업에 사용할 수 없습니다.

프록시 통화 미디어 트래픽

다음 섹션에서는 미디어 트래픽을 프록시로 호출하는 방법을 설명합니다.

TURN 서버란?

두 피어 간에 네트워크 연결을 설정하는 것이 간단하지 않은 경우가 많습니다. 다음과 같은 이유로 직접 연결이 작동하지 않을 수 있습니다.

  • 엄격한 규칙이 있는 방화벽.
  • 프라이빗 네트워크 뒤에 있는 피어입니다.
  • NAT(네트워크 주소 변환) 환경에서 실행되는 컴퓨터입니다.

이러한 네트워크 연결 문제를 해결하기 위해 네트워크 트래픽을 릴레이하는 데 릴레이 TURN(Traversal Using Relay NAT) 프로토콜을 사용하는 서버를 사용할 수 있습니다. NAT(STUN) 및 TURN 서버용 세션 순회 유틸리티는 릴레이 서버입니다.

SDK를 사용하여 TURN 서버 세부 정보 제공

TURN 서버의 세부 정보를 제공하려면 CallClient를 초기화하는 동안 CallClientOptions의 일부로 사용할 TURN 서버에 대한 세부 정보를 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Android SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.setUrls(Arrays.asList("turn:20.202.255.255"));
iceServer.setUdpPort(3478);
iceServer.setRealm("turn.azure.com"); // Realm information is required.
iceServer.setUsername("turnserver1username");
iceServer.setPassword("turnserver1password");

callNetworkOptions.setIceServers(Arrays.asList(iceServer));

// Supply the network options when creating an instance of the CallClient
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

Important

CallClient를 초기화하는 동안 TURN 서버 세부 정보를 제공한 경우 모든 미디어 트래픽이 이러한 TURN 서버를 통해 독점적으로 흐릅니다. 호출을 만들 때 일반적으로 생성되는 다른 ICE 후보는 피어 간의 연결을 설정하는 동안 고려되지 않습니다. 즉, relay 후보만 고려됩니다. 다양한 유형의 Ice 후보에 대해 자세히 알아보려면 RTCIceCandidate: type 속성을 참조하세요.

현재 Android SDK는 미디어 프록시에 대해 단일 IPv4 주소 1개UDP 프로토콜만 지원합니다. UDP 포트가 제공되지 않으면 기본 UDP 포트 3478이 사용됩니다. SDK는 다음과 같이 지원되지 않는 입력으로 setIceServer를 호출할 때 Failed to set media proxy 오류를 throw합니다.

  • IceServers 목록에는 두 개 이상의 ICE 서버가 제공됩니다.
  • IceServer의 URL 목록에는 하나 이상의 URL이 제공됩니다.
  • IPv6 URL은 URL 목록에 제공됩니다.
  • TCP 포트만 제공됩니다.
  • 영역 정보가 제공되지 않습니다.

제공된 ICE 서버 정보가 유효하지 않으면 CallClient 초기화가 실패하고 이에 따라 오류가 throw됩니다.

Azure에서 TURN 서버 설정

Azure Portal에서 Linux 가상 머신을 만들 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요. TURN 서버를 배포하려면 coturn을 사용합니다. Coturn은 VoIP 및 WebRTC용 TURN 및 STUN 서버의 무료 오픈 소스 구현입니다.

TURN 서버를 설정한 후 WebRTC Trickle ICE 웹 페이지의 지침을 사용하여 테스트할 수 있습니다.

프록시 신호 트래픽

프록시 서버의 URL을 제공하려면 CallClient를 초기화하는 동안 해당 속성 Network를 통해 CallClientOptions의 일부로 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Android SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.setProxyUrl("https://myproxyserver.com");
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Azure에서 신호 프록시 서버 설정

Azure Portal에서 Linux 가상 머신을 만들고 NGINX 서버를 배포할 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요.

샘플로 사용할 수 있는 NGINX 구성은 다음과 같습니다.

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

프록시 기능은 Teams ID 및 Azure Communication Services Teams 상호 운용성 작업에 사용할 수 없습니다.

프록시 통화 미디어 트래픽

다음 섹션에서는 미디어 트래픽을 프록시로 호출하는 방법을 설명합니다.

TURN 서버란?

두 피어 간에 네트워크 연결을 설정하는 것이 간단하지 않은 경우가 많습니다. 다음과 같은 이유로 직접 연결이 작동하지 않을 수 있습니다.

  • 엄격한 규칙이 있는 방화벽.
  • 프라이빗 네트워크 뒤에 있는 피어입니다.
  • NAT(네트워크 주소 변환) 환경에서 실행되는 컴퓨터입니다.

이러한 네트워크 연결 문제를 해결하기 위해 네트워크 트래픽을 릴레이하는 데 릴레이 TURN(Traversal Using Relay NAT) 프로토콜을 사용하는 서버를 사용할 수 있습니다. NAT(STUN) 및 TURN 서버용 세션 순회 유틸리티는 릴레이 서버입니다.

SDK를 사용하여 TURN 서버 세부 정보 제공

TURN 서버의 세부 정보를 제공하려면 CallClient를 초기화하는 동안 CallClientOptions의 일부로 사용할 TURN 서버에 대한 세부 정보를 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Windows SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.Uris = new List<Uri>() { new Uri("turn:20.202.255.255") }.AsReadOnly();
iceServer.UdpPort = 3478;
iceServer.Realm = "turn.azure.com";
iceServer.Username = "turnserver1username";
iceServer.Password = "turnserver1password";

callNetworkOptions.IceServers = new List<IceServer>() { iceServer }.AsReadOnly();

// Supply the network options when creating an instance of the CallClient
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

Important

CallClient를 초기화하는 동안 TURN 서버 세부 정보를 제공한 경우 모든 미디어 트래픽이 이러한 TURN 서버를 통해 독점적으로 흐릅니다. 호출을 만들 때 일반적으로 생성되는 다른 ICE 후보는 피어 간의 연결을 설정하는 동안 고려되지 않습니다. 즉, relay 후보만 고려됩니다. 다양한 유형의 Ice 후보에 대해 자세히 알아보려면 RTCIceCandidate: type 속성을 참조하세요.

현재 Android SDK는 미디어 프록시에 대해 단일 IPv4 주소 1개UDP 프로토콜만 지원합니다. UDP 포트가 제공되지 않으면 기본 UDP 포트 3478이 사용됩니다. SDK는 다음과 같이 지원되지 않는 입력으로 setIceServer를 호출할 때 Failed to set media proxy 오류를 throw합니다.

  • IceServers 목록에는 두 개 이상의 ICE 서버가 제공됩니다.
  • IceServer의 URL 목록에는 하나 이상의 URL이 제공됩니다.
  • IPv6 URL은 URL 목록에 제공됩니다.
  • TCP 포트만 제공됩니다.
  • 영역 정보가 제공되지 않습니다.

제공된 ICE 서버 정보가 유효하지 않으면 CallClient 초기화가 실패하고 이에 따라 오류가 throw됩니다.

Azure에서 TURN 서버 설정

Azure Portal에서 Linux 가상 머신을 만들 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요. TURN 서버를 배포하려면 coturn을 사용합니다. Coturn은 VoIP 및 WebRTC용 TURN 및 STUN 서버의 무료 오픈 소스 구현입니다.

TURN 서버를 설정한 후 WebRTC Trickle ICE 웹 페이지의 지침을 사용하여 테스트할 수 있습니다.

프록시 신호 트래픽

프록시 서버의 URL을 제공하려면 CallClient를 초기화하는 동안 해당 속성 Network를 통해 CallClientOptions의 일부로 전달해야 합니다. 통화를 설정하는 방법에 대한 자세한 내용은 Azure Communication Services Windows SDK에서 음성 및 비디오를 설정하는 방법에 대한 빠른 시작을 참조하세요.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.ProxyUri = new Uri("https://myproxyserver.com");
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Azure에서 신호 프록시 서버 설정

Azure Portal에서 Linux 가상 머신을 만들고 NGINX 서버를 배포할 수 있습니다. 자세한 내용은 빠른 시작: Azure Portal에서 Linux 가상 머신 만들기를 참조하세요.

샘플로 사용할 수 있는 NGINX 구성은 다음과 같습니다.

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}