Tutorial: 企业内网代理方案

企业内网代理方案

功能描述

在企业内网这类有防火墙的网络环境中,往往由于防火墙的原因,无法正常使用 TRTC Web SDK。这种情况下,有两种方案来解决您的问题:

本文主要介绍 Nginx + coturn 代理方案的实现流程。

前提条件

  • 该教程需要搭建两个服务器,Nginx + Turn Server,您可以联系贵公司的运维同学协助帮忙搭建。
  • Nginx 代理服务器用于代理转发 TRTC Web SDK 的 Websocket 信令数据包;Turn Server 用于转发音视频数据包。
  • 使用 Client.setProxyServer 来设置使用 Nginx 代理服务器,设置之后,SDK 会使用指定的 Nginx 代理服务器建立连接进行信令交互。
  • 使用 Client.setTurnServer 来设置使用 Turn server,设置之后,SDK 会使用指定的 Turn Server 来建立连接传输音视频数据。

实现流程

方案名 适用场景 网络要求
方案一 允许网页访问特定的外网代理服务器 代理服务器搭建在外网,内网防火墙需开通白名单允许访问外网的代理服务器。
方案二 允许网页通过内网代理服务器访问外网 代理服务器搭建在内网,内网防火墙需开通白名单允许代理服务器访问 TRTC 服务器。
方案一示例图
方案二示例图

TRTC Web SDK 代码调用示例

const client = TRTC.createClient({ 
	mode: 'rtc', 
	sdkAppId, 
	userId, 
	userSig 
}); 
// 设置 nginx 代理服务器,proxy.example.com 为 nginx 服务器的域名
client.setProxyServer({
  // 设置 Websocket 代理,用于中转 SDK 与 TRTC 后台的数据包。
  websocketProxy: 'wss://proxy.example.com/ws/',
  // SDK 默认会向 yun.tim.qq.com 域名上报日志,但若该域名在您的内网无法访问,您需要给该域名开白名单或者配置以下日志代理。
  // 设置日志上报代理,日志是排查问题的关键数据,请务必设置该代理。 v4.8.0+ 版本 SDK 支持设置该字段。
  loggerProxy: 'https://proxy.example.com/logger/' 
}); 
// 设置 turn server,14.3.3.3:3478 为 turn server 的 ip 及端口
client.setTurnServer({ url: '14.3.3.3:3478', username: 'turn', credential: 'turn', credentialType: 'password' }); 
await client.join({ roomId });

方案一

搭建 Nginx 服务器

  1. 部署 Nginx 服务器

    参考互联网中搜索到的 Nginx 服务器部署教程进行搭建部署。如果企业已有部署 Nginx 服务,可以不用部署直接进行配置。

  2. 配置 Nginx 服务器

    vi /etc/nginx/nginx.conf 
    
    http {
      server { 
        # nginx 服务器的访问域名
        server_name proxy.example.com; 
        # nginx 服务器的访问端口
        listen 443; 
        ssl on; 
        location /ws/ { # 对应 setProxyServer 中的 websocketProxy 参数
          proxy_pass https://signaling.rtc.qq.com/; # TRTC 的服务器
          # 对于 4.12.0 以下的 sdk 版本,需 proxy_pass 设置为
          # proxy_pass https://qcloud.rtc.qq.com/; 
          proxy_http_version 1.1; 
          proxy_set_header Upgrade $http_upgrade; 
          proxy_set_header Connection "upgrade"; 
        }
        location /logger/ { # 对应 setProxyServer 中的 loggerProxy 参数
          proxy_pass https://yun.tim.qq.com/;
        }
        #域名对应的 SSL 证书,HTTPS 用,用户自行申请 
        ssl_certificate ./crt/1_proxy.trtcapi.com_bundle.crt; 
        ssl_certificate_key ./crt/2_proxy.trtcapi.com.key; 
      }
    }
    
  3. 执行重新加载 Nginx

    sudo nginx -s reload
    
  4. 确认公司防火墙对 Nginx 服务器 IP 及端口限制访问解除

搭建 Turn 服务器

您可以在互联网中搜索 turn server 搭建教程进行搭建;也可以使用如下在 Centos 中搭建 turn server 的脚本进行搭建。

  1. 在 Linux 服务器中,创建脚本文件 turn.sh,脚本内容如下:

    #!/usr/bin/env bash
    # current file name is turn.sh
    # ref:
    # https://gabrieltanner.org/blog/turn-server    STEP 3 testing turn server
    # https://medium.com/av-transcode/what-is-webrtc-and-how-to-setup-stun-turn-server-for-webrtc-communication-63314728b9d0
    # as super-user
    # usage:  current_program <external-ip>
    set -x
    set -e
    ip a
    pwd
    whoami
    display_usage() {
            echo "This script must be run with super-user privileges."
            echo -e "\nUsage: $0 <external-ip> \ne.g. $0 154.8.246.205"
    }
    # if less than two arguments supplied, display usage
    if [ $# -lt 1 ]
    then
            display_usage
            exit 1
    fi
    if [[ $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
      echo "get external ip $1"
    else
      echo "wrong external ip $1 , must not have whitespace, tab and other char"
      exit 2
    fi
    yum install -y coturn
    # $1 is <external-ip>
    cat <<EOF > /etc/coturn/turnserver.conf
    external-ip=$1
    listening-port=3478
    lt-cred-mech
    max-port=65535
    min-port=20000
    no-dtls
    no-tls
    realm=tencent
    user=turn:turn
    verbose
    EOF
    
  2. 增加可执行权限

    chmod +x turn.sh
    
  3. 以 root 身份执行脚本,sudo ./turn.sh <服务器外网IP>, 例如:

    sudo ./turn.sh 14.3.3.3
    
  4. 启动 turn server

    systemctl start coturn
    # 检测 turn 是否启动成功
    ps aux | grep coturn
    # 若要重启服务,则执行
    service coturn restart 
    
  5. 配置 turn 服务器的防火墙,打开入站端口 3478(TCP & UDP),及上述配置中 min ~ max port 之间的出站端口(UDP)。

  6. 配置公司内网防火墙,允许访问 turn 服务器的 IP,及打开出站端口 3478(TCP & UDP)。

  7. 测试 turn server

    使用该测试页面,测试搭建好的 turn server 是否能够正常连通访问。如下截图中 done 说明 turn 能正常访问。

    turn-test

方案二

方案二搭建 Nginx 代理的方式,与方案一相同。主要有两处区别:

  1. 搭建 turn server 时,配置文件中的 external-ip 字段需填写服务器在您企业内网的地址。
# 方案一中启动脚本填的是服务器外网地址,例如外网地址为 14.3.3.3
sudo ./turn.sh 14.3.3.3
# 方案二中启动脚本填的是服务器在企业内网地址,例如内网地址为 10.0.0.4
sudo ./turn.sh 10.0.0.4
  1. 防火墙配置:
  • 对于 Nginx 服务器,需要在公司内网防火墙配置域名白名单,允许 Nginx 服务器访问 TRTC 的相关域名,参考:TRTC Web SDK 域名和端口白名单
  • 对于 Turn Server,需要允许 Turn Server 能够访问外网。