Unpack to patch-o-matic-ng directory and pom2patch utility.


kernel module, rtp sessions, sockopt interface for session manipulation, statistics

1) compile kernel module

  make modules_install install

2) load module

  su -
  modprobe -i xt_RTPPROXY

3) list if module loaded


4) check kernel log in case or problem


extensions for iptables, connecting to .ko using control socket, requires root but rights may be limited by capabilities (CAP_NET_ADMIN,CAP_NET_RAW). See iptrtpproxy.8 manpages

Library provides API fow RTP session manipulation.

1) compile

2) prepare iptables

# define IP
export RTP_IP=
export RTP_PORT=50000

# in case of non standard iptables libraries location export IPTABLES_LIB_DIR=pwd/extensions

# define switchboard as custom mangle chain #define new _mangle_ chain called my_rtpproxy iptables -t mangle -N my_rtpproxy

# identify switchboard, target is RTPPROXY # we must define ip,port and max.number off sessions # if RTPPROXY does not matches udp protocol and switchboard then chain # continues iptables -t mangle -A my_rtpproxy -j RTPPROXY --addr-a $RTP_IP --port-a $RTP_PORT --max-sess 250 -p udp

# specify conditions to call custom chain, -p udp, address, port # we must call chain in PREROUTING, POSTROUTING and OUTPUT # prerouting changes destination address for proxied ports (RTP) iptables -t mangle -A PREROUTING -j my_rtpproxy # change source address, replies goes back through it iptables -t mangle -A POSTROUTING -j my_rtpproxy # do it also for locally generated/targeted packetes # non necessary when RTP client is not allowed proxy machine, it's probable iptables -t mangle -A OUTPUT -j my_rtpproxy iptables -t mangle -A INPUT -j my_rtpproxy

# list mangle chains iptables -t mangle -L

# enable UDP forwarding iptables -I FORWARD 1 -j ACCEPT -p udp # if local RTP client allowed iptables -I INPUT 1 -j ACCEPT -p udp echo "1"> /proc/sys/net/ipv4/ip_forward


utility for RTP session manipulation from command line, uses lib_RTPPROXY, root required. Real SIP router should implement session manipulation (alloc, update, delete) using libipt_RTPPROXY library.

Example related to Alice-Bob call.

# get confing info, uptime, num of switchboards, etc.
iptrtpproxy info

iptrtpproxy list --list-switchboard

# allocate session for Alice iptrtpproxy alloc --addr-a $RTP_IP --port-a $RTP_PORT --rtp-learning-timeout-a 10000 --rtp-addr-a --rtp-port-a 10000 --rtcp-addr-a --rtcp-port-a 10001 # we'll get sess_id (=0 for first session) and allocated RTP proxy ports (50000&50500)

# update Bob's address iptrtpproxy update --addr-a $RTP_IP --port-a $RTP_PORT --sess-id-lo 0 --rtp-addr-b --rtp-port-b 20000 --rtcp-addr-b --rtcp-port-b 20001

# update Alices's NATed address iptrtpproxy update --addr-a $RTP_IP --port-a $RTP_PORT --sess-id-lo 0 --rtp-addr-a --rtp-port-a 30000 --rtcp-addr-a --rtcp-port-a 35000

# delete session iptrtpproxy delete --addr-a $RTP_IP --port-a $RTP_PORT --sess-id-lo 0

# get statistics iptrtpproxy list

RTP client

netcat for testing purposes

# enable INPUT udp packets
iptables -I INPUT 1 -j ACCEPT -p udp

# netcat RTP clients # Alice nc -u -s -p 10000 50000 # Bob nc -u -s -p 20000 50500