RTPProxy 2.2 用户手册

译自这里:
https://www.rtpproxy.org/doc/master/user_manual.html#MAKESRC

RTPProxy 2.2 手册

马克西姆·索博列夫(Maksym Sobolyev)

Sippy 实验室
sobomax@gmail.com

多纳特·泽尼切夫(Donat Zenichev)

版权所有 © 2006‑2019 马克西姆·索博列夫 sobomax@gmail.com

版权所有 © 2019 多纳特·泽尼切夫

版权所有 © 2006 扬·亚纳克(Jan Janak)janakj@users.berlios.de

2019年5月30日


目录

  1. 简介
    • 什么是 RTPProxy
    • 开发背景
    • 功能特性
    • 工作原理
    • 软件包内容
  2. RTPProxy 安装
    • 预编译包安装
    • 源码编译
  3. 快速上手
  4. 配置
    • 命令行参数
    • 配置文件
    • 启动脚本
    • 日志配置
    • 控制套接字配置(基于 systemd)

第1章 简介

目录

  • 什么是 RTPProxy
  • 开发背景
  • 功能特性
  • 工作原理
  • 软件包内容

什么是 RTPProxy

RTPProxy 是一款高性能 RTP 流软件代理,可与 Sippy B2BUA、Kamailio、OpenSIPS、SER(SIP Express Router)协同工作。

说明

当前最新稳定版本为:RTPProxy 2.2

开发背景

RTPProxy 最初由马克西姆·索博列夫于2003年开发,用于协助位于 NAT 或防火墙后的 SIP 用户代理收发 VoIP 通话。当时,位于 NAT 后的用户之间往往无法直接端到端通信。RTPProxy 配合 SIP 代理,作为 RTP 流的中转节点,解决了这一障碍。

此后,RTPProxy 被 VoIP 服务商广泛用于网络流量优化。后续实践中,该软件的更多用途被发掘:配合信令节点(SIP 代理或 SIP B2BUA)构建复杂 VoIP 网络、优化流量、采集语音质量数据等。

目前 RTPProxy 由 Sippy Software, Inc. 持续开发维护,代码托管于 Sippy Labs GitHub:

https://github.com/sippy/rtpproxy

多年来,Vonage、SipPulse、Voicenter、RateTel 等机构与个人通过代码提交或赞助开发等方式为项目贡献了大量功能与修复。

功能特性

RTPProxy 最初面向 NAT 穿透场景设计,同时可作为通用媒体中继、IPv4/IPv6 网络间 RTP 会话网关。

它可对 RTP 流执行多种附加处理:通话录音、播放预录提示音、实时流复制、RTP 载荷重封装等。

RTPProxy 支持远程控制等高级特性,可构建可扩展的分布式 SIP VoIP 网络。SIP Express Router(现衍生为 OpenSIPS、Kamailio)内置的 nathelper 模块及 Sippy B2BUA 支持多台远程 RTPProxy 实例部署,实现容错与负载均衡。

借助 RTP Cluster 中间件,可实现大容量集群与高级负载均衡。

软件还支持背景音乐/预录提示注入、视频中继、RTP 会话本地文件/远程 UDP 监听器录制。

工作原理

  1. SIP 代理收到 INVITE 请求后,从中提取呼叫 ID,通过 Unix 域套接字发送给 RTPProxy。RTPProxy 查找对应会话:存在则返回会话 UDP 端口;不存在则新建会话,从启动时指定端口段分配首个空闲端口并返回给 SIP 代理。
  2. SIP 代理(Sippy B2BUA、OpenSIPS 或 Kamailio)收到应答后,替换 SDP 中的媒体 IP:端口指向 RTPProxy,再按常规转发请求。
  3. 收到携带 SDP 的成功 SIP 应答时,SIP 代理再次提取呼叫 ID 并发送给 RTPProxy。此时 RTPProxy 不新建会话,仅查询已有会话:找到则返回端口,未找到则返回错误码。
  4. SIP 代理收到成功应答后,替换应答 SDP 中的媒体 IP:端口指向 RTPProxy,再按常规转发应答。
  5. 会话创建后,RTPProxy 在分配端口监听,等待通话双方各发送至少一个 UDP 包。收到包后,用源 IP:端口填充对应结构;双方结构填充完成后,开始在通话双方间转发 UDP 包。

重要

RTPProxy 的一大优势是跟踪每个会话的空闲时长(无包转发时长),空闲超时超过命令行指定值(默认60秒)时自动清理会话。

软件包内容

RTPProxy 软件包默认包含以下组件:

  • rtpproxy:主 RTP 代理服务二进制文件(生产版)
  • rtpproxy_debug:主 RTP 代理服务二进制文件(调试与性能分析版)
  • makeann:提示音与公告预编码工具(生产版)
  • makeann_debug:提示音与公告预编码工具(调试与性能分析版)
  • extractaudio:录制会话转普通音频文件工具(生产版)
  • extractaudio_debug:录制会话转普通音频文件工具(调试与性能分析版)

第2章 RTPProxy 安装

目录

  • 预编译包安装
  • 源码编译

预编译包安装

使用系统包管理器安装预编译 RTPProxy 包:

  • dpkg:Debian 系列系统(含 Ubuntu)安装 .deb
  • apt-get / aptitude:Debian 系列系统(含 Ubuntu)从仓库安装
  • rpm:CentOS 安装 .rpm
  • pkg:FreeBSD 从仓库或包文件安装

如需源码编译,参考下一节源码编译

源码编译

依赖安装

RTPProxy 包含多个可选依赖,在 configure 阶段自动检测并启用对应功能,各依赖及影响如下:

重要

编译需满足编译器版本要求:

  • GCC ≥ 5.0
  • 或 Clang ≥ 6.0
源码编译步骤
  1. 从 Git master 分支拉取最新稳定版(通常存放至 /usr/src/):

    bash 复制代码
    cd /usr/src
    git clone -b master https://github.com/sippy/rtpproxy.git
  2. 初始化并更新子模块:

    bash 复制代码
    git -C rtpproxy submodule update --init --recursive
  3. 普通用户编译安装:

    bash 复制代码
    cd rtpproxy
    ./configure
    make clean all
    make install
  4. 开发者可添加测试步骤(需提前安装 libelperiodicsudotcpdump):

    bash 复制代码
    cd rtpproxy
    ./configure
    make clean all
    make check
    make install

编译成功后生成以下二进制文件:

  • 生产版主程序:/usr/local/bin/rtpproxy,可执行 /usr/local/bin/rtpproxy -V 查看版本
  • 调试与性能分析版主程序:/usr/local/bin/rtpproxy_debug

[1] 编译需添加 --enable-systemd 参数启用,详情见启用 systemd 支持章节。


第3章 快速上手

推荐通过服务管理器(如 systemd)管理 RTPProxy 启动与运行。

systemd 是多数类 UNIX 系统的主流服务管理器:

  • Ubuntu 15.04 起默认使用
  • Debian 8(Jessie)起默认使用
  • Red Hat 系列(RHEL 7、CentOS 7、Fedora 15+)默认使用
  • OpenSUSE、Mint、Mageia 等发行版均默认采用

不支持 systemd 的系统可使用其他服务管理器(如 Debian 8 前的 init.d 脚本)。

init.d 启停脚本示例地址:https://link.here.com(待补充)

systemd 核心优势

  • 支持独立环境文件定义参数,在 ExecStart= 中以变量引用
  • 支持 OnFailure= 故障响应(如发送通知)
  • 支持 ExecStartPre= 启动前预处理(如创建 /var/run/rtpproxy 目录并授权)
  • 支持 ExecStopPost= 停止后清理(如删除 /var/run/rtpproxy 目录)
  • 支持异常退出策略(如 Restart=always 自动重启)
  • 支持重启间隔配置(RestartSec=5
  • 灵活日志配置(SyslogIdentifier=StandardOutput=StandardError=
  • 指定运行用户/用户组
  • 更多高级管理能力

RTPProxy systemd 服务文件示例:systemd 配置文件示例 → systemd 服务文件示例

下载服务文件后调整 OPTIONS 参数:

  1. 设置监听 IP(默认 0.0.0.0):

    复制代码
    -l 0.0.0.0
  2. 设置文件描述符上限(经验值:每个完整会话需4个描述符,含2个 RTP、2个 RTCP):

    复制代码
    -L 4096

    重要

    数值需匹配并发会话负载,不宜过高,避免超出系统内核限制导致初始化失败。

  3. 设置 UDP 端口范围:

    复制代码
    -m <最小值> -M <最大值>

    示例:-m 10000 -M 40000

  4. 调整日志级别:

    复制代码
    -d INFO:<日志设施编号>

    示例:-d INFO:LOG_LOCAL5-d DBUG:LOG_LOCAL5

systemd 控制套接字优势

systemd 可为 rtpproxy 创建持久控制套接字

  • rtpproxy 异常宕机时,OpenSIPS/Kamailio 等远程守护进程不会丢失控制文件描述符连接,避免连接丢失类错误(仍可能出现超时错误,但影响远小于连接完全断开)。
  • rtpproxy 宕机期间的控制命令会被 systemd 缓冲,服务恢复后自动重放执行。

配置参考:配置章节 → 5. 控制套接字配置

服务部署与管理命令

  1. 复制服务文件至系统目录:

    bash 复制代码
    cp rtpproxy.service /lib/systemd/system/
  2. 重载 systemd 配置:

    bash 复制代码
    sudo systemctl daemon-reload
  3. 设置开机自启:

    bash 复制代码
    sudo systemctl enable rtpproxy.service
常用服务管理命令
  • 启动服务:sudo systemctl start rtpproxy.service
  • 停止服务:sudo systemctl stop rtpproxy.service
  • 重启服务:sudo systemctl restart rtpproxy.service
  • 查看状态:sudo systemctl status rtpproxy.service
  • 查看配置:sudo systemctl show rtpproxy.service
日志查看命令
  • 查看实时日志:sudo journalctl -xe -u rtpproxy.service
  • 独立日志文件配置参考:配置章节 → 独立文件日志
  • 状态页日志:sudo systemctl status rtpproxy.service

重要

SIP 代理与 RTPProxy 通过以下套接字交互:

  • rtpproxy.sock:RTPProxy 创建的控制套接字
  • rtpproxy_timeout.sock:SIP 代理创建的超时通知套接字

第4章 配置

目录

  • 命令行参数
  • 配置文件
  • 启动脚本
  • 日志配置
  • 控制套接字配置(基于 systemd)

RTPProxy 传统配置方式为命令行参数,2.2 版本起部分高级参数(如可加载模块配置)迁移至配置文件。

命令行参数

语法概要
bash 复制代码
rtpproxy [-?] [-2] [-f] [-v] [-V] [-R] [-l addr1[/addr2]] [-6 addr1[/addr2]] [-s ctrl_socket] [-t tos] [-p pidfile] [-T max_ttl] [-r rdir [-S sdir]] [-L nofile_limit] [-A advaddr1[/advaddr2]] [-m min_port] [-M max_port] [-u uname[:gname]] [-w sock_mode] [-F] [-i] [-n timeout_socket] [-P] [-a] [-d log_level[:log_facility]] [-W setup_ttl] [--force_asymmetric]
参数说明
参数 功能
-? 显示参数帮助摘要
-2 低码率编码会话中,小于128字节的 RTP 包重复发送两次,提升丢包链路音质
-f 前台运行模式
-V 显示程序版本
-v 显示支持的 rtpp 命令协议版本
-l addr1[/addr2] IPv4 监听地址,单地址/双地址桥接模式
-6 addr1[/addr2] IPv6 监听地址,单地址/双地址桥接模式
-s ctrl_socket 控制套接字,格式 <类型>:<地址>,支持 udp/udp6/tcp/tcp6/unix/cunix,默认 unix:/var/run/rtpproxy.sock
-t tos 设置出站 IP 报头服务类型,默认 0xB8-1 禁用
-r rec_dir RTP 会话录制保存目录
-S spool_dir RTP 流录制缓冲目录,会话结束后移至 -r 指定目录
-R 录制 RTP 时不录制 RTCP(默认同步录制)
-p pid_file PID 文件路径,默认 /var/run/rtpproxy.pid
-T max_ttl RTP 空闲超时,默认60秒
-L nofile_limit 进程最大文件描述符数
-A advaddr1[/advaddr2] 对外宣告地址,适用于 NAT 后部署场景
-m min_port RTP/RTCP 端口下限,默认35000
-M max_port RTP/RTCP 端口上限,默认65000
-u uname[:gname] 运行用户/用户组
-w sock_mode Unix 控制套接字权限
-F 禁用 root 运行安全检查
-i 独立 RTP 活动超时模式,单端口无包即超时
-n timeout_socket 超时通知套接字,支持 unix/tcp,可多配置
-P 采用 libpcap 格式录制会话
-a 无条件录制所有经过的会话
-d log_level[:log_facility] 日志级别(DBUG/INFO/WARN/ERR/CRIT)与系统日志设施
--force_asymmetric 强制所有会话为非对称模式,禁用 NAT 穿透功能

配置文件

待补充

启动脚本

启动集成方式与操作系统版本强相关,预编译包通常自带适配脚本,推荐直接使用。

包维护者或系统构建者可参考以下通用指南。

基于 systemd 的系统

推荐使用 systemd 管理 RTPProxy,示例服务文件:

ini 复制代码
[Unit]
Description=RTPProxy media server
After=network.target
Requires=network.target

[Service]
Type=simple
PIDFile=/var/run/rtpproxy/rtpproxy.pid
Environment='OPTIONS= -f -L 4096 -l 0.0.0.0 -m 10000 -M 20000 -d INFO:LOG_LOCAL5'

Restart=always
RestartSec=5

ExecStartPre=-/bin/mkdir /var/run/rtpproxy
ExecStartPre=-/bin/chown rtpproxy:rtpproxy /var/run/rtpproxy

ExecStart=/usr/local/bin/rtpproxy -p /var/run/rtpproxy/rtpproxy.pid -s unix:/var/run/rtpproxy/rtpproxy.sock \
 -u rtpproxy rtpproxy -n unix:/var/run/rtpproxy/rtpproxy_timeout.sock $OPTIONS
ExecStop=/usr/bin/pkill -F /var/run/rtpproxy/rtpproxy.pid

ExecStopPost=-/bin/rm -R /var/run/rtpproxy

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rtpproxy
SyslogFacility=local5

TimeoutStartSec=10
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target

日志配置

日志是 RTPProxy 稳定运行的关键,合理配置可支持数天甚至数周后的问题回溯分析。配置需考虑:

  • 日志存储容量
  • 问题上报与响应周期
  • 日志详细程度(开发/测试/生产区分)
  • 数据合规与法规要求
独立文件日志配置
  1. 创建日志文件并授权:

    bash 复制代码
    touch /var/log/rtpproxy.log
    chown rtpproxy:rtpproxy /var/log/rtpproxy.log
  2. 配置 rsyslog 规则并重启服务:

    bash 复制代码
    vim /etc/rsyslog.d/50-default.conf
    # 添加:local5.*        /var/log/rtpproxy.log
    systemctl restart rsyslog.service
  3. 配置日志轮转:

    bash 复制代码
    vim /etc/logrotate.d/rtpproxy

    内容:

    复制代码
    /var/log/rtpproxy.log {
      missingok
      compress
      delaycompress
      notifempty
      copytruncate
      rotate 5
      daily
    }
  4. 启动参数添加日志配置:

    复制代码
    -d INFO:LOG_LOCAL5
  5. 重载 systemd 并重启服务:

    bash 复制代码
    systemctl daemon-reload
    systemctl restart rtpproxy.service

控制套接字配置(基于 systemd)

配置步骤
  1. 安装依赖:libsystemd-dev

  2. 带 systemd 支持编译:

    bash 复制代码
    ./configure --enable-systemd
  3. 创建 rtpproxy.socket 单元文件(推荐存放至 /lib/systemd/system/sockets.target.wants/ 并创建软链接):

    ini 复制代码
    [Socket]
    ListenStream=/var/run/rtpproxy/rtpproxy.sock
    SocketUser=rtpproxy
    SocketGroup=rtpproxy
    SocketMode=755
    ExecStartPost=-/bin/chown rtpproxy:rtpproxy /var/run/rtpproxy
    
    [Install]
    WantedBy=sockets.target
  4. 服务文件启动参数指定套接字类型:

    复制代码
    -s systemd:

    示例:

    bash 复制代码
    ExecStart=/usr/local/bin/rtpproxy -p /var/run/rtpproxy/rtpproxy.pid -s systemd: -u rtpproxy:rtpproxy -n unix:/var/run/rtpproxy/rtpproxy_timeout.sock -f -l 0.0.0.0 -m 10000 -M 20000 -d INFO:LOG_DAEMON
  5. 重载配置并启用套接字单元:

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl enable rtpproxy.socket
  6. 依次启动套接字与服务:

    bash 复制代码
    sudo systemctl start rtpproxy.socket
    sudo systemctl start rtpproxy.service

完成后,rtpproxy 会接管 systemd 创建的套接字并正常运行,出现错误请核对上述步骤。

systemd 套接字单元配置参考:http://0pointer.de/blog/projects/socket-activation.html

相关推荐
xixixi7777716 小时前
今日 AI 、通信、安全前沿日报(2026 年 2 月 5 日,星期四)
人工智能·网络安全·ai·信息安全·大模型·通信·前沿
无名38717 小时前
高吞吐与性能优化:Kamailio调优指南
通信
xixixi777771 天前
今日 AI 、通信、安全行业前沿日报(2026 年 2 月 4 日,星期三)
大数据·人工智能·安全·ai·大模型·通信·卫星通信
无名3872 天前
测试 kamailio v6.0.5 的 nats 模块(预处理)
通信
Trouvaille ~2 天前
【Linux】网络编程基础(二):数据封装与网络传输流程
linux·运维·服务器·网络·c++·tcp/ip·通信
百锦再3 天前
《C#上位机开发从门外到门内》2-7:网络通信(TCP/IP、UDP)
tcp/ip·udp·c#·嵌入式·上位机·通信·下位机
一路向北⁢3 天前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(一)
java·spring boot·后端·sse·通信
一路向北⁢4 天前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(二)
java·数据库·spring boot·sse·通信
【 STM32开发 】4 天前
【STM32 + CubeMX】 CAN 通信
stm32·cubemx·can·hal·通信·f407