译自这里:
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日
目录
- 简介
- 什么是 RTPProxy
- 开发背景
- 功能特性
- 工作原理
- 软件包内容
- RTPProxy 安装
- 预编译包安装
- 源码编译
- 快速上手
- 配置
- 命令行参数
- 配置文件
- 启动脚本
- 日志配置
- 控制套接字配置(基于 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 监听器录制。
工作原理
- SIP 代理收到 INVITE 请求后,从中提取呼叫 ID,通过 Unix 域套接字发送给 RTPProxy。RTPProxy 查找对应会话:存在则返回会话 UDP 端口;不存在则新建会话,从启动时指定端口段分配首个空闲端口并返回给 SIP 代理。
- SIP 代理(Sippy B2BUA、OpenSIPS 或 Kamailio)收到应答后,替换 SDP 中的媒体 IP:端口指向 RTPProxy,再按常规转发请求。
- 收到携带 SDP 的成功 SIP 应答时,SIP 代理再次提取呼叫 ID 并发送给 RTPProxy。此时 RTPProxy 不新建会话,仅查询已有会话:找到则返回端口,未找到则返回错误码。
- SIP 代理收到成功应答后,替换应答 SDP 中的媒体 IP:端口指向 RTPProxy,再按常规转发应答。
- 会话创建后,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 阶段自动检测并启用对应功能,各依赖及影响如下:
bcg729:为多个工具启用 G.729 支持
地址:https://linphone.org/releases/sources/bcg729/
影响二进制:extractaudio、makeannlibsndfile:支持将解码音频保存为多种常用格式,而非仅原始16位有符号线性格式
地址:http://www.mega-nerd.com/libsndfile/files/
影响二进制:extractaudiolibg722:为多个工具启用 G.722 支持
地址:https://github.com/sippy/libg722
影响二进制:extractaudio、makeannlibsrtp:支持解码 SRTP 流录制文件
地址:https://github.com/cisco/libsrtp.git
影响二进制:extractaudiolibsystemd-dev:实现与 systemd 深度集成[1]
地址:libsystemd@github
影响二进制:rtpproxylibelperiodic:自动化测试框架内部工具必需,需同时安装共享库与 Python 模块,未安装则make check失败
地址:https://github.com/sobomax/libelperiodic.git
影响工具:rtpp_notify_client.py、rtpp_query.py、getmonotime.pytcpdump:测试框架抓包与验证 PCAP 解码必需,未安装则make check失败
地址:http://www.tcpdump.org/release/sudo:测试框架高权限运行tcpdump必需,未安装则make check失败
地址:http://www.sudo.ws/
重要
编译需满足编译器版本要求:
- GCC ≥ 5.0
- 或 Clang ≥ 6.0
源码编译步骤
-
从 Git master 分支拉取最新稳定版(通常存放至
/usr/src/):bashcd /usr/src git clone -b master https://github.com/sippy/rtpproxy.git -
初始化并更新子模块:
bashgit -C rtpproxy submodule update --init --recursive -
普通用户编译安装:
bashcd rtpproxy ./configure make clean all make install -
开发者可添加测试步骤(需提前安装
libelperiodic、sudo、tcpdump):bashcd 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 参数:
-
设置监听 IP(默认
0.0.0.0):-l 0.0.0.0 -
设置文件描述符上限(经验值:每个完整会话需4个描述符,含2个 RTP、2个 RTCP):
-L 4096重要
数值需匹配并发会话负载,不宜过高,避免超出系统内核限制导致初始化失败。
-
设置 UDP 端口范围:
-m <最小值> -M <最大值>示例:
-m 10000 -M 40000 -
调整日志级别:
-d INFO:<日志设施编号>示例:
-d INFO:LOG_LOCAL5、-d DBUG:LOG_LOCAL5
systemd 控制套接字优势
systemd 可为 rtpproxy 创建持久控制套接字:
- rtpproxy 异常宕机时,OpenSIPS/Kamailio 等远程守护进程不会丢失控制文件描述符连接,避免连接丢失类错误(仍可能出现超时错误,但影响远小于连接完全断开)。
- rtpproxy 宕机期间的控制命令会被 systemd 缓冲,服务恢复后自动重放执行。
配置参考:配置章节 → 5. 控制套接字配置。
服务部署与管理命令
-
复制服务文件至系统目录:
bashcp rtpproxy.service /lib/systemd/system/ -
重载 systemd 配置:
bashsudo systemctl daemon-reload -
设置开机自启:
bashsudo 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 稳定运行的关键,合理配置可支持数天甚至数周后的问题回溯分析。配置需考虑:
- 日志存储容量
- 问题上报与响应周期
- 日志详细程度(开发/测试/生产区分)
- 数据合规与法规要求
独立文件日志配置
-
创建日志文件并授权:
bashtouch /var/log/rtpproxy.log chown rtpproxy:rtpproxy /var/log/rtpproxy.log -
配置 rsyslog 规则并重启服务:
bashvim /etc/rsyslog.d/50-default.conf # 添加:local5.* /var/log/rtpproxy.log systemctl restart rsyslog.service -
配置日志轮转:
bashvim /etc/logrotate.d/rtpproxy内容:
/var/log/rtpproxy.log { missingok compress delaycompress notifempty copytruncate rotate 5 daily } -
启动参数添加日志配置:
-d INFO:LOG_LOCAL5 -
重载 systemd 并重启服务:
bashsystemctl daemon-reload systemctl restart rtpproxy.service
控制套接字配置(基于 systemd)
配置步骤
-
安装依赖:
libsystemd-dev -
带 systemd 支持编译:
bash./configure --enable-systemd -
创建
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 -
服务文件启动参数指定套接字类型:
-s systemd:示例:
bashExecStart=/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 -
重载配置并启用套接字单元:
bashsudo systemctl daemon-reload sudo systemctl enable rtpproxy.socket -
依次启动套接字与服务:
bashsudo systemctl start rtpproxy.socket sudo systemctl start rtpproxy.service
完成后,rtpproxy 会接管 systemd 创建的套接字并正常运行,出现错误请核对上述步骤。
systemd 套接字单元配置参考:http://0pointer.de/blog/projects/socket-activation.html