我们可以限制 GStreamer rtspsrc 元素的客户端端口范围吗?

问题描述 投票:0回答:1

我们正在严格控制的网络环境(生产中)中工作,我们需要锁定用于某些事物的端口。

我们目前需要向某些摄像机打开 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


python-3.x rtsp gstreamer-1.0 python-gstreamer
1个回答
0
投票

我注意到,当我使用 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
可以解决问题。一旦我测试过就会确认。
    

© www.soinside.com 2019 - 2024. All rights reserved.