我们在以下环境中运行 coturn:
- 具有公有和私有接口的公有子网上的 EC2
- coturn 通过 AWS ECS 在 Docker 中运行
值得注意的是,我们在此实例前面没有负载均衡器或 NAT 网关。我们已打开安全组以允许所有 IP 的所有端口。
当我通过 Trickle ICE 测试我们的实例时,我得到以下结果:
0.072 srflx 3 udp x.x.x.x 52931 100 | 32287 | 255
0.077 relay 5 udp 10.53.34.156 65525 5 | 32285 | 255
0.089 srflx 3 udp x.x.x.x 65047 100 | 32287 | 254
0.097 relay 5 udp 10.53.34.156 65501 5 | 32285 | 254
x.x.x.x
我的公共 IP 在哪里?但是,端点relay
是我们 Docker 容器内的私有 IP。我对 ICE 的理解是,这应该是一个公共接口,以便客户端可以将其用于 TURN 会话。
以下是我们的启动配置和启动命令:
0: (1): INFO: log file opened: /var/log/turn_1_2024-04-22.log
0: (1): INFO: System cpu num is 2
0: (1): INFO: System enable num is 1
0: (1): INFO: Listener address to use: 0.0.0.0
0: (1): INFO: Relay address to use: 0.0.0.0
0: (1): INFO: Coturn Version Coturn-4.6.2 'Gorst'
0: (1): INFO: Max number of open files/sockets allowed for this process: 1048576
0: (1): INFO: Due to the open files/sockets limitation, max supported number of TURN Sessions possible is: 524000 (approximately)
0: (1): INFO:
==== Show him the instruments, Practical Frost: ====
0: (1): INFO: OpenSSL compile-time version: OpenSSL 3.1.4 24 Oct 2023 (0x30100040)
0: (1): INFO: TLS 1.3 supported
0: (1): INFO: DTLS 1.2 supported
0: (1): INFO: TURN/STUN ALPN supported
0: (1): INFO: Third-party authorization (oAuth) supported
0: (1): INFO: GCM (AEAD) supported
0: (1): INFO: SQLite supported, default database location is /var/lib/coturn/turndb
0: (1): INFO: Redis supported
0: (1): INFO: PostgreSQL supported
0: (1): INFO: MySQL supported
0: (1): INFO: MongoDB supported
0: (1): INFO: Default Net Engine version: 3 (UDP thread per CPU core)
0: (1): INFO: Domain name:
0: (1): INFO: Default realm: gearbox.com
0: (1): ERROR: CONFIG: Empty cli-password, and so telnet cli interface is disabled! Please set a non empty cli-password!
0: (1): INFO: Certificate file found: /etc/coturn/cert.pem
0: (1): INFO: Private key file found: /etc/coturn/private-key.pem
0: (1): INFO: TLS cipher suite: ALL:!COMPLEMENTOFDEFAULT:!eNULL:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
0: (1): INFO: DTLS cipher suite: ALL:!COMPLEMENTOFDEFAULT:!eNULL:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
0: (1): INFO: pid file created: /var/run/turnserver.pid
0: (1): INFO: IO method: epoll (with changelist)
0: (1): INFO: RFC5780 disabled! /NAT behavior discovery/
0: (1): INFO: Wait for relay ports initialization...
0: (1): INFO: relay 0.0.0.0 initialization...
0: (1): INFO: relay 0.0.0.0 initialization done
0: (1): INFO: Relay ports initialization done
0: (1): INFO: Total General servers: 2
0: (14): DEBUG: turn server id=1 created
0: (13): DEBUG: turn server id=0 created
0: (1): INFO: Total auth threads: 3
0: (15): INFO: SQLite DB connection success: /var/lib/turn/turndb
0: (1): INFO: prometheus collector disabled, not started
我们的启动命令:
sudo docker run -d -v /root/config/turnserver.conf:/etc/coturn/turnserver.conf \
-v /root/ssl/private-key.pem:/etc/coturn/private-key.pem \
-v /root/ssl/cert.pem:/etc/coturn/cert.pem \
--mount type=tmpfs,destination=/var/lib/coturn \
--network=host \
-p 3478-3479:3478-3479 -p 3478-3479:3478-3479/udp \
-p 443:443 -p 443:443/udp \
-p 65500-65535:65500-65535/udp \
-e DETECT_EXTERNAL_IP=yes \
-e DETECT_RELAY_IP=yes \
coturn-gbx \
--min-port=65500 \
--max-port=65535 \
--no-multicast-peers \
--no-tlsv1 --no-tlsv1_1 \
--realm=company.com
问题:我们的中继端点应该公开吗?如果是,我们这里做错了什么?
答案1
是的,为了使 Coturn 有效地作为 TURN 服务器运行,尤其是在用于支持 WebRTC 应用程序时,中继端点可以通过公共 IP 地址访问。
根据您的描述和设置,我会仔细检查以下内容以确保中继端点使用公共 IP:
外部 IP 检测:您提到使用环境变量 DETECT_EXTERNAL_IP=yes。有时,由于网络配置或 Docker 的网络模式存在一些异常,自动检测可能无法按预期工作。您可能需要在 Coturn 配置或启动命令中明确设置外部 IP。
配置设置:仔细检查外部 IP 是否在 turnserver.conf 文件中或作为命令行参数正确配置。
安全组和网络 ACL:仔细检查您的 AWS EC2 安全组和网络 ACL 是否已配置为允许在必要端口上传入和传出流量。由于您使用范围广泛的端口(TURN 使用 3478-3479,中继使用 65500-65535),因此需要根据需要对 TCP 和 UDP 流量开放这些端口。
显式 IP 配置:如果自动检测不配合,请考虑将 Coturn 配置中的监听 IP 地址和中继 IP 地址明确设置为 EC2 实例的公共 IP。
根据 OP,这是您的 Docker 命令的修改版本,具有明确的外部 IP 设置(用实际 IP 地址替换):
sudo docker run -d -v /root/config/turnserver.conf:/etc/coturn/turnserver.conf \
-v /root/ssl/private-key.pem:/etc/coturn/private-key.pem \
-v /root/ssl/cert.pem:/etc/coturn/cert.pem \
--mount type=tmpfs,destination=/var/lib/coturn \
--network=host \
-p 3478-3479:3478-3479 -p 3478-3479:3478-3479/udp \
-p 443:443 -p 443:443/udp \
-p 65500-65535:65500-65535/udp \
-e DETECT_EXTERNAL_IP=no \
-e DETECT_RELAY_IP=no \
coturn-gbx \
--external-ip=<your-public-ip>/<your-private-ip> \
--min-port=65500 \
--max-port=65535 \
--no-multicast-peers \
--no-tlsv1 --no-tlsv1_1 \
--realm=company.com
```