我们正在严格控制的网络环境(生产中)中工作,我们需要锁定用于某些事物的端口。
我们目前需要向某些摄像机打开 RTSP 流,并且我们根据所使用的端口路由返回流量(因为每个生产实例的 IP 地址可能会有很大差异)。
路由器规则目前运行良好,但最终规则是将所有流量(尚未被早期规则捕获)路由到默认框
A
。路由器似乎不太关心 IP 地址,而是将数据包路由到机器所连接的特定连接器。所以,当我说 A
或 B
时,这实际上是路由器背面的物理连接器。
但是,我们希望能够将从不同的盒子发起的 GStreamer 摄像头馈送路由回该盒子。
目前,当我在B
(在非锁定开发环境中)上执行
netstat -na
时,我可以看到 RTSP 流使用从 B
到 35100
的各种客户端端口。这与 58712
的内容物形成凝胶,显示 /proc/sys/net/ipv4/ip_local_port_range
。例如(32768 60999
是机器
.20.20
,B
是相机:.30.30
我认为
在创建tcp 0 0 172.24.20.20:36250 172.24.30.30:8091 ESTABLISHED
元素时使用的
port-range
结构中设置props
就足够了。但是,将此设置为 rtspsrc
仍然会导致 4500-4999
输出显示使用了 30000 以上的客户端端口。netstat
是否应该控制这些用于摄像头流回的端口还是用于其他用途?
如果是后者,我们如何限制用于串流的端口?作为额外信息(如果需要),这是用于设置
port-range
元素属性的属性字典和代码:
rtspsrc
我注意到,当我使用 Wireshark 监控连接到摄像头的 VLC 时,它在传递给摄像头的
props = {
"protocols": "tcp",
"drop-on-latency": True,
"do-retransmission": False,
"latency": 100,
"port-range": "4500-4999",
"buffer-mode": 1,
}
elem = self.gstreamer.ElementFactory.make("rtspsrc", "source")
for name, prop in props.items():
elem.set_property(name, prop)
字符串中包含一个
client_port=58100-58101
子句。当我的应用程序运行时,该子句(指定服务器使用的 RTP 和 RTCP 端口)不存在。无论协议如何,端口限制都存储在元素中,但是,当需要形成 SETUP
消息时,
SETUP
函数将按如下方式构造它(为了可读性而重新格式化):gst_rtspsrc_create_transports_string()
您可以看到,最重要的
if (protocols & GST_RTSP_LOWER_TRANS_UDP) {
GST_DEBUG_OBJECT(src, "adding UDP unicast");
if (add_udp_str) {
g_string_append(result, "/UDP");
}
g_string_append(result, ";unicast;client_port=%%u1-%%u2"); // HERE.
} else if (protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST) {
GST_DEBUG_OBJECT(src, "adding UDP multicast");
if (add_udp_str) {
g_string_append(result, "/UDP");
}
g_string_append(result, ";multicast");
if (src->next_port_num != 0) {
if ((src->client_port_range.max > 0)
&& (src->next_port_num >= src->client_port_range.max)) {
goto no_ports;
}
g_string_append_printf(result, ";client_port=%d-%d", // HERE.
src->next_port_num, src->next_port_num + 1);
}
} else if (protocols & GST_RTSP_LOWER_TRANS_TCP) {
GST_DEBUG_OBJECT(src, "adding TCP");
g_string_append(result, "/TCP;unicast;interleaved=%%i1-%%i2"); // NOT HERE.
}
子句是
仅添加用于 UDP 单播和组播,不是 TCP。 该子句控制 RTSP 服务器应连接到哪些端口以获取返回流量。
所以,虽然我还没有尝试这个(现在是周五深夜),但我怀疑将
client_port=<low>-<high>
属性更改为
protocols
可以解决问题。一旦我测试过就会确认。