guacamole debian streetch + open ldap + nginx

Otra entrada que es un apunte.

En esta ocasión, instalaremos guacamole, como gateway de conexión a nuestros server y exponerlo a internet.

Partimos de una debian 9 pelada y instalamos las dependencias:


# apt install tomcat8 libcairo2-dev libossp-uuid-dev libavcodec-dev libavutil-dev libswscale-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev libjpeg62-turbo-dev libpng-dev libpng16-16 git

# git clone git://github.com/apache/incubator-guacamole-server.git
autoreconf -fi
./configure --with-init-dir=/etc/init.d
# make
# make install
# ldconfig
# systemctl enable guacd
# /etc/init.d/guacd start

creamos el fichero guacamole.properties


# nano /etc/guacamole/guacamole.properties


# Guacamole - Clientless Remote Desktop
# Copyright (C) 2010 Michael Jumper
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .

# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port: 4822

# Auth provider class (authenticates user/pass combination, needed if using the provided login screen)

# LDAP properties
ldap-hostname: ldap.craem.net
ldap-port: 389
ldap-user-base-dn: DC=craem,DC=net
ldap-search-bind-dn: CN=admin,DC=craem,DC=net
ldap-search-bind-password: password
ldap-config-base-dn: DC=craem,DC=net
ldap-username-attribute: uid

Creamos el enlace simbólico para la app


# ln -s /etc/guacamole/ /var/lib/tomcat8/.guacamole

Configuramos la parte cliente (la 0.9.14 es la última a fecha 10/2018):


# wget https://sourceforge.net/projects/guacamole/files/current/binary/guacamole-0.9.14.war
# mv guacamole-0.9.14.war /var/lib/tomcat8/webapps/guacamole.war
# service tomcat8 restart

Ahora instalamos el cliente ldap


# cd /etc/guacamole
# wget -c http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/0.9.14/binary/guacamole-auth-ldap-0.9.14.tar.gz
# service tomcat8 restart

Ahora nos queda actualizar el schema de open ldap:

# tar -zxvf guacamole-auth-ldap-0.9.14.tar.gz
cp guacamole-auth-ldap-0.9.14.jar /etc/guacamole/

Dentro de la carpeta schema, tenemos la parte de openldap que hemos de incorporar en nuestro server… lo copiamos e importamos


root@ldap:/usr/src# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f guacConfigGroup.ldif
adding new entry "cn=guacConfigGroup,cn=schema,cn=config"

root@ldap:/usr/src#ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
dn: cn=schema,cn=config

dn: cn={0}core,cn=schema,cn=config

dn: cn={1}cosine,cn=schema,cn=config

dn: cn={2}nis,cn=schema,cn=config

dn: cn={3}inetorgperson,cn=schema,cn=config

dn: cn={4}zarafa,cn=schema,cn=config

dn: cn={5}radius,cn=schema,cn=config

dn: cn={6}guacConfigGroup,cn=schema,cn=config

root@ldap:/usr/src#

Ahora nos queda crear los objetos de nuestros servers…… creamos un fichero, por ejemplo, entrada.ldif


dn: cn=zeus,ou=maquines,dc=craem,dc=net
objectClass: guacConfigGroup
objectClass: groupOfNames
cn: zeus
guacConfigProtocol: ssh
guacConfigParameter: hostname=192.168.1.2
guacConfigParameter: port=22
guacConfigParameter: security=ssh
member: cn=Angel Elena,cn=craem_users,dc=craem,dc=net

Guardamos cambios e importamos el fichero:


# ldapadd -x -D cn=admin,dc=goufone,dc=local -W -f entrada.ldif

El siguiente paso, es añadir el ngix y certbot para hacer de reverse proxy e incorporar el certificado:


# apt-get install nginx

creamos el fichero
# nano /etc/nginx/sites-available/guacamole

y añadimos:

server {
listen 80;
listen [::]:80;
server_name guacamole;

location / {
proxy_pass http://127.0.0.1:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}

}

Y creamos el enlace simbólico en /etc/nginx/sites-enabled

Reiniciamos el nginx y ya tenemos el servicio preparado 😉

vamos al navegador … http://guacamole

outlook.com y greylisting

Desde hace años, tengo mi propia solución antispam, basada en:

– debian
– postfix
– Greylist
– openSPF
– RBL
– Spam Assassin
– MailScanner & MailWatch

Funciona bastante bien y tengo muy pocas quejas, ya que con los filtros de postgrey, descarto de un plumazo el 70% de spam.

Como era de esperar, el servicio de greyList y microsoft no son amigos…. cuando envías un mail por primera vez, devuelves un 4.5.0 try later y en 300 segundos, deberías de volver a intentarlo desde la misma IP, peeeero Microsoft no y vuelve a intentarlo desde otra, con lo que se van sumando así 5 minutos cada vez.

Google, con su servicio bastante extendido (¿quién no tiene un gmail?), hace la entrega desde la misma IP, con lo que el servicio greyList funciona bien.

Como no voy a desactivar el greyList y por fuerza tengo que comunicarme con gente que usa outlook.com o tiene el office365 contratado, tengo que solucionar el problema…. no puedo permitir que un mail tarde 12 horas en llegar.

Googleando un poco, veo bastante gente que se ha dado por vencido y ha acabado desactivando el greylisting, pero si observamos bien, Microsoft tiene unos rangos:


https://technet.microsoft.com/en-us/library/dn163583(v=exchg.150).aspx

Resumiendo:

Tengo que hacer un bypass de estos rangos en el greyList.

Vamos a nuestro postgrey:

# nano /etc/postgrey/whitelist_clients

Editamos este fichero y añadimos los rangos de M$

# postgrey whitelist for mail client hostnames
# --------------------------------------------
# put this file in /etc/postgrey or specify its path
# with --whitelist-clients=xxx
#
# postgrey version: 1.34, build date: 2011-05-04

# Debian-specific additions
# I *know* they run real mail queues, so greylisting only creates
# bigger load for them.
23.103.132.0/22
23.103.136.0/21
23.103.144.0/20
23.103.156.0/22
23.103.191.0/24
23.103.198.0/23
23.103.198.0/24
23.103.199.0/24
23.103.200.0/22
23.103.212.0/22
40.92.0.0/14
40.107.0.0/17
40.107.128.0/18
52.100.0.0/14
65.55.88.0/24
65.55.169.0/24
94.245.120.64/26
104.47.0.0/17
104.212.58.0/23
134.170.132.0/24
134.170.140.0/24
157.55.234.0/24
157.56.110.0/23
157.56.112.0/24
207.46.51.64/26
207.46.100.0/24
207.46.163.0/24
213.199.154.0/24
213.199.180.128/26
216.32.180.0/23
2a01:111:f400:7c00::/54
2a01:111:f403::/48
104.47.0.0/17
40.107.0.0/16
/.*outbound.protection.outlook.com$/
/outlook/

Añadimos las ip’s al principio.

ahora, para que el postgrey use este fichero, tenemos que editar el siguiente fichero:

# nano /etc/default/postgrey

Y lo dejamos tal que:

# postgrey startup options, created for Debian

# you may want to set
# --delay=N how long to greylist, seconds (default: 300)
# --max-age=N delete old entries after N days (default: 35)
# see also the postgrey(8) manpage

# POSTGREY_OPTS="--inet=60000"
POSTGREY_OPTS="--inet=60000 --whitelist-clients=/etc/postgrey/whitelist_clients"
# the --greylist-text commandline argument can not be easily passed through
# POSTGREY_OPTS when it contains spaces. So, insert your text here:
#POSTGREY_TEXT="Your customized rejection message here"

Una vez hecho esto, nos toca reiniciar servicios….

En mi caso, el postgrey 1.34 con debian 7, el /etc/init.d/postgrey restart no acaba de ir bien, con lo que tengo que acabar matando el servicio con kill 9 y el postfix, de la manera habitual

enjoy 😉

Instalando Remmina en debian 9

Otro apunte.

En alguna ocasión, necesito conectarme a escritorios remotos desde mi debian…. siempre he usado remmina y me ha funcionado genial.

Con la última actualización, ya no podemos hacer un simple “apt-get install remmina” y lo han quitado de la versión estable…. pero, podemos instalarlo de la siguiente manera:

en /etc/apt/sources.list añadimos el siguiente repositorio:


deb http://ftp.us.debian.org/debian/ buster main contrib non-free

guardamos y hacemos:


# apt-get update
# apt-get install remmina

Y listo 😉

Nagios + openldap auth + apache 2.4

Esta vez, vamos a integrar la authenticación de usuarios de nuestro nagios con nuestro openLDAP.

Primero de todo, habilitamos los módulos ldap / authnz_ldap

a2enmod authnz_ldap
a2enmod ldap

Modificamos el fichero de sites del nagios:

#nano /etc/apache2/sites-available/nagios.conf

Y lo dejamos tal que:

# SAMPLE CONFIG SNIPPETS FOR APACHE WEB SERVER
#
# This file contains examples of entries that need
# to be incorporated into your Apache web server
# configuration file. Customize the paths, etc. as
# needed to fit your system.

ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"


# SSLRequireSSL
Options ExecCGI
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL "ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)"
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


Alias /nagios "/usr/local/nagios/share"


# SSLRequireSSL
Options None
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



Ahora modificamos el nagios para que acepte los usuarios:

/
#nano /usr/local/nagios/etc/cgi.cfg

Y dejamos las siguientes líneas así:


authorized_for_system_information=*
authorized_for_configuration_information=*
authorized_for_system_commands=*
authorized_for_all_services=*
authorized_for_all_hosts=*
authorized_for_all_service_commands=*
authorized_for_all_host_commands=*

Reiniciamos apache + nagios y a probar !!!!!!!!

Error “Disallowed key characters in global data.” pnp4nagios

Esta vez, instalando el pnp4nagios en un debian 8, me encontré este error a la hora de visualizar las graficas del nagios:

“Disallowed key characters in global data.”

tras googlear un rato y mirar las coockies / buscar la función, encontré el error en el fichero:

/usr/local/pnp4nagios/lib/kohana/system/libraries/Input.php


public function clean_input_keys($str)
{
$chars = PCRE_UNICODE_PROPERTIES ? '\pL' : 'a-zA-Z';
if ( ! preg_match('#^['.$chars.'0-9:_.\-/@]++$#uD', $str))
{
exit('Disallowed key characters in global data.');
}

return $str;
}

Hemos de dejar la línea donde se mirar los carácteres especiales, tal cual.

Custom APP pickup asterisk 11

Aquí tenemos otra entrada, que ha sido un marrón con todas las de la ley.

Asterisk es un producto que me encanta, pero a medida que crece en volumen, su comportamiento es “errático”…. es decir, a medida que crece en extensiones / usuarios o intentas hacer algo “multitenant”, te vas llevando sorpresa tras sorpresa, pero durante el camino a migrar a otra solución, tienes que ir parcheando y salir del paso como puedas.

También he de decir que, me desagrada muchísimo los paneles tipo freepbx / elastix y derivados, ya que limitan muchísimo sus funcionalidades.

Estos días, me pasó que tenía que habilitar en una empresa, más de 64 grupos de pickup a “ciegas” y corregir que el default del “features” se comporta de manera errática; intentas capturar una extensión de tu grupo y, en función de las alineaciones estelares, posición de la luna o si pasa algún cometa cerca, acabas capturando algo que no toca y, “capturas” también el cabreo del cliente.

En esta pbx, tengo dividida las extensiones de la siguiente manera:

Compras:
200
201
202
203
204
205
..
220

Facturación:
230
231
232
233
234
235
236
..
250

Contabilidad:
260
261
262
263

Formación:
270
271
272
273

y así un número ‘N’ de departamentos.

me hice una BBDD con ello, tipo

tabla: extensionesempresa
id | extension | departamento
-----------------------------
1 200 compras
2 201 compras
3 202 compras
4 203 compras
5 204 compras
..
40 320 administracion
41 321 administracion
..
..
N

Luego en el func_odbc, la consulta

[uverdepartamento]
dsn=asterisk
readsql=select departamento from extensionesempresa where extension='${ARG1}'

[ucontarextensiones]
dsn=asterisk
readsql=select count(extension),extension from extensionesempresa where departamento='${ARG1}'


Y ahora el código de app_pickup custom

[app_pickup]
exten => _*8,1,NoOP(.... custom pickup ..........)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(... la empresa es ${empresa} ...........)
exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})
exten => _*8,n,NoOP(.... ${exteninicial} ${numextensiones} ...... )
exten => _*8,n,NoOP(.... bucle while ..............................)
exten => _*8,n,Set(contador=1)
exten => _*8,n,Set(extenIni=${exteninicial})
exten => _*8,n,While($[${contador} < ${numextensions}]) exten => _*8,n,NoOP(extenIni: ${extenIni} contador: ${contador} ...)
exten => _*8,n,GotoIf($["${DEVICE_STATE(SIP/${extenIni})}"="RINGING"]?pickup)
exten => _*8,n,Set(extenIni=$[${extenIni} + 1])
exten => _*8,n,Set(contador=$[${contador} + 1])
exten => _*8,n,EndWhile
exten => _*8,n(pickup),NoOP(.... hacemos el pickup a ${extenIni}........)
exten => _*8,n(pickup),Set(PICKUPMARK=${extenIni})
exten => _*8,n(pickup),Set(GLOBAL(PICKUPMARK)=${extenIni})
exten => _*8,n(pickup),PickupChan(SIP/${extenIni})
exten => _*8,n,Hangup

En la primera parte, sacamos el departamento:

exten => _*8,1,NoOP(.... custom pickup ..........)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(... la empresa es ${empresa} ...........)

Luego sacamos la extensión inicial y contamos las extensiones que tiene el departamento:

exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})

Con el While hacemos el bucle y miramos si la extensión está en “RINGINNG” mediante la función “devstate”… si es así, usamos la función PickupChan.

Y ya la tenemos funcionando 😉

Automatizar añadir varias máquinas debian al ldap

Esta vez, tenía que automatizar la entrada anterior y añadir varias máquinas al ldap para login.

Como no me hacía especial ilusión modificar todos los ficheros a mano, tenemos al amigo bash + sed.

al lío:


#!/bin/bash

# ########################
# ### by craem ###########
# ########################
# ########################

function instala_paquetes(){
echo "------------------------------------------------------------"
echo "aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo "
aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo
}

function modifica_ficheros(){
echo "--- modificamos fichero nsswitch.conf -----------------------"
sed -ie 's/compat/ldap compat/g' /etc/nsswitch.conf
echo "--- modificamos el fichero common-session -------------------"
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0022" >> /etc/pam.d/common-session
echo "--- reiniciamos el servicio nscd ----------------------------"
/etc/init.d/nscd restart
echo "--- modificamos el sudoers ----------------------------------"
echo "%admin_users ALL=(ALL) ALL" >> /etc/sudoers
echo "--- modificamos el fichero common-auth ----------------------"
echo "auth required pam_access.so" >> /etc/pam.d/common-auth
echo "--- modificamos el access.conf ------------------------------"
echo "-:ALL EXCEPT root (admin_users):ALL EXCEPT LOCAL" >> /etc/security/access.conf
echo "--- modificamos el fichero ldap.conf ------------------------"
sed -ie 's/#BASE dc=example,dc=com/BASE dc=craem,dc=net/g' /etc/ldap/ldap.conf
echo "--- modificamos el ldap.conf --------------------------------"
echo "URI ldap://ldap.craem.net" >> /etc/ldap/ldap.conf
echo "--- fin del script ------------------------------------------"

}
instala_paquetes
modifica_ficheros

Debian client login ldap server

otra entrada que es un apunte.

En esta ocasión, vamos a hacer en nuestros servers, que el login vaya centralizado contra nuestro ldap.

Primero de todo, instalamos las dependencias:


root@pbxshared:/etc/asterisk# apt-get install libpam-ldap nscd


aptitude -y install libnss-ldap libpam-ldap ldap-utils

instalamos y nos pide la url del ldap:


LDAP server URI
ldap://mi.serverldap.com


Distinguished name of the search base:
dc=exemple,dc=local


LDAP version to use:
3


Configuring libpam-ldap
his option will allow password utilities that use PAM to change local passwords.
The LDAP admin account password will be stored in a separate file which will be made readable to root only.
If /etc is mounted by NFS, this option should be disabled.
Allow LDAP admin account to behave like local root?

YES


Database requires login
YES


Configuring libpam-ldap
cn=manager,dc=example,dc=net


Configuring libpam-ldap
mipassword

Ahora editamos el fichero /etc/nsswitch.conf y dejamos tal cual:

passwd: ldap compat
group: ldap compat
shadow: ldap compat

gshadow: files

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: nis

Editamos el fichero /etc/pam.d/common-session y añadimos al final:

session required pam_mkhomedir.so skel=/etc/skel umask=0022

reiniciamos el servicio nscd

/etc/init.d/nscd restart

Instalamos sudo si no está..

apt-get install sudo

Y modificamos el visudo


#visudo

añadimos el grupo que podrá hacer sudo su

# User privilege specification
root ALL=(ALL:ALL) ALL
%admin_users ALL=(ALL) ALL

Admin_users es el grupo LDAP donde se encuentren nuestros usuarios.

ahora vamos a reestringir a un grupo de ldap el login al server. Editamos el fichero /etc/pam.d/common-auth y añadimos:

auth required pam_access.so

Editamos el fichero /etc/security/access.conf y añadimos el grupo al cual permitiremos acceso, añadiendo al final:

-:ALL EXCEPT root (admin_users):ALL EXCEPT LOCAL

Kamailio 4.x Debian Jessie

Estos días estoy liado con el tema del sipproxy Kamailio….. un gran software y potente donde los haya.

Empezamos con que disponemos de un debian jessie limpito; instalamos las dependencias:


apt-get install git-core gcc flex bison libmysqlclient-dev make libssl-dev libcurl4-openssl-dev libxml2-dev libpcre3-dev mysql-server

Y ahora descargamos el source de kamailio:


root@sipproxy:/usr/src# wget -c http://www.kamailio.org/pub/kamailio/4.2.2/src/kamailio-4.4.4_src.tar.gz
root@sipproxy:/usr/src# tar -zxvf kamailio-4.4.4_src.tar.gz

Preparamos para compilar:

#make cfg

Editamos el fichero /usr/src/kamailio-4.4.4/modules.lst y modificamos:

.
.
# the list of extra modules to compile
include_modules=db_mysql
.
.

Guardamos y vamos a compilar:

#make install

Una vez compilado, tendremos los ficheros en /usr/local/etc/kamailio.

Creamos un usuario para el mysql / kamailio:

mysql> grant all privileges on kamailio.* to 'kamailio'@'%' identified by 'kamailio' with grant option;

Modificamos el kamctrlc para que use mysql (en mi caso) y lo dejamos tal que:


DBENGINE=MYSQL

## database host
DBHOST=localhost

## database name (for ORACLE this is TNS name)
DBNAME=kamailio

# database path used by dbtext, db_berkeley or sqlite
# DB_PATH="/usr/local/etc/kamailio/dbtext"

## database read/write user
DBRWUSER="kamailio"

## password for database read/write user
DBRWPW="kamailio"

## database read only user
DBROUSER="kamailio"

## password for database read only user
DBROPW="kamailio"

ahora creamos las bbdd:

root@monaca:/usr/local/etc/kamailio# /usr/local/sbin/kamdbctl create
MySQL password for root:
INFO: test server charset
INFO: creating database kamailio ...
INFO: granting privileges to database kamailio ...
INFO: creating standard tables into kamailio ...
INFO: Core Kamailio tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into kamailio ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute
userblacklist htable purple uac pipelimit mtree sca mohqueue
rtpproxy? (y/n): y
INFO: creating extra tables into kamailio ...
INFO: Extra tables succesfully created.
Install tables for uid_auth_db uid_avp_db uid_domain uid_gflags
uid_uri_db? (y/n): y
INFO: creating uid tables into kamailio ...
INFO: UID tables succesfully created.
root@monaca:/usr/local/etc/kamailio#

preparamos el kamailio para que arranque y crearemos el init.d

root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.init /etc/init.d/kamailio


root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.default /etc/default/kamailio

Editamos el fichero /etc/default/kamailio

#
# Kamailio startup options
#

# Set to yes to enable kamailio, once configured properly.
RUN_KAMAILIO=yes

# User to run as
USER=kamailio

# Group to run as
GROUP=kamailio

# Amount of shared and private memory to allocate
# for the running Kamailio server (in Mb)
#SHM_MEMORY=64
#PKG_MEMORY=8

# Config file
CFGFILE=/usr/local/etc/kamailio/kamailio.cfg

# Enable the server to leave a core file when it crashes.
# Set this to 'yes' to enable Kamailio to leave a core file when it crashes
# or 'no' to disable this feature. This option is case sensitive and only
# accepts 'yes' and 'no' and only in lowercase letters.
# On some systems it is necessary to specify a directory for the core files
# to get a dump. Look into the kamailio init file for an example configuration.
#DUMP_CORE=yes

Creamos el fichero pid, usuarios:

adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "kamailio" --home /var/run/kamailio kamailio

Copiamos el init.d

cp /usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise/kamailio.init /etc/init.d/kamailio
mkdir -p /var/run/kamailio
chmod 755 /etc/init.d/kamailio
chown kamailio:kamailio /var/run/kamailio

y ahora para que arranque con el systcl, añadimos el siguiente fichero /etc/systemd/system/kamailio.service


[Unit]
Description=Kamailio SIP Server

[Service]
Type=forking
PIDFile=/var/run/kamailio.pid
ExecStart=/usr/local/sbin/kamctl start
ExecRestart=/usr/local/sbin/kamctl restart
ExecStop=/usr/local/sbin/kamctl stop

[Install]
WantedBy=multi-user.target

Enjoy your kamailio server 😉