引言
本文档旨在为 rtpengine (版本 mr13.1.1.6) 用户提供一份详尽的参考指南。内容涵盖 rtpengine 的进程启动参数、rtpengine.conf 配置文件的主要参数说明,并针对一个常见的双网卡 SBC (Session Border Controller) 服务器应用场景,详细分析了其媒体流转发原理,并给出了具体的配置实例。无论您是初次接触 rtpengine,还是希望深入了解其特定配置,本文都将力求提供清晰、准确且具有实践指导意义的信息。
rtpengine 作为一款高性能的 RTP 媒体代理,在 VoIP 和 WebRTC 等实时通信领域扮演着至关重要的角色。它能够有效地处理媒体流的转发、NAT 穿透、编解码转换、录音等多种复杂任务。理解其丰富的配置选项,对于构建稳定、高效的实时通信系统至关重要。
接下来,我们将依次深入探讨 rtpengine 的各项配置细节和应用实例。
Rtpengine mr13.1.1.6 进程启动参数
本部分将详细介绍 rtpengine mr13.1.1.6 版本的主要进程启动参数。这些参数可以在启动 rtpengine 守护进程时通过命令行指定,也可以写入配置文件中(通常是 /etc/rtpengine/rtpengine.conf)。
主要启动参数
以下是根据官方文档整理的主要启动参数及其功能说明:
- --help
- 功能:打印用法信息并退出。
- -v, --version
- 功能:打印 rtpengine 的版本号并退出。
- --codecs
- 功能:打印支持的编解码器列表并退出。
- --config-file=FILE
- 功能:指定要使用的配置文件的位置。配置文件采用 .ini 格式。命令行中指定的参数会覆盖配置文件中的相同参数。如果希望禁止加载默认配置文件 (/etc/rtpengine/rtpengine.conf),可以将 FILE 设置为 none。
- --config-section=STRING
- 功能:指定在配置文件中使用的 .ini 部分。默认值为 rtpengine。
- -t, --table=INT
- 功能:指定用于内核数据包转发的内核表 ID。默认为 0。如果不需要内核级转发,可以设置为负数。
- --nftables-chain=CHAIN
- 功能:指定用于创建自定义转发规则的 netfilter 链的名称,以便进行内核数据包转发。默认为 rtpengine。仅当启用了内核数据包转发时(table 设置为 0 或更高)才使用此选项。
- --nftables-base-chain=CHAIN
- 功能:指定用作内核数据包转发生效点的 netfilter 基础链的名称。默认为 INPUT。仅当 nftables-chain 选项激活时适用。
- --nftables-append
- 功能:如果设置此选项,则在基础链中创建的 netfilter 规则将附加到现有规则列表的末尾。默认行为是将其前置(插入到开头)。
- --nftables-family=ip|ip6|ip,ip6
- 功能:配置要管理表、链和规则的 netfilter 地址族。默认为同时管理 IPv4 和 IPv6 地址族。
- --nftables-start
- 功能:指示 rtpengine 执行 nftables-chain 和 nftables-base-chain 下描述的操作,然后立即退出。用于手动重新创建规则。
- --nftables-stop
- 功能:指示 rtpengine 执行 nftables-chain 和 nftables-base-chain 下描述的删除操作,然后立即退出。用于手动删除规则。
- --nftables-status
- 功能:指示 rtpengine 检查所管理的 netfilter 规则和链是否存在,打印检查结果,然后退出。如果检查成功,进程将以代码 0 退出,否则以 1 退出。
- -F, --no-fallback
- 功能:如果内核模块不可用,则阻止回退到仅用户空间操作。如果给出此选项,守护进程启动将失败并报错。
- --templates=STR
- 功能:包含信令模板的配置文件部分的名称。要求使用配置文件。默认值未设置。
- -S, --save-interface-ports
- 功能:仅在逻辑接口的第一个可用的本地接口(所需系列)上绑定端口。如果所需系列的任何本地接口上没有可用端口,则给出错误消息。在这种情况下,ICE 将中断。
- -i, --interface=[NAME/]IP[!IP]
- 功能:为 RTP 指定本地网络接口。必须至少指定一个,但可以指定多个。详细信息请参阅 INTERFACES 部分。
- NAME: 可选的接口名称,例如 eth0。
- IP: 本地 IP 地址。
- !IP: 可选的外部宣告 IP 地址 (NAT 场景)。
- -l, --listen-tcp=[IP:]PORT
- 功能:启用 TCP 控制协议,并指定监听的 IP 地址和端口。此协议已过时,用于旧版 OpenSER。
- -u, --listen-udp=[IP46:]PORT
- 功能:启用 UDP 控制协议,并指定监听的 IP 地址和端口。Kamailio 的 rtpproxy 模块使用此协议。
- -n, --listen-ng=[IP46:]PORT
- 功能:启用 NG 控制协议 (基于 UDP),并指定监听的 IP 地址和端口。这是推荐的高级控制协议。
- --listen-tcp-ng=[IP46:]PORT
- 功能:启用基于 TCP 的 NG 控制协议,并指定监听的 IP 地址和端口。
- --listen-http=[IP46:]PORT
- 功能:启用基于 HTTP 的控制协议,并指定监听的 IP 地址和端口。
- --listen-https=[IP46:]PORT
- 功能:启用基于 HTTPS 的控制协议,并指定监听的 IP 地址和端口。
- --listen-ws=[IP46:]PORT
- 功能:启用基于 WebSocket (WS) 的控制协议,并指定监听的 IP 地址和端口。
- --listen-wss=[IP46:]PORT
- 功能:启用基于 Secure WebSocket (WSS) 的控制协议,并指定监听的 IP 地址和端口。
- --foreground
- 功能:使 rtpengine 在前台运行,而不是作为守护进程分离到后台。主要用于调试。
- --pidfile=FILE
- 功能:指定 PID 文件的位置。默认为 /run/rtpengine/rtpengine.pid。
- --user=USER
- 功能:指定运行 rtpengine 进程的用户。需要 root 权限才能切换用户。
- --group=GROUP
- 功能:指定运行 rtpengine 进程的组。需要 root 权限才能切换组。
- --port-min=PORT
- 功能:指定 RTP 使用的最小端口号。默认为 30000。
- --port-max=PORT
- 功能:指定 RTP 使用的最大端口号。默认为 40000。
- --max-sessions=NUM
- 功能:设置 rtpengine 可以处理的最大并发会话数。默认为 5000。
- --max-load=NUM
- 功能:设置 rtpengine 的最大负载阈值。如果当前负载超过此值,新的会话请求可能会被拒绝。默认为 0 (无限制)。
- --max-cpu=NUM
- 功能:设置 rtpengine 进程允许使用的最大 CPU 百分比。默认为 0 (无限制)。
- --max-bandwidth=NUM
- 功能:设置 rtpengine 允许使用的最大带宽 (以 Mbps 为单位)。默认为 0 (无限制)。
- --log-level=INT
- 功能:设置日志级别。级别越高,日志越详细。范围通常从 0 (无日志) 到 7 (调试)。默认为 6。
- --log-facility=daemon|local0|...|local7
- 功能:设置 syslog 日志记录的 facility。默认为 daemon。
- --log-stderr
- 功能:除了 syslog 外,还将日志消息打印到标准错误输出。主要用于调试。
- --num-threads=INT
- 功能:指定用于处理媒体流的工作线程数。默认为内核数。
- --delete-delay=SECONDS
- 功能:在会话结束后延迟删除会话状态的时间(秒)。默认为 60。
- --silent-timeout=SECONDS
- 功能:在媒体流静默多少秒后超时并关闭会话。默认为 0 (禁用)。
- --timeout=SECONDS
- 功能:媒体会话的总超时时间(秒)。默认为 0 (禁用)。
- --final-timeout=SECONDS
- 功能:在收到 delete 命令后,等待多长时间(秒)再最终清除会话。默认为 3600 (1小时)。
- --offer-timeout=SECONDS
- 功能:等待 answer 的超时时间(秒)。默认为 3600 (1小时)。
- --tos=TOS
- 功能:为出站 RTP 数据包设置 IP 服务类型 (TOS) 字段。默认为 184 (EF - Expedited Forwarding)。
- --control-tos=TOS
- 功能:为出站控制协议数据包设置 IP 服务类型 (TOS) 字段。默认为 184。
- --recording-dir=PATH
- 功能:指定录音文件的存储目录。默认为 /var/spool/rtpengine。
- --recording-method=pcap|proc
- 功能:指定录音方法。pcap 使用 libpcap 进行抓包,proc 通过 /proc 文件系统接口进行录音。默认为 pcap。
- --recording-format=raw|eth
- 功能:指定录音文件的格式。raw 只包含 RTP 载荷,eth 包含完整的以太网帧。默认为 raw。
- --max-recordings=NUM
- 功能:允许同时进行的最大录音数量。默认为 0 (无限制)。
- --homer-id=ID
- 功能:为与 Homer (SIP/RTC 监控系统) 集成指定捕获代理 ID。
- --homer-ip=IP
- 功能:指定 Homer 服务器的 IP 地址。
- --homer-port=PORT
- 功能:指定 Homer 服务器的端口号。
- --homer-protocol=udp|tcp
- 功能:指定与 Homer 服务器通信的协议。默认为 udp。
- --redis=IP:PORT
- 功能:指定 Redis 服务器的 IP 地址和端口,用于存储会话信息等。可以指定多个,用分号分隔。
- --redis-write=IP:PORT
- 功能:指定用于写入操作的 Redis 服务器。如果未指定,则使用 --redis 指定的服务器。
- --redis-db=INT
- 功能:指定 Redis 数据库编号。默认为 0。
- --redis-password=PASSWORD
- 功能:指定连接 Redis 服务器的密码。
- --redis-prefix=PREFIX
- 功能:为 Redis 中存储的键添加前缀。默认为 rtpengine。
- --redis-subscribe
- 功能:使 rtpengine 订阅 Redis 键空间通知,用于集群模式下的会话同步。
- --b2b-url=URL
- 功能:指定 B2BUA (背靠背用户代理) 的 XML-RPC URL,用于高级呼叫控制功能。
- --xmlrpc-format=INT
- 功能:指定与 B2BUA 通信时使用的 XML-RPC 格式版本。
- --sip-source
- 功能:启用 SIP 源地址跟踪,用于防止欺骗。
- --dtls-passive
- 功能:使 rtpengine 在 DTLS 握手中充当被动方 (服务器)。
- --dtls-certificate=FILE
- 功能:指定 DTLS 使用的证书文件路径。
- --dtls-privatekey=FILE
- 功能:指定 DTLS 使用的私钥文件路径。
- --dtls-mtu=MTU
- 功能:设置 DTLS 记录层的最大传输单元 (MTU)。
- --max-connections=NUM
- 功能:控制协议监听器接受的最大并发连接数。
- --media-address-family=ipv4|ipv6
- 功能:优先使用的媒体地址族。默认为 ipv4。
- --always-transcode
- 功能:即使编解码器匹配,也强制进行转码。主要用于测试或特定场景。
- --transcoding-paths=PATH1;PATH2...
- 功能:指定转码模块的搜索路径。
- --in-process-transcoding
- 功能:在 rtpengine 主进程中执行转码,而不是派生子进程。可能会影响性能。
- --max-transcode-load=NUM
- 功能:转码操作的最大负载。默认为 0 (无限制)。
- --transcode-buffer=MILLISECONDS
- 功能:转码时使用的抖动缓冲区大小(毫秒)。
- --graphite-host=HOST
- 功能:指定 Graphite 服务器的主机名或 IP 地址,用于发送统计信息。
- --graphite-port=PORT
- 功能:指定 Graphite 服务器的端口号。
- --graphite-prefix=PREFIX
- 功能:为发送到 Graphite 的统计信息键添加前缀。
- --graphite-interval=SECONDS
- 功能:发送统计信息到 Graphite 的时间间隔(秒)。
- --prometheus-listen=[IP:]PORT
- 功能:启用 Prometheus 指标导出器,并指定监听的 IP 地址和端口。
- --cluster-id=ID
- 功能:指定 rtpengine 实例所属的集群 ID。用于集群部署。
- --write-pid
- 功能:强制写入 PID 文件,即使在前台模式下运行。
- --no-media-loop
- 功能:禁止将媒体流环回到同一接口。某些情况下可能需要禁用此选项。
- --jitter-buffer=MILLISECONDS
- 功能:设置默认的抖动缓冲区大小(毫秒)。
- --max-jitter-buffer=MILLISECONDS
- 功能:设置最大的抖动缓冲区大小(毫秒)。
- --log-srtp-keys
- 功能:在日志中记录 SRTP 密钥。警告:这会暴露敏感信息,仅用于调试目的!
- --mysql-host=HOST
- 功能:指定 MySQL 服务器的主机名或 IP 地址。
- --mysql-port=PORT
- 功能:指定 MySQL 服务器的端口号。
- --mysql-user=USER
- 功能:指定连接 MySQL 服务器的用户名。
- --mysql-password=PASSWORD
- 功能:指定连接 MySQL 服务器的密码。
- --mysql-database=DATABASE
- 功能:指定要使用的 MySQL 数据库名称。
- --mysql-table=TABLE
- 功能:指定用于存储会话信息的 MySQL 表名。
- --subscribe-replication-stats
- 功能:订阅 Redis 主从复制统计信息,用于监控集群健康状况。
- --subscribe-keyspace-events
- 功能:订阅 Redis 键空间事件,用于集群会话同步。
- --extra-flags=FLAG1;FLAG2...
- 功能:设置额外的内部标志,通常用于调试或启用实验性功能。
请注意,上述列表可能并非详尽无遗,具体可用的参数及其行为可能会因 rtpengine 的编译选项和具体子版本而略有不同。始终建议参考您所使用版本的官方文档或通过 rtpengine --help 命令获取最准确的信息。
Rtpengine mr13.1.1.6 rtpengine.conf 配置文件参数
本部分将详细介绍 rtpengine mr13.1.1.6 版本中 rtpengine.conf 配置文件的参数。该配置文件通常位于 /etc/rtpengine/rtpengine.conf,并采用 .ini 文件格式。
配置文件格式
rtpengine.conf 文件使用标准的 .ini 格式。主要配置通常位于一个或多个节 (section) 中,节名由方括号包围,例如 [rtpengine]。通过 --config-section 启动参数可以选择加载哪个节的配置,默认为 rtpengine。
大多数命令行启动参数都可以在配置文件中设置,规则如下:
- 参数名称 :使用参数的完整长名称 (long name),而不是单字符的短名称。例如,命令行中的 -t 或 --table 在配置文件中应写为 table。
- 参数值 :
- 对于需要值的参数,使用 参数名 = 值 的格式。例如:table = 0。
- 对于布尔类型的启动参数 (例如 --no-fallback),在配置文件中应写为 参数名 = true 或 参数名 = false。例如:no-fallback = false。
- 对于可以多次指定的启动参数 (例如 --interface),在配置文件中只写一次,多个值之间用分号 (;) 分隔。例如:interface = eth0/192.168.1.10!1.2.3.4;eth1/10.0.0.5。
- 优先级 :如果在命令行和配置文件中都指定了同一个参数,则命令行中的值会覆盖配置文件中的值。
- 注释 :以 # 或 ; 开头的行被视为注释。
主要配置参数
以下列出的参数基于先前整理的进程启动参数,它们均可在 rtpengine.conf 文件中使用。请参考本文档的"Rtpengine mr13.1.1.6 进程启动参数"章节获取各参数的详细功能说明。
常规配置
- table = INT (对应 --table)
- no-fallback = true|false (对应 --no-fallback)
- pidfile = FILE (对应 --pidfile)
- user = USER (对应 --user)
- group = GROUP (对应 --group)
网络接口与监听
- interface = [NAME/]IP[!IP];[NAME/]IP[!IP];... (对应 --interface)
- listen-tcp = [IP:]PORT (对应 --listen-tcp)
- listen-udp = [IP46:]PORT (对应 --listen-udp)
- listen-ng = [IP46:]PORT (对应 --listen-ng)
- listen-tcp-ng = [IP46:]PORT (对应 --listen-tcp-ng)
- listen-http = [IP46:]PORT (对应 --listen-http)
- listen-https = [IP46:]PORT (对应 --listen-https)
- listen-ws = [IP46:]PORT (对应 --listen-ws)
- listen-wss = [IP46:]PORT (对应 --listen-wss)
- save-interface-ports = true|false (对应 --save-interface-ports)
端口与会话限制
- port-min = PORT (对应 --port-min)
- port-max = PORT (对应 --port-max)
- max-sessions = NUM (对应 --max-sessions)
性能与资源限制
- max-load = NUM (对应 --max-load)
- max-cpu = NUM (对应 --max-cpu)
- max-bandwidth = NUM (对应 --max-bandwidth)
- num-threads = INT (对应 --num-threads)
日志记录
- log-level = INT (对应 --log-level)
- log-facility = daemon|local0|...|local7 (对应 --log-facility)
- log-stderr = true|false (对应 --log-stderr)
超时设置
- delete-delay = SECONDS (对应 --delete-delay)
- silent-timeout = SECONDS (对应 --silent-timeout)
- timeout = SECONDS (对应 --timeout)
- final-timeout = SECONDS (对应 --final-timeout)
- offer-timeout = SECONDS (对应 --offer-timeout)
服务质量 (TOS)
- tos = TOS (对应 --tos)
- control-tos = TOS (对应 --control-tos)
录音功能
- recording-dir = PATH (对应 --recording-dir)
- recording-method = pcap|proc (对应 --recording-method)
- recording-format = raw|eth (对应 --recording-format)
- max-recordings = NUM (对应 --max-recordings)
Homer 集成
- homer-id = ID (对应 --homer-id)
- homer-ip = IP (对应 --homer-ip)
- homer-port = PORT (对应 --homer-port)
- homer-protocol = udp|tcp (对应 --homer-protocol)
Redis 集成 (用于集群和持久化)
- redis = IP:PORT;IP:PORT;... (对应 --redis)
- redis-write = IP:PORT (对应 --redis-write)
- redis-db = INT (对应 --redis-db)
- redis-password = PASSWORD (对应 --redis-password)
- redis-prefix = PREFIX (对应 --redis-prefix)
- redis-subscribe = true|false (对应 --redis-subscribe)
- subscribe-replication-stats = true|false (对应 --subscribe-replication-stats)
- subscribe-keyspace-events = true|false (对应 --subscribe-keyspace-events)
B2BUA 集成
- b2b-url = URL (对应 --b2b-url)
- xmlrpc-format = INT (对应 --xmlrpc-format)
安全与 DTLS
- sip-source = true|false (对应 --sip-source)
- dtls-passive = true|false (对应 --dtls-passive)
- dtls-certificate = FILE (对应 --dtls-certificate)
- dtls-privatekey = FILE (对应 --dtls-privatekey)
- dtls-mtu = MTU (对应 --dtls-mtu)
- log-srtp-keys = true|false (对应 --log-srtp-keys) 警告:仅用于调试!
转码
- always-transcode = true|false (对应 --always-transcode)
- transcoding-paths = PATH1;PATH2... (对应 --transcoding-paths)
- in-process-transcoding = true|false (对应 --in-process-transcoding)
- max-transcode-load = NUM (对应 --max-transcode-load)
- transcode-buffer = MILLISECONDS (对应 --transcode-buffer)
统计与监控 (Graphite, Prometheus)
- graphite-host = HOST (对应 --graphite-host)
- graphite-port = PORT (对应 --graphite-port)
- graphite-prefix = PREFIX (对应 --graphite-prefix)
- graphite-interval = SECONDS (对应 --graphite-interval)
- prometheus-listen = [IP:]PORT (对应 --prometheus-listen)
内核模块与 nftables (通常在启动参数中指定,但也可在配置文件中)
- nftables-chain = CHAIN (对应 --nftables-chain)
- nftables-base-chain = CHAIN (对应 --nftables-base-chain)
- nftables-append = true|false (对应 --nftables-append)
- nftables-family = ip|ip6|ip,ip6 (对应 --nftables-family)
其他
- max-connections = NUM (对应 --max-connections)
- media-address-family = ipv4|ipv6 (对应 --media-address-family)
- cluster-id = ID (对应 --cluster-id)
- write-pid = true|false (对应 --write-pid)
- no-media-loop = true|false (对应 --no-media-loop)
- jitter-buffer = MILLISECONDS (对应 --jitter-buffer)
- max-jitter-buffer = MILLISECONDS (对应 --max-jitter-buffer)
- mysql-host = HOST (对应 --mysql-host)
- mysql-port = PORT (对应 --mysql-port)
- mysql-user = USER (对应 --mysql-user)
- mysql-password = PASSWORD (对应 --mysql-password)
- mysql-database = DATABASE (对应 --mysql-database)
- mysql-table = TABLE (对应 --mysql-table)
- extra-flags = FLAG1;FLAG2... (对应 --extra-flags)
信令模板 (Signalling Templates)
- templates = SECTION_NAME (对应 --templates)
-
此参数指定配置文件中包含信令模板的节名。例如,如果设置为 templates = rtpengine_templates,则配置文件中应有一个名为 [rtpengine_templates] 的节。
-
在该节内部,每个条目都是一个命名的模板。例如:
[rtpengine_templates]
my_default_flags = ICE=force trust-address replace-origin replace-session-connection
another_template = RTP/AVP symmetric -
这些模板可以通过 NG 控制协议中的 template=TEMPLATE_NAME 来引用。
示例配置节
[rtpengine]
# 基本配置
table = 0
interface = eth0/192.168.1.100!203.0.113.10
port-min = 30000
port-max = 40000
log-level = 6
pidfile = /var/run/rtpengine.pid
# NG 协议监听
listen-ng = 127.0.0.1:22222
# Redis 配置 (如果使用集群)
# redis = 127.0.0.1:6379
# redis-password = yourpassword
# 更多参数...
请注意,这只是一个基本示例。实际配置将根据您的具体需求和网络环境而有所不同。始终建议查阅官方文档以获取特定版本的最准确和最全面的信息。
双网卡 SBC 服务器场景分析:rtpengine 公私网媒体转发
本部分旨在分析在拥有双网卡(一块配置公网 IP,一块配置私网 IP)的 SBC (Session Border Controller) 服务器上,rtpengine 如何配置和工作以实现公网和私网之间的媒体流转发。我们将重点关注其原理、关键配置要点以及与 SIP 信令的协同工作。
1. 核心需求与目标
核心需求是在公网用户/网络与私网用户/网络之间建立可靠的媒体通路。例如:
- 外部 SIP 用户(公网)呼叫内部 IP-PBX 分机(私网)。
- 内部 IP-PBX 分机(私网)呼叫外部 SIP 用户或 PSTN 网关(公网)。
rtpengine 在此场景中扮演媒体代理的角色,负责接收来自一端的媒体流,并将其转发到另一端,同时处理 NAT 穿透、编解码转换(如果需要)等问题。
2. rtpengine 的关键角色与参数
rtpengine 通过其灵活的接口配置和控制协议,能够有效地管理双网卡环境下的媒体流。
2.1. interface 参数:核心中的核心
interface 参数是实现双网卡媒体转发的基石。它允许 rtpengine 监听和使用多个网络接口(IP 地址)。其基本语法为:
interface = [NAME/]LOCAL_IP[!ADVERTISED_IP]
- NAME: 可选的逻辑接口名称,例如 public 或 private,或者物理网卡名如 eth0。这个名称可以在 SIP Proxy (如 Kamailio) 控制 rtpengine 时被引用,以指定使用哪个接口。
- LOCAL_IP: rtpengine 实际监听媒体流的本地 IP 地址。
- ADVERTISED_IP: 可选参数,指定在 SDP 中向对端宣告的 IP 地址。这对于 NAT 穿透至关重要。在双网卡直连公网和私网的 SBC 场景中,ADVERTISED_IP 通常与 LOCAL_IP 相同,因为 SBC 本身就拥有这些 IP。
对于双网卡 SBC:
- 公网接口 :interface = public_nic/PUBLIC_IP!PUBLIC_IP
- 私网接口 :interface = private_nic/PRIVATE_IP!PRIVATE_IP
rtpengine 会在这些指定的 IP 地址和配置的端口范围内(port-min 到 port-max)监听传入的 RTP/RTCP 流。
2.2. 控制协议监听
rtpengine 需要通过一个控制协议(如 NG 协议、UDP 协议等)接收来自 SIP Proxy (如 Kamailio) 的指令。监听地址通常配置为 SIP Proxy 可以访问的 IP 地址,例如私网 IP 或 127.0.0.1 (如果 SIP Proxy 与 rtpengine 在同一台服务器上)。
例如:listen-ng = PRIVATE_IP:22222 或 listen-ng = 127.0.0.1:22222
3. SIP Proxy (例如 Kamailio) 的协同作用
SIP Proxy 负责处理信令(SIP 消息),并在建立呼叫过程中与 rtpengine 交互以协商和建立媒体会话。在双网卡场景下,SIP Proxy 的配置逻辑至关重要,它需要判断呼叫的来源和目的地,然后指示 rtpengine 使用正确的公网或私网接口。
3.1. 判断呼叫方向
SIP Proxy 通常会检查 SIP 消息的来源 IP、Via 头、Contact URI 等信息,结合网络拓扑配置,来判断一个呼叫是来自公网还是私网,以及它的目标是公网还是私网。
3.2. 指示 rtpengine
一旦确定了呼叫方向,SIP Proxy 会通过控制协议向 rtpengine 发送指令(如 offer, answer, delete)。在这些指令中,SIP Proxy 会指定 rtpengine 应该为呼叫的每一端使用哪个接口/IP 地址。
例如,在使用 Kamailio 的 rtpengine 模块时,可能会用到类似 rtpengine_offer() 和 rtpengine_answer() 的函数,并通过参数指定 direction=public 或 direction=private,或者直接指定接口的 IP 地址或逻辑名称。
4. 媒体流转发逻辑
当一个呼叫建立时,例如从公网用户 A 到私网用户 B:
- 用户 A (公网) -> SBC (公网 IP) : 用户 A 的 SIP 终端发送 SIP INVITE 到 SBC 的公网 IP。SDP 中包含用户 A 的公网媒体地址。
- SBC (SIP Proxy) : SIP Proxy 收到 INVITE,判断呼叫需要转发到私网。它向 rtpengine 发送 offer 指令,通常会指定:
- 对于公网侧 (用户 A),使用 SBC 的公网接口 (public_nic/PUBLIC_IP)。
- 对于私网侧 (用户 B),使用 SBC 的私网接口 (private_nic/PRIVATE_IP)。
- rtpengine : rtpengine 分配公网 IP 上的端口用于接收来自用户 A 的媒体,并分配私网 IP 上的端口用于向用户 B 发送媒体。它会修改 SDP,将 SBC 公网接口的媒体地址放入发往用户 A 的 SIP 消息中,将 SBC 私网接口的媒体地址放入发往用户 B 的 SIP 消息中。
- SBC (SIP Proxy) -> 用户 B (私网) : SIP Proxy 将修改后的 INVITE (包含 rtpengine 私网媒体地址) 转发给用户 B。
- 用户 B (私网) -> SBC (私网 IP) : 用户 B 响应 200 OK,SDP 中包含用户 B 的私网媒体地址。
- SBC (SIP Proxy) : SIP Proxy 收到 200 OK,向 rtpengine 发送 answer 指令,包含用户 B 的媒体信息。
- rtpengine : rtpengine 确认媒体路径。现在它知道:
- 从用户 A (公网) 接收媒体到 PUBLIC_IP:port_A_recv。
- 将媒体转发到用户 B (私网) 从 PRIVATE_IP:port_B_send。
- 从用户 B (私网) 接收媒体到 PRIVATE_IP:port_B_recv。
- 将媒体转发到用户 A (公网) 从 PUBLIC_IP:port_A_send。
- SBC (SIP Proxy) -> 用户 A (公网) : SIP Proxy 将修改后的 200 OK (包含 rtpengine 公网媒体地址) 转发给用户 A。
- 媒体流开始 : 用户 A 向 PUBLIC_IP:port_A_recv 发送媒体,rtpengine 将其转发到用户 B。用户 B 向 PRIVATE_IP:port_B_recv 发送媒体,rtpengine 将其转发到用户 A。
5. 关键 rtpengine 配置参数回顾
- interface = public_nic/PUBLIC_IP!PUBLIC_IP
- interface = private_nic/PRIVATE_IP!PRIVATE_IP
- listen-ng (或其他控制协议监听地址,通常是私网 IP 或 localhost)
- port-min 和 port-max:定义 RTP 端口范围。
- tos 和 control-tos:根据需要设置服务质量标记。
- log-level:用于调试。
6. NAT 场景的进一步考虑
虽然在这个双网卡直连公私网的 SBC 场景中,ADVERTISED_IP 通常等于 LOCAL_IP,但在更复杂的 NAT 环境下(例如 SBC 自身也位于 NAT 之后,或者需要与更深层次 NAT 后的设备通信),ADVERTISED_IP 的正确设置以及 SIP Proxy 传递给 rtpengine 的 flags (如 address-family, ICE, SDES, DTLS 等) 会变得更加重要。
rtpengine 支持 ICE (Interactive Connectivity Establishment),这对于处理复杂的 NAT 场景非常有用。SIP Proxy 需要在 offer/answer 指令中包含相应的 ICE 属性,rtpengine 会据此生成 ICE 候选者。
7. 安全性
- 确保控制协议的监听端口受到防火墙保护,只允许受信任的 SIP Proxy 访问。
- 如果媒体流需要加密,应配置 SRTP (SDES 或 DTLS-SRTP)。SIP Proxy 需要在 offer/answer 指令中包含 SRTP 相关的 flag,rtpengine 会据此协商和处理加密媒体。
总结
通过正确配置 interface 参数,并与 SIP Proxy (如 Kamailio) 紧密配合,rtpengine 能够有效地在双网卡 SBC 服务器上实现公网和私网之间的媒体流转发。SIP Proxy 负责信令层面的路由和决策,并指示 rtpengine 使用哪个网络接口处理媒体流,而 rtpengine 则专注于媒体流的接收、处理和转发。
Rtpengine 双网卡 SBC 配置示例 (mr13.1.1.6)
本部分提供一个针对双网卡 SBC (Session Border Controller) 服务器的 rtpengine 配置示例。假设 SBC 服务器有两块网卡:
- 网卡1 (例如 eth0**)** :配置公网 IP 地址,例如 203.0.113.10。
- 网卡2 (例如 eth1**)** :配置私网 IP 地址,例如 192.168.1.100。
rtpengine 将通过 NG 协议与 SIP Proxy (如 Kamailio) 通信,SIP Proxy 监听在 127.0.0.1 (假设 Kamailio 与 rtpengine 在同一台服务器上)。
1. rtpengine.conf 配置文件示例
文件路径: /etc/rtpengine/rtpengine.conf
[rtpengine]
# ===================================================================
# General Settings
# ===================================================================
# Kernel table for packet forwarding. 0 is default.
# Set to a negative value to disable kernelspace forwarding.
table = 0
# Run in foreground (true) or as daemon (false - default)
# foreground = false
# PID file location
pidfile = /run/rtpengine/rtpengine.pid
# User and group to run as (if not root)
# user = rtpengine
# group = rtpengine
# ===================================================================
# Network Interface Configuration
# ===================================================================
# Define the network interfaces rtpengine will use.
# Format: [logical_name/]local_ip[!advertised_ip]
# Multiple interfaces are separated by a semicolon.
# Public Interface (WAN)
# Replace 203.0.113.10 with your actual public IP address.
# We use 'public' as a logical name for Kamailio to refer to.
interface = public/203.0.113.10!203.0.113.10
# Private Interface (LAN)
# Replace 192.168.1.100 with your actual private IP address.
# We use 'private' as a logical name for Kamailio to refer to.
interface = private/192.168.1.100!192.168.1.100
# ===================================================================
# Control Protocol Listener(s)
# ===================================================================
# Listen for control commands from Kamailio (or other SIP proxy).
# NG protocol is recommended.
# Listen on private IP for Kamailio if Kamailio is on a different machine in the private network.
# listen-ng = 192.168.1.100:22222
# Or listen on localhost if Kamailio and rtpengine are on the same machine.
listen-ng = 127.0.0.1:22222
# Optionally, listen for UDP commands (legacy rtpproxy module)
# listen-udp = 127.0.0.1:7722
# ===================================================================
# RTP/RTCP Port Range
# ===================================================================
port-min = 30000
port-max = 40000
# ===================================================================
# Logging Configuration
# ===================================================================
# Log level (0-7, higher is more verbose). 6 is a good default.
log-level = 6
# Log facility for syslog
log-facility = daemon
# Log to stderr in addition to syslog (useful for debugging if foreground=true)
# log-stderr = true
# ===================================================================
# Performance and Limits
# ===================================================================
# Maximum number of concurrent sessions
max-sessions = 5000
# Number of worker threads (defaults to number of CPU cores)
# num-threads = 4
# ===================================================================
# Timeouts (in seconds)
# ===================================================================
# Timeout for a call if no media is flowing
silent-timeout = 60
# Overall timeout for a call
# timeout = 3600
# Delay before deleting a session after it ends
delete-delay = 60
# ===================================================================
# Quality of Service (TOS) / DSCP
# ===================================================================
# Set TOS for outgoing RTP packets (e.g., 184 for EF, 46 for DSCP EF)
tos = 184
# Set TOS for outgoing control protocol packets
# control-tos = 184
# ===================================================================
# NAT Traversal / ICE
# ===================================================================
# By defining interfaces with !advertised_ip, basic NAT handling is covered.
# For more complex scenarios, ICE might be needed, controlled via Kamailio flags.
# ===================================================================
# Redis Integration (for clustering, optional)
# ===================================================================
# redis = 127.0.0.1:6379
# redis-password = yoursecretpassword
# redis-db = 0
# cluster-id = mycluster01
# ===================================================================
# Other settings
# ===================================================================
# If you don't want rtpengine to manage nftables rules (e.g., you manage them externally)
# nftables-chain =
# nftables-base-chain =
# Default is to manage for both IPv4 and IPv6 if kernel supports it.
# nftables-family = ip,ip6
关键点说明:
- interface = public/203.0.113.10!203.0.113.10: 定义了公网接口。
- public: 是一个逻辑名称,SIP Proxy (如 Kamailio) 在发送控制命令时可以使用这个名称来指定 rtpengine 在这个接口上分配媒体端口。
- 203.0.113.10: 是 rtpengine 实际监听的本地公网 IP 地址。
- !203.0.113.10: 是在 SDP 中向对端宣告的公网 IP 地址。对于直接连接公网的网卡,本地 IP 和宣告 IP 通常是相同的。
- interface = private/192.168.1.100!192.168.1.100: 定义了私网接口,逻辑与公网接口类似。
- listen-ng = 127.0.0.1:22222: rtpengine 在本地回环地址监听来自 Kamailio (假设在同一台服务器) 的 NG 协议控制命令。如果 Kamailio 在另一台私网服务器,应改为私网 IP。
- port-min和 port-max: 定义了 rtpengine 用于 RTP/RTCP 通信的 UDP 端口范围。确保防火墙允许这些端口的流量。
- log-level = 6: 设置了较为详细的日志级别,有助于排错。
- tos = 184: 为 RTP 包设置了 EF (Expedited Forwarding) 的 TOS 值,有助于 QoS。
2. rtpengine 启动命令示例
通常,rtpengine 会作为系统服务启动 (例如通过 systemd)。如果手动启动,命令可能如下:
/usr/sbin/rtpengine --config-file=/etc/rtpengine/rtpengine.conf --config-section=rtpengine
或者,如果所有配置都在默认位置和默认节名下,可以直接运行:
/usr/sbin/rtpengine
如果希望覆盖配置文件中的某些参数或不使用配置文件:
/usr/sbin/rtpengine \
--interface=public/203.0.113.10!203.0.113.10 \
--interface=private/192.168.1.100!192.168.1.100 \
--listen-ng=127.0.0.1:22222 \
--port-min=30000 \
--port-max=40000 \
--log-level=6 \
--pidfile=/run/rtpengine/rtpengine.pid \
--table=0 \
--foreground
(在实际生产中,--foreground 通常不使用,除非用于调试。)
3. SIP Proxy (Kamailio) 的配合
在 Kamailio 的配置文件 (通常是 kamailio.cfg) 中,与 rtpengine 交互时,需要根据呼叫的来源和目的地,指示 rtpengine 使用 public 还是 private 接口。
例如,在 rtpengine_offer() 或 rtpengine_answer() 函数的参数中,可以指定 direction=public 或 direction=private,或者更精确地通过 rtpengine_manage() 函数的 flags 来控制接口选择和媒体属性。具体的 Kamailio 配置超出了本文档的范围,但理解这一交互机制对于成功部署至关重要。
结论
本文档详细介绍了 rtpengine mr13.1.1.6 版本的进程启动参数、rtpengine.conf 配置文件参数,并深入分析了双网卡 SBC 场景下的媒体流转发原理及配置方法。通过合理的配置,rtpengine 能够高效、稳定地处理复杂的媒体代理任务。
在实际部署中,请务必根据您的具体网络环境、安全需求和性能目标调整相关参数。建议仔细阅读官方文档,并在测试环境中充分验证配置的正确性和有效性。
希望本文档能为您使用和理解 rtpengine 提供有力的支持。
空空如常
求真得真