@liruiyi962464
2025-03-06T02:25:26.000000Z
字数 5628
阅读 65
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.1
sudo ip route add 192.168.10.0/24 via 192.168.10.1 dev eth0
# 假设 Docker 宿主机的网关为 172.0.0.1
sudo 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
在公网或内网中继节点部署:
# 安装 coturn
sudo apt-get install coturn
# 配置 /etc/turnserver.conf
listening-port=3478
external-ip=公网IP或中继节点IP # 如 203.0.113.100
realm=your-domain.com
user=user:password
lt-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.com
http://stream55.example.com
为监控设备 IP 分配域名,解决客户端跨网段 IP 记忆问题:
# 使用 dnsmasq 添加本地 DNS 记录
address=/camera51.example.com/192.168.10.51
address=/camera55.example.com/192.168.10.55
# 从 Docker 容器 ping 监控设备
docker exec -it webrtc-streamer ping 192.168.10.51
# 从客户端 ping 容器分配的监控 IP
ping 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:8000
http://stream51.example.com
trickle-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的配置进行进一步的调整和优化。