@liruiyi962464
2025-03-06T02:25:26.000000Z
字数 5628
阅读 436
oula
当 Docker 容器(IP 172.0.0.10)与监控设备(IP 192.168.10.51-55)处于不同网段时,需解决跨子网通信和 WebRTC 的 NAT 穿透问题。以下是分步配置方案:
假设你的网络环境如下:
- 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),需跨网段访问监控流。
| 问题描述 | 解决方案 |
|---|---|
| Docker 容器与监控设备跨网段隔离 | 路由配置或VLAN 互通 |
| WebRTC 返回容器内网 IP | STUN/TURN 服务器穿透 NAT |
| 客户端跨网段访问监控流 | 反向代理或TURN 中继 |
确保 172.0.0.0/24 与 192.168.10.0/24 网段互通:
# 假设监控设备网关为 192.168.10.1sudo ip route add 192.168.10.0/24 via 192.168.10.1 dev eth0
# 假设 Docker 宿主机的网关为 172.0.0.1sudo ip route add 172.0.0.0/24 via 172.0.0.1 dev eth0
让容器直接接入监控设备所在的物理网络(192.168.10.0/24),绕过 Docker 默认的桥接隔离:
# 创建 Macvlan 网络docker network create -d macvlan \--subnet=192.168.10.0/24 \--gateway=192.168.10.1 \--ip-range=192.168.10.240/28 \-o parent=eth0 \macvlan_net# 启动容器并分配监控网段 IP(如 192.168.10.53)docker run -d \--network=macvlan_net \--ip=192.168.10.53 \webrtc-streamer
192.168.10.53 访问。在复杂 NAT 环境(如对称型 NAT)中,必须通过 TURN 服务器中继流量:
使用 coturn 在公网或内网中继节点部署:
# 安装 coturnsudo apt-get install coturn# 配置 /etc/turnserver.conflistening-port=3478external-ip=公网IP或中继节点IP # 如 203.0.113.100realm=your-domain.comuser=user:passwordlt-cred-mech
docker run -d \--network=macvlan_net \--ip=192.168.10.53 \-e WEBRTC_STUNURL="stun:203.0.113.100:3478" \-e WEBRTC_TURNURL="turn:203.0.113.100:3478" \-e WEBRTC_TURNUSER="user" \-e WEBRTC_TURNPASSWORD="password" \webrtc-streamer
强制优先使用 TURN 中继,确保跨网段连通性:
# 在 webrtc-streamer 启动参数中添加 ICE 策略webrtc-streamer --ice-transport-policy relay
使用 Nginx 将不同网段的监控流聚合到统一域名:
http {# 代理 192.168.10.51 的流server {listen 80;server_name stream51.example.com;location / {proxy_pass http://192.168.10.51:8000;}}# 代理 192.168.10.55 的流server {listen 80;server_name stream55.example.com;location / {proxy_pass http://192.168.10.55:8000;}}}
http://stream51.example.comhttp://stream55.example.com为监控设备 IP 分配域名,解决客户端跨网段 IP 记忆问题:
# 使用 dnsmasq 添加本地 DNS 记录address=/camera51.example.com/192.168.10.51address=/camera55.example.com/192.168.10.55
# 从 Docker 容器 ping 监控设备docker exec -it webrtc-streamer ping 192.168.10.51# 从客户端 ping 容器分配的监控 IPping 192.168.10.53
访问 http://192.168.10.53:8000,打开浏览器开发者工具,检查候选地址:
- 期望结果:包含 relay 类型(TURN 中继 IP)。
- 失败示例:仅有 host 或 srflx 类型。
# 查看 coturn 日志tail -f /var/log/turnserver.log# 使用 turnutils_uclient 测试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 | 允许容器访问监控设备 |
172.0.0.1,需跨网段访问监控设备 192.168.10.51-55。203.0.113.100。10.10.0.0/16 网段。创建 Macvlan 网络:
docker network create -d macvlan \--subnet=192.168.10.0/24 \--gateway=192.168.10.1 \-o parent=eth0 \macvlan_net
启动 webrtc-streamer 容器:
docker run -d \--network=macvlan_net \--ip=192.168.10.53 \-e WEBRTC_TURNURL="turn:203.0.113.100:3478" \-e WEBRTC_TURNUSER="user" \-e WEBRTC_TURNPASSWORD="password" \webrtc-streamer "rtsp://192.168.10.51:554/stream"
客户端访问:
http://192.168.10.53:8000http://stream51.example.comtrickle-ice 和 turnutils_uclient 确保 STUN/TURN 生效。要在不同的网段下通过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
listening-port=3478
fingerprint
lt-cred-mech
static-auth-secret=mySecretKeyHereChangeItInProductionEnv
realm=yourdomain.example.org
cert=/path/to/tls_cert.pem
pkey=/path/to/private_key.pem
no-loopback-peers
no-multicast-peers
log-file=/var/log/turn.log
verbose
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的配置进行进一步的调整和优化。