[关闭]
@liruiyi962464 2025-03-06T02:25:26.000000Z 字数 5628 阅读 65

webrtc-streamer 返回数据 把docker的ip地址返回了 STUN/TURN 如何配置

oula


跨网段 WebRTC 流媒体配置指南

当 Docker 容器(IP 172.0.0.10)与监控设备(IP 192.168.10.51-55)处于不同网段时,需解决跨子网通信和 WebRTC 的 NAT 穿透问题。以下是分步配置方案:


1. 网络架构分析

假设你的网络环境如下:
- Docker 容器网络172.0.0.0/24(容器 IP 172.0.0.10)。
- 监控设备网络192.168.10.0/24(IP 192.168.10.51-55)。
- 客户端网络:另一独立网段(如 10.10.0.0/16),需跨网段访问监控流。


2. 核心问题与解决思路

问题描述 解决方案
Docker 容器与监控设备跨网段隔离 路由配置VLAN 互通
WebRTC 返回容器内网 IP STUN/TURN 服务器穿透 NAT
客户端跨网段访问监控流 反向代理TURN 中继

一、跨网段网络互通配置

1. 配置路由打通网段

确保 172.0.0.0/24192.168.10.0/24 网段互通:

(1) 在 Docker 宿主机添加静态路由
  1. # 假设监控设备网关为 192.168.10.1
  2. sudo ip route add 192.168.10.0/24 via 192.168.10.1 dev eth0
(2) 在监控设备网关添加回程路由
  1. # 假设 Docker 宿主机的网关为 172.0.0.1
  2. sudo ip route add 172.0.0.0/24 via 172.0.0.1 dev eth0

2. 使用 Docker Macvlan 网络

让容器直接接入监控设备所在的物理网络(192.168.10.0/24),绕过 Docker 默认的桥接隔离:

  1. # 创建 Macvlan 网络
  2. docker network create -d macvlan \
  3. --subnet=192.168.10.0/24 \
  4. --gateway=192.168.10.1 \
  5. --ip-range=192.168.10.240/28 \
  6. -o parent=eth0 \
  7. macvlan_net
  8. # 启动容器并分配监控网段 IP(如 192.168.10.53)
  9. docker run -d \
  10. --network=macvlan_net \
  11. --ip=192.168.10.53 \
  12. webrtc-streamer

二、WebRTC 跨网段 NAT 穿透

1. 强制使用 TURN 服务器

在复杂 NAT 环境(如对称型 NAT)中,必须通过 TURN 服务器中继流量:

(1) 部署 TURN 服务器

使用 coturn 在公网或内网中继节点部署:

  1. # 安装 coturn
  2. sudo apt-get install coturn
  3. # 配置 /etc/turnserver.conf
  4. listening-port=3478
  5. external-ip=公网IP或中继节点IP # 如 203.0.113.100
  6. realm=your-domain.com
  7. user=user:password
  8. lt-cred-mech
(2) 配置 webrtc-streamer 使用 TURN
  1. docker run -d \
  2. --network=macvlan_net \
  3. --ip=192.168.10.53 \
  4. -e WEBRTC_STUNURL="stun:203.0.113.100:3478" \
  5. -e WEBRTC_TURNURL="turn:203.0.113.100:3478" \
  6. -e WEBRTC_TURNUSER="user" \
  7. -e WEBRTC_TURNPASSWORD="password" \
  8. webrtc-streamer

2. ICE 候选地址策略

强制优先使用 TURN 中继,确保跨网段连通性:

  1. # 在 webrtc-streamer 启动参数中添加 ICE 策略
  2. webrtc-streamer --ice-transport-policy relay

三、客户端跨网段访问配置

1. 反向代理统一入口

使用 Nginx 将不同网段的监控流聚合到统一域名:

  1. http {
  2. # 代理 192.168.10.51 的流
  3. server {
  4. listen 80;
  5. server_name stream51.example.com;
  6. location / {
  7. proxy_pass http://192.168.10.51:8000;
  8. }
  9. }
  10. # 代理 192.168.10.55 的流
  11. server {
  12. listen 80;
  13. server_name stream55.example.com;
  14. location / {
  15. proxy_pass http://192.168.10.55:8000;
  16. }
  17. }
  18. }

2. 动态 DNS 解析

为监控设备 IP 分配域名,解决客户端跨网段 IP 记忆问题:

  1. # 使用 dnsmasq 添加本地 DNS 记录
  2. address=/camera51.example.com/192.168.10.51
  3. address=/camera55.example.com/192.168.10.55

四、验证与调试

1. 检查网络连通性

  1. # 从 Docker 容器 ping 监控设备
  2. docker exec -it webrtc-streamer ping 192.168.10.51
  3. # 从客户端 ping 容器分配的监控 IP
  4. ping 192.168.10.53

2. 验证 ICE 候选地址

访问 http://192.168.10.53:8000,打开浏览器开发者工具,检查候选地址:
- 期望结果:包含 relay 类型(TURN 中继 IP)。
- 失败示例:仅有 hostsrflx 类型。

3. TURN 服务器状态检查

  1. # 查看 coturn 日志
  2. tail -f /var/log/turnserver.log
  3. # 使用 turnutils_uclient 测试
  4. turnutils_uclient -u user -w password 203.0.113.100

五、防火墙与端口开放

方向 协议 端口 说明
入站 TCP 80, 443 HTTP/HTTPS 代理访问
入站 UDP 3478 STUN/TURN 服务
入站 UDP 10000-20000 WebRTC 媒体端口范围
出站 ALL ALL 允许容器访问监控设备

六、完整配置示例

场景

步骤

  1. 创建 Macvlan 网络

    1. docker network create -d macvlan \
    2. --subnet=192.168.10.0/24 \
    3. --gateway=192.168.10.1 \
    4. -o parent=eth0 \
    5. macvlan_net
  2. 启动 webrtc-streamer 容器

    1. docker run -d \
    2. --network=macvlan_net \
    3. --ip=192.168.10.53 \
    4. -e WEBRTC_TURNURL="turn:203.0.113.100:3478" \
    5. -e WEBRTC_TURNUSER="user" \
    6. -e WEBRTC_TURNPASSWORD="password" \
    7. webrtc-streamer "rtsp://192.168.10.51:554/stream"
  3. 客户端访问

    • 直接通过 TURN 中继访问:http://192.168.10.53:8000
    • 或通过反向代理:http://stream51.example.com

总结

其他方式

要在不同的网段下通过webrtc-streamer播放视频,并正确配置STUN/TURN服务器以实现NAT穿透,你可以按照以下步骤进行:

一、webrtc-streamer配置与启动
拉取webrtc-streamer镜像
使用docker命令拉取webrtc-streamer镜像:

bash
sudo docker pull mpromonet/webrtc-streamer
启动webrtc-streamer容器
启动webrtc-streamer容器,并映射到主机的8000端口:

bash
sudo docker run -itd -p 8000:8000 --name webrtc-streamer mpromonet/webrtc-streamer
注意:如果你需要配置STUN/TURN服务器,可以在启动命令中通过参数指定。

连接摄像头并获取视频流
将摄像头设备连接到计算机上(或直接使用支持RTSP协议的监控摄像头),并使用FFmpeg等工具获取其视频流。然后,通过webrtc-streamer的API将视频流传输到webrtc-streamer中。

二、配置STUN/TURN服务器
由于webrtc-streamer默认不会穿透NAT,因此需要配置STUN和TURN服务器。

安装coturn
在Ubuntu系统上,你可以通过以下命令安装coturn:

bash
sudo apt update && sudo apt upgrade -y
sudo apt install coturn
或者,从源码编译安装coturn(适用于需要最新版本或自定义配置的情况):

bash
sudo apt install build-essential libssl-dev libevent-dev
git clone https://github.com/coturn/coturn.git
cd coturn
./configure
sudo make
sudo make install
配置coturn
编辑coturn的配置文件(通常位于/etc/turnserver.conf或/usr/local/etc/turnserver.conf),进行如下设置:

conf

监听所有IPv4接口上的默认端口(3478)

listening-port=3478

使用长期证书机制

fingerprint
lt-cred-mech

设置静态认证密钥(此处为示例,请替换为实际密钥)

static-auth-secret=mySecretKeyHereChangeItInProductionEnv

设置领域(通常与你的域名或公网IP相关)

realm=yourdomain.example.org

指定TLS证书和私钥文件路径(需要事先生成)

cert=/path/to/tls_cert.pem
pkey=/path/to/private_key.pem

不接受来自loopback IP的数据包

no-loopback-peers

拒绝multicast请求

no-multicast-peers

日志保存目录

log-file=/var/log/turn.log

更详细日志记录级别

verbose

指定公网IP(如果有静态公网IP的话)

external-ip=

添加用户(可以添加多个用户)

user=testuser:testpassword
注意:

mySecretKeyHereChangeItInProductionEnv应替换为一个安全随机字符串。
应替换为你的VPS或云实例的实际外网IP地址。如果没有静态公网IP,则省略此行让服务器自行探测。
证书和私钥文件可以通过openssl等工具生成。
启动coturn服务
使用以下命令启动coturn服务,并设置开机自启:

bash
sudo systemctl enable coturn.service
sudo service coturn start
验证是否开启成功可通过命令查看监听状态:

bash
netstat -an | grep :3478
配置webrtc-streamer使用STUN/TURN服务器
在启动webrtc-streamer容器时,通过参数指定STUN/TURN服务器的地址、端口号、用户名和密码。例如:

bash
sudo docker run -itd -p 8000:8000 --name webrtc-streamer mpromonet/webrtc-streamer -s stun:your_stun_server_address:port -t testuser:testpassword@turn:your_turn_server_address:port
其中,your_stun_server_address和your_turn_server_address应替换为你的STUN和TURN服务器的实际地址,port为相应服务器的端口号(默认为3478),testuser和testpassword为你在coturn配置文件中设置的用户名和密码。

三、播放视频
确保webrtc-streamer和coturn服务正常运行
在浏览器中访问webrtc-streamer的Web界面(通常位于http://:8000/webrtcstreamer.html),确保能够正常看到视频流。同时,确保coturn服务正在监听指定的端口,并且能够通过公网访问。

在不同网段下访问视频流
由于你已经配置了STUN/TURN服务器,因此即使在不同的网段下,也能够通过webrtc-streamer访问到视频流。只需在支持WebRTC的浏览器中输入webrtc-streamer的Web界面地址,即可观看视频。

注意:在实际应用中,你可能还需要考虑防火墙和路由器规则的设置,以确保外部设备能够访问到你的STUN/TURN服务和webrtc-streamer服务。同时,由于网络环境的复杂性,可能还需要对webrtc-streamer和coturn的配置进行进一步的调整和优化。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注