Installare RTPengine su CentOS/RHEL 7

Guida completa per l’installazione di RTPengine su un server CentOS 7 o RHEL 7

Cos’è RTPengine e a cosa serve

RTPengine è un proxy per il traffico RTP, in genere usato con un SIP Proxy (es. Kamailio) per disacoppiare lo stream audio (RTP appunto) tra un chiamante ed un chiamato, utile ad esempio in scenari in cui il chiamante si trovi su una rete pubblica mentre il chiamato sia confinato all’interno di una subnet privata.

Aggiornare il sistema ed installare il kernel più recente

	yum update
	yum install kernel-devel
	yum update kernel
	reboot

Installare iptables

	systemctl stop firewalld
	systemctl disable firewalld
	yum install iptables-services iptables-devel
	systemctl enable iptables.service
	systemctl start iptables.service
	iptables -F
	service iptables save

Controllare che il servizio iptables sia up & running

	systemctl status iptables.service

Installare i pacchetti Linux necessari per compilare RTPengine

Qui occorre fare una prima precisazione, perchè alcuni dei pacchetti necessari appartengono al repository EPEL (Extra Packages Enterprise Linux) e le modalità di installazione del repository sono diverse tra RHEL e CentOS (https://docs.fedoraproject.org/en-US/epel/#_el7).

EPEL su CentOS

	yum install epel-release

EPEL su RedHat

	subscription-manager repos --enable rhel-*-optional-rpms \
							  --enable rhel-*-extras-rpms \
							  --enable rhel-ha-for-rhel-*-server-rpms
	yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Setup dei pacchetti

	yum install glib glib-devel gcc zlib zlib-devel openssl openssl-devel pcre pcre-devel libcurl libcurl-devel xmlrpc-c xmlrpc-c-devel wget
	yum install libevent-devel glib2-devel json-c-devel json-glib json-glib-devel gperf libpcap-devel git perl-IPC-Cmd libiptcdata-devel libiptcdata-devel hiredis hiredis-devel redis iptables-devel libwebsockets-devel
	yum install spandsp spandsp-devel

Installare FFmpeg

Qui c’è una seconda precisazione da fare, perchè le versioni degli rpm cambiano nel tempo, pertanto è opportuno controllare la versione rilaciata di FFmpeg al link https://download1.rpmfusion.org/free/el/updates/7/x86_64/f/.

	rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
	yum install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
	yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
	yum localinstall --nogpgcheck http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/opus-1.3-0.4.beta.el8.x86_64.rpm
	yum localinstall --nogpgcheck http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/opus-devel-1.3-0.4.beta.el8.x86_64.rpm
	mkdir /usr/src/ffmpeg_rpms
	cd /usr/src/ffmpeg_rpms/
	wget https://download1.rpmfusion.org/free/el/updates/7/x86_64/f/ffmpeg-devel-3.4.12-1.el7.x86_64.rpm
	wget https://download1.rpmfusion.org/free/el/updates/7/x86_64/l/libavdevice-3.4.12-1.el7.x86_64.rpm
	wget https://download1.rpmfusion.org/free/el/updates/7/x86_64/f/ffmpeg-3.4.12-1.el7.x86_64.rpm
	wget https://forensics.cert.org/centos/cert/7/x86_64/ffmpeg-libs-2.6.8-3.el7.nux.x86_64.rpm
	yum localinstall *.rpm
	yum install bcg729 bcg729-devel

Installare MariaDB

MariaDB è necessario per compilare correttamente RTPengine

	yum install mariadb-devel mariadb-client mariadb-shared

Compilare ed installare RTPengine

	cd /usr/src/
	git clone https://github.com/sipwise/rtpengine.git rtpengine
	cd /usr/src/rtpengine
	cd /usr/src/rtpengine/daemon
	make
	cp -fr rtpengine /usr/sbin/rtpengine
	cp -fr rtpengine /usr/local/bin/rtpengine

Compilare ed installare le estensioni iptables

	cd /usr/src/rtpengine/iptables-extension
	make all
	cp -fr libxt_RTPENGINE.so /usr/lib64/xtables/.

Compilare ed installare il kernel module xt_RTPENGINE

	cd /usr/src/rtpengine/kernel-module
	make
	cp -fr xt_RTPENGINE.ko /lib/modules/`uname -r`/extra/xt_RTPENGINE.ko
	depmod -a
	modprobe -v xt_RTPENGINE

Controllare che il kernel module sia stato caricato

	lsmod | grep xt_RTPENGINE

Configurare l’avvio del kernel module al boot del sistema

	echo "# load xt_RTPENGINE module"  >> /etc/modules-load.d/rtpengine.conf
	echo "xt_RTPENGINE" >> /etc/modules-load.d/rtpengine.conf

Controllare l’accessibilità di RTPengine

	ls -l /proc/rtpengine/control | grep root

l’output dovrà essere del tipo

	--w--w----. 1 root root 0 10 gen 12.31 /proc/rtpengine/control

e quindi

	ls -l /proc/rtpengine/list

con output del tipo

	-r--r--r--. 1 root root 0 10 gen 12.32 /proc/rtpengine/list

Configurazione

Il file di configurazione è /etc/sysconfig/rtpengine e per procedere alla corretta configurazione del sistema è necessario conoscere l’IP esterno esposto dal sistema, da sostituire in 999.999.999.999. Tutti i parametri di configurazione sono descritti qui.

	echo "OPTIONS=\"-i 999.999.999.999 -n 127.0.0.1:2223 -m 23000 -M 23100 -L 4 --log-facility=local1 --table=8 --delete-delay=0 --timeout=60 --silent-timeout=600 --final-timeout=7200 --offer-timeout=60 --num-threads=12 --tos=184 –no-fallback\"" > /etc/sysconfig/rtpengine

Configurare i log

Con i parametri di configurazione usati sopra, i log prodotti da RTPengine sono relativi alla facility local1 (–log-facility=local1), quindi per gestirli correttamente si può aggiungere la seguente riga al file /etc/rsyslog.conf

	#rtpengine log
	local1.*   -/var/log/rtpengine/rtpengine.log

Inoltre possiamo disabilitare la scrittura dei log prodotti da RTPengine nel messages

	# Don't log private authentication messages!
	*.info;mail.none;authpriv.none;cron.none;local0.none;local1.none		/var/log/messages

Configuriamo poi la log rotation, aggiungendo il file /etc/logrotate.d/rtpengine

	/var/log/rtpengine/rtpengine.log {
	daily
	rotate 4
	missingok
	dateext
	copytruncate
	compress
	}

Infine creiamo il folder ed il file dove verrano prodotti i log

	mkdir -p /var/log/rtpengine
	touch /var/log/rtpengine/rtpengine.log
	systemctl restart rsyslog

Configurazione del servizio RTPengine

Per avviare e gestire RTPengine come servizio possiamo creare lo unit file /etc/systemd/system/rtpengine.service

	[Unit]
	Description=Kernel based rtp proxy
	After=syslog.target
	After=network-online.target
	After=iptables.service
	Requires=network-online.target

	[Service]
	Type=forking
	PIDFile=/var/run/rtpengine.pid
	EnvironmentFile=-/etc/sysconfig/rtpengine
	ExecStart=/usr/local/bin/rtpengine -p /var/run/rtpengine.pid $OPTIONS

	Restart=on-abort

	[Install]
	WantedBy=multi-user.target

Avvio del servizio

	mkdir -p /var/spool/rtpengine
	systemctl enable rtpengine.service
	systemctl start rtpengine.service