New RTPProxy v3.2.0 is out

The media relay that keeps SIP calls flowing.

RTPProxy is a fast, battle-tested RTP proxy for VoIP networks. It handles NAT traversal, bridges IPv4 and IPv6, lets WebRTC clients talk to plain SIP endpoints, and records, forks and injects media on demand. OpenSIPS, Kamailio or Sippy B2BUA drive it over a simple control protocol.

  • 2003in production since
  • BSD-2permissive license
  • Linux & FreeBSDalso macOS & Docker

Capabilities

Everything your media plane needs

One small daemon covers NAT traversal, call recording and WebRTC. Load modules for what you need and leave the rest out.

NAT traversal

Symmetric latching learns each party's real address from the first packet it sends, so calls work through NAT and firewalls without client changes.

WebRTC ready

The dtls_gw and ice_lite modules bridge plain RTP and DTLS-SRTP, answer ICE connectivity checks and multiplex RTCP, so browsers can talk to legacy SIP gear.

Recording & forking

Record sessions to local files or stream copies to remote listeners in real time, a natural fit for SIPREC recorders and live transcription.

Prompts & MOH

Inject pre-encoded announcements and music on hold into live streams, re-frame RTP payloads and detect DTMF digits on the fly.

IPv4 / IPv6 gateway

Bridge media between address families and between any number of labeled interfaces, with separate advertised addresses for NAT-ed deployments.

Observability

Per-session and per-instance counters, RTCP reporting to HEP / Homer collectors and CSV accounting give you full visibility into media quality.

Built to scale

A simple text control protocol over Unix, UDP or TCP sockets lets SIP proxies drive many instances for load balancing and failover, or use RTP Cluster for large deployments.

Embeddable

librtpproxy runs multiple independent instances inside your own process. RTP.io uses it to put the RTPProxy straight into OpenSIPS, and Python applications such as Sippy B2BUA can embed it too.

Battle-tested & open

In production since 2003, continuously fuzzed and tested in CI, and distributed under the permissive two-clause BSD license.

How it works

Signalling stays in your proxy. Media goes through RTPProxy.

  1. 1

    Offer

    When an INVITE arrives, your SIP proxy or B2BUA sends the call-id and the caller's media address to RTPProxy, which allocates a port pair and returns it. The controller rewrites the SDP to point at the proxy.

  2. 2

    Answer

    On the 200 OK, the controller looks up the same session for the callee and rewrites that SDP as well. Both parties now send media to RTPProxy.

  3. 3

    Relay & latch

    RTPProxy relays packets both ways. It latches onto the real source address of each side, so endpoints behind NAT just work. Idle sessions expire automatically.

Get started

Up and running in minutes

Use pre-built packages and container images, or build it from source. Then point your SIP server's rtpproxy module at the control socket.

Read the installation guide

# images on Docker Hub and ghcr.io, updated on every commit
docker run --rm --network host sippylabs/rtpproxy \
    -l 203.0.113.10 -s udp:127.0.0.1:22222

Join the community

Ask questions on the mailing list, report bugs on GitHub, or send a pull request. Contributions are welcome.