Поделиться через


Принудительное вызов трафика для прокси-сервера на собственном сервере

В этом руководстве описано, как прокси-серверы Службы коммуникации Azure вызывать трафик на собственных серверах.

В некоторых ситуациях может оказаться полезным, чтобы весь клиентский трафик был прокси-сервером, который можно контролировать. При инициализации пакета SDK можно указать сведения о серверах, на которые будет направляться трафик. После включения весь трафик мультимедиа (аудио/видео/общий доступ к экрану) перемещается по предоставленным серверам TURN вместо Службы коммуникации Azure по умолчанию.

В этом руководстве описано следующее:

  • Настройка сервера TURN.
  • Настройте прокси-сервер сигнала.

Необходимые компоненты

нет

Функция прокси-сервера общедоступна, начиная с общедоступной версии 1.25.1 пакета SDK для вызовов Службы коммуникации Azure. Убедитесь, что вы используете этот пакет SDK или более позднюю версию пакета SDK при попытке использовать эту функцию. В этом руководстве используется версия пакета SDK для вызовов 1.13.0-beta.1, где эта функция стала первой доступной в общедоступной предварительной версии.

Прокси-сервер, вызывающий трафик мультимедиа

В следующих разделах описывается вызов трафика мультимедиа прокси-сервера.

Что такое СЕРВЕР TURN?

Во многих случаях установка сетевого подключения между двумя одноранговыми узлами не является простой. Прямое подключение может не работать из-за:

  • Брандмауэры с строгими правилами.
  • Пиринги сидят за частной сетью.
  • Компьютеры, работающие в среде преобразования сетевых адресов (NAT).

Чтобы устранить эти проблемы с сетевым подключением, можно использовать сервер, использующий протокол обхода с помощью протокола NAT ретранслятора (TURN) для ретрансляции сетевого трафика. Программы обхода сеансов для серверов NAT (STUN) и TURN являются серверами ретрансляции.

Укажите сведения о сервере TURN в пакет SDK

Чтобы предоставить сведения о серверах TURN, необходимо передать сведения о том, какой сервер TURN будет использоваться в процессе CallClientOptions инициализации CallClient. Дополнительные сведения о настройке звонка см. в разделе Службы коммуникации Azure веб-пакет 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.

Внимание

Если вы предоставили сведения о сервере TURN во время инициализации CallClient, весь трафик мультимедиа передается исключительно через эти серверы TURN. Любые другие кандидаты ICE, которые обычно создаются при создании вызова, не будут рассматриваться при попытке установить подключение между одноранговых узлов. Это означает, что рассматриваются только relay кандидаты. Дополнительные сведения о различных типах кандидатов ice см. в разделе RTCIceCandidate: свойство type.

?transport Если параметр запроса не присутствует в составе URL-адреса TURN или не является одним из udpзначений tcpили tls по умолчанию используется UDP.

Если любой из указанных URL-адресов является недопустимым или не имеет одного из turn:схем CallClient , turns:stun: инициализация завершается ошибкой и вызывает ошибки соответствующим образом. Сообщения об ошибках, которые возникают, помогут устранить неполадки.

Справочник по API для CallClientOptions объекта и networkConfiguration свойства в нем см. в разделе CallClientOptions.

Настройка сервера TURN в Azure

Виртуальную машину Linux можно создать в портал Azure. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure. Чтобы развернуть сервер TURN, используйте coturn. Coturn — это бесплатная и открытая реализация сервера TURN и STUN для VoIP и WebRTC.

После настройки сервера TURN его можно протестировать с помощью инструкций на веб-странице WebRTC Trickle ICE .

Сигнальный трафик прокси-сервера

Чтобы указать URL-адрес прокси-сервера, его необходимо передать в рамках CallClientOptions инициализации CallClient. Дополнительные сведения о настройке звонка см. в разделе Службы коммуникации Azure веб-пакет 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 инициализация завершается ошибкой соответствующим образом. Сообщения об ошибках, которые возникают, помогают устранить неполадки.

Справочник по API для CallClientOptions объекта и networkConfiguration свойства в нем см. в разделе CallClientOptions.

Настройка по промежуточному по промежуточному слоя прокси-сервера в Express.js

Вы также можете создать ПО промежуточного слоя прокси-сервера в настройке сервера Express.js, чтобы все URL-адреса перенаправлялись через него с помощью пакета npm по промежуточному по промежуточному поверх http-proxy. . Функция createProxyMiddleware из этого пакета должна охватывать то, что требуется для простой настройки прокси-сервера перенаправления. Ниже приведен пример использования с некоторыми параметрами параметров, необходимых пакету SDK, чтобы все наши URL-адреса работали должным образом:

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

Виртуальную машину Linux можно создать в портал Azure и развернуть на нем сервер NGINX. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure.

Ниже приведена конфигурация 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 и Службы коммуникации Azure действий взаимодействия Teams.

Прокси-сервер, вызывающий трафик мультимедиа

В следующих разделах описывается вызов трафика мультимедиа прокси-сервера.

Что такое СЕРВЕР TURN?

Во многих случаях установка сетевого подключения между двумя одноранговыми узлами не является простой. Прямое подключение может не работать из-за:

  • Брандмауэры с строгими правилами.
  • Пиринги сидят за частной сетью.
  • Компьютеры, работающие в среде преобразования сетевых адресов (NAT).

Чтобы устранить эти проблемы с сетевым подключением, можно использовать сервер, использующий протокол обхода с помощью протокола NAT ретранслятора (TURN) для ретрансляции сетевого трафика. Программы обхода сеансов для серверов NAT (STUN) и TURN являются серверами ретрансляции.

Предоставление сведений о сервере TURN с помощью пакета SDK

Чтобы предоставить сведения о серверах TURN, необходимо передать сведения о том, какой сервер TURN будет использоваться в процессе CallClientOptions инициализации CallClient. Дополнительные сведения о настройке звонка см. в статье Службы коммуникации Azure пакет SDK для iOS для краткого руководства по настройке голосовой связи и видео.

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);

Внимание

Если вы предоставили сведения о сервере TURN во время инициализации CallClient, весь трафик мультимедиа передается исключительно через эти серверы TURN. Любые другие кандидаты ICE, которые обычно создаются при создании вызова, не будут рассматриваться при попытке установить подключение между одноранговых узлов. Это означает, что рассматриваются только relay кандидаты. Дополнительные сведения о различных типах кандидатов в Ice см. в разделе RTCIceCandidate: свойство type.

В настоящее время пакет SDK для Android поддерживает только один IPv4-адрес и протокол UDP для прокси-сервера мультимедиа. Если порт UDP не указан, используется порт UDP по умолчанию 3478. Пакет SDK выдает ошибку Failed to set media proxy при вызове setIceServer неподдерживаемых входных данных следующим образом:

  • Несколько серверов ICE предоставляются в списке IceServers.
  • Несколько URL-адресов предоставляются в списке URL-адресов IceServer.
  • Url-адрес IPv6 указан в списке URL-адресов.
  • Предоставляется только TCP-порт.
  • Сведения о области не предоставляются.

Если указана недопустимая информация о сервере ICE, CallClient инициализация завершается ошибкой и вызывает ошибки соответствующим образом.

Настройка сервера TURN в Azure

Виртуальную машину Linux можно создать в портал Azure. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure. Чтобы развернуть сервер TURN, используйте coturn. Coturn — это бесплатная и открытая реализация сервера TURN и STUN для VoIP и WebRTC.

После настройки сервера TURN его можно протестировать с помощью инструкций на веб-странице WebRTC Trickle ICE .

Сигнальный трафик прокси-сервера

Чтобы указать URL-адрес прокси-сервера, необходимо передать его в рамках CallClientOptions его свойства Network во время инициализации CallClient. Дополнительные сведения о настройке звонка см. в статье Службы коммуникации Azure пакет SDK для iOS для краткого руководства по настройке голосовой связи и видео.

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

Виртуальную машину Linux можно создать в портал Azure и развернуть на нем сервер NGINX. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure.

Ниже приведена конфигурация 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 и Службы коммуникации Azure действий взаимодействия Teams.

Прокси-сервер, вызывающий трафик мультимедиа

В следующих разделах описывается вызов трафика мультимедиа прокси-сервера.

Что такое СЕРВЕР TURN?

Во многих случаях установка сетевого подключения между двумя одноранговыми узлами не является простой. Прямое подключение может не работать из-за:

  • Брандмауэры с строгими правилами.
  • Пиринги сидят за частной сетью.
  • Компьютеры, работающие в среде преобразования сетевых адресов (NAT).

Чтобы устранить эти проблемы с сетевым подключением, можно использовать сервер, использующий протокол обхода с помощью протокола NAT ретранслятора (TURN) для ретрансляции сетевого трафика. Программы обхода сеансов для серверов NAT (STUN) и TURN являются серверами ретрансляции.

Предоставление сведений о сервере TURN с помощью пакета SDK

Чтобы предоставить сведения о серверах TURN, необходимо передать сведения о том, какой сервер TURN будет использоваться в процессе CallClientOptions инициализации CallClient. Дополнительные сведения о настройке звонка см. в статье Службы коммуникации Azure пакет SDK для Android для краткого руководства по настройке голосовой связи и видео.

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);

Внимание

Если вы предоставили сведения о сервере TURN во время инициализации CallClient, весь трафик мультимедиа передается исключительно через эти серверы TURN. Любые другие кандидаты ICE, которые обычно создаются при создании вызова, не будут рассматриваться при попытке установить подключение между одноранговых узлов. Это означает, что рассматриваются только relay кандидаты. Дополнительные сведения о различных типах кандидатов в Ice см. в разделе RTCIceCandidate: свойство type.

В настоящее время пакет SDK для Android поддерживает только один IPv4-адрес и протокол UDP для прокси-сервера мультимедиа. Если порт UDP не указан, используется порт UDP по умолчанию 3478. Пакет SDK выдает ошибку Failed to set media proxy при вызове setIceServer неподдерживаемых входных данных следующим образом:

  • Несколько серверов ICE предоставляются в списке IceServers.
  • Несколько URL-адресов предоставляются в списке URL-адресов IceServer.
  • Url-адрес IPv6 указан в списке URL-адресов.
  • Предоставляется только TCP-порт.
  • Сведения о области не предоставляются.

Если указана недопустимая информация о сервере ICE, CallClient инициализация завершается ошибкой и вызывает ошибки соответствующим образом.

Настройка сервера TURN в Azure

Виртуальную машину Linux можно создать в портал Azure. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure. Чтобы развернуть сервер TURN, используйте coturn. Coturn — это бесплатная и открытая реализация сервера TURN и STUN для VoIP и WebRTC.

После настройки сервера TURN его можно протестировать с помощью инструкций на веб-странице WebRTC Trickle ICE .

Сигнальный трафик прокси-сервера

Чтобы указать URL-адрес прокси-сервера, необходимо передать его в рамках CallClientOptions его свойства Network во время инициализации CallClient. Дополнительные сведения о настройке звонка см. в статье Службы коммуникации Azure пакет SDK для Android для краткого руководства по настройке голосовой связи и видео.

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

Виртуальную машину Linux можно создать в портал Azure и развернуть на нем сервер NGINX. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure.

Ниже приведена конфигурация 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 и Службы коммуникации Azure действий взаимодействия Teams.

Прокси-сервер, вызывающий трафик мультимедиа

В следующих разделах описывается вызов трафика мультимедиа прокси-сервера.

Что такое СЕРВЕР TURN?

Во многих случаях установка сетевого подключения между двумя одноранговыми узлами не является простой. Прямое подключение может не работать из-за:

  • Брандмауэры с строгими правилами.
  • Пиринги сидят за частной сетью.
  • Компьютеры, работающие в среде преобразования сетевых адресов (NAT).

Чтобы устранить эти проблемы с сетевым подключением, можно использовать сервер, использующий протокол обхода с помощью протокола NAT ретранслятора (TURN) для ретрансляции сетевого трафика. Программы обхода сеансов для серверов NAT (STUN) и TURN являются серверами ретрансляции.

Предоставление сведений о сервере TURN с помощью пакета SDK

Чтобы предоставить сведения о серверах TURN, необходимо передать сведения о том, какой сервер TURN будет использоваться в процессе CallClientOptions инициализации CallClient. Дополнительные сведения о настройке звонка см. в разделе Службы коммуникации Azure 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);

Внимание

Если вы предоставили сведения о сервере TURN во время инициализации CallClient, весь трафик мультимедиа передается исключительно через эти серверы TURN. Любые другие кандидаты ICE, которые обычно создаются при создании вызова, не будут рассматриваться при попытке установить подключение между одноранговых узлов. Это означает, что рассматриваются только relay кандидаты. Дополнительные сведения о различных типах кандидатов в Ice см. в разделе RTCIceCandidate: свойство type.

В настоящее время пакет SDK для Android поддерживает только один IPv4-адрес и протокол UDP для прокси-сервера мультимедиа. Если порт UDP не указан, используется порт UDP по умолчанию 3478. Пакет SDK выдает ошибку Failed to set media proxy при вызове setIceServer неподдерживаемых входных данных следующим образом:

  • Несколько серверов ICE предоставляются в списке IceServers.
  • Несколько URL-адресов предоставляются в списке URL-адресов IceServer.
  • Url-адрес IPv6 указан в списке URL-адресов.
  • Предоставляется только TCP-порт.
  • Сведения о области не предоставляются.

Если указана недопустимая информация о сервере ICE, CallClient инициализация завершается ошибкой и вызывает ошибки соответствующим образом.

Настройка сервера TURN в Azure

Виртуальную машину Linux можно создать в портал Azure. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure. Чтобы развернуть сервер TURN, используйте coturn. Coturn — это бесплатная и открытая реализация сервера TURN и STUN для VoIP и WebRTC.

После настройки сервера TURN его можно протестировать с помощью инструкций на веб-странице WebRTC Trickle ICE .

Сигнальный трафик прокси-сервера

Чтобы указать URL-адрес прокси-сервера, необходимо передать его в рамках CallClientOptions его свойства Network во время инициализации CallClient. Дополнительные сведения о настройке звонка см. в разделе Службы коммуникации Azure 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

Виртуальную машину Linux можно создать в портал Azure и развернуть на нем сервер NGINX. Дополнительные сведения см. в статье Краткое руководство. Создание виртуальной машины под управлением Linux на портале Azure.

Ниже приведена конфигурация 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;
        }
    }
}