Validation de la configuration d’Asterisk avec MySQL
Oussama Hammami, 2011-03-02
Switzernet
L’objective de ce document est de valider la configuration d’Asterisk avec MySQL.
Le serveur Asterisk RT est le serveur Asterisk concerné, il utilise le module RealTime pour décrire ces utilisateurs les terminaux autorisés à le connecter.
Le serveur sip 91.121.147.45 est autorisé à envoyer de traffic vers notre Asterisk, l’authentification de ce dernier est basée sur l’adresse ip.
Le fournisseur sip 94.23.242.200 est utilisé pour appeler autre comptes que celles du réseau Switzernet (les 3 comptes 41215500329, 41215500327 et 41215504127) et il est aussi traité comme une node c-a-d q’il est autorisé à envoyer du traffic vers notre serveur.
extconfig.conf
[settings]
sippeers => mysql,asterisk,sippeer
sipusers => mysql,asterisk,sipuser
sip.conf
[general]
nat=yes
realm=switzernet
canreinvite=no
maxexpiry=3600
minexpiry=360
defaultexpiry=600
context=forbidden
rtptimeout=10
qualify=no
disallow=all
allow=ulaw
allow=alaw
allow=g729
allow=g723
allow=g726
extensions.conf
[globals]
NAS_IP_Address=91.121.205.108
max_duration=7200
ROUTE_41215500329=41215500329
ROUTE_41215500327=41215500327
ROUTE_41215504127=41215504127@91.121.147.45
ROUTE_41215500111=41215500111@94.23.242.200
[general]
static=yes
autofallthrough=yes
[forbidden]
exten => _X.,1,NoOp(-- No context for host ${SIPCHANINFO(recvip)} --)
exten => _X.,n,System(/bin/echo "'forbidden'" >> /var/log/asterisk/astrad.log)
exten => _X.,n,Hangup(21)
[fromip]
exten => _X.,1,NoOp(-- Inbound Authentication for cusromer IP --)
exten => _X.,n,System(/bin/echo "'fromip'" >> /var/log/asterisk/astrad.log)
exten => _X.,n,Dial(SIP/${EXTEN},30)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[fromnode]
exten => _X.,1,NoOp(-- Inbound Authentication --)
exten => _X.,n,System(/bin/echo "'fromnode ${EXTEN}'" >> /var/log/asterisk/astrad.log)
exten => _X.,n,Goto(routing,${EXTEN},1)
[fromaccount]
exten => _X.,1,NoOp(-- SIP Authentication --)
exten => _X.,n,System(/bin/echo "'fromaccount ${EXTEN} '" >> /var/log/asterisk/astrad.log)
exten => _X.,n,Goto(routing,${EXTEN},1)
[routing]
exten => _X.,1,NoOp(-- Routing --)
exten => _X.,n,System(/bin/echo "'route ${ROUTE_${EXTEN}} '" >> /var/log/asterisk/astrad.log)
exten => _X.,n,Dial(SIP/${ROUTE_${EXTEN}},30)
exten => _X.,n,Hangup(${HANGUPCAUSE})
MySQL
mysql> select * from sipuser;
+----+-------------+-------------+--------------+-----------------------------+
| id | name | context | secret | deny |
+----+-------------+-------------+--------------+-----------------------------+
| 1 | 41215500329 | fromaccount | PASSWORD1 | 94.23.242.200;91.121.147.45 |
| 2 | 41215504127 | fromaccount | PASSWORD2 | 94.23.242.200;91.121.147.45 |
| 3 | 41215500327 | fromaccount | PASSWORD3 | 94.23.242.200;91.121.147.45 |
+----+-------------+-------------+--------------+-----------------------------+
3 rows in set (0.00 sec)
mysql> select * from sippeer;
+----+---------------+---------------+----------+----------+--------------+-------+------------+-------------+--------------+
| id | name | host | context | insecure | ipaddr | port | regseconds | username | secret |
+----+---------------+---------------+----------+----------+--------------+-------+------------+-------------+--------------+
| 1 | 94.23.242.200 | 94.23.242.200 | fromip | port | NULL | 5060 | NULL | NULL | NULL |
| 2 | 91.121.147.45 | 91.121.147.45 | fromnode | port | NULL | 5060 | NULL | NULL | NULL |
| 3 | 41215500329 | dynamic | NULL | NULL | 85.1.36.122 | 64979 | 1299072464 | 41215500329 | PASSWORD1 |
| 4 | 41215504127 | dynamic | NULL | NULL | NULL | NULL | NULL | NULL | PASSWORD2 |
| 5 | 41215500327 | dynamic | NULL | NULL | 212.147.8.99 | 61999 | 1299072754 | 41215500327 | PASSWORD3 |
+----+---------------+---------------+----------+----------+--------------+-------+------------+-------------+--------------+
5 rows in set (0.00 sec)
Pour voir tous les requêtes MySQL que l’asterisk fait on a activé le log MySQL (dans /etc/mysql/my.cnf):
# tail –f /var/log/mysql/mysql.log
Le compte 41215504127 enregistré sur le serveur 91.121.147.45 appel le compte 41215500329 enregistré sur notre serveur Asterisk.
asterisk
SELECT * FROM sipuser WHERE name = '41215504127'
L’Asterisk cherche l’appelant dans la table sipuser il le trouve mais grâce au champ deny il ne l’authentifie pas comme user (ip source est présente dans le deny).
asterisk
SELECT * FROM sippeer WHERE host = '91.121.147.45' AND port = '5060'
L’Asterisk cherche maintenant a authentifié le serveur comme node et il l’autorise.
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45-007befc0' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45-007befc0'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329' AND host = 'dynamic'
L’asterisk cherche l’adresse ip et le port du compte 41215500329 pour router correctement le flux RTP.
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007cbb20' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007cbb20'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329' AND host = 'dynamic'
Le compte 41215500329 appel le compte 41215500327, les deux comptes sont enregistrés sur notre serveur Asterisk.
asterisk
SELECT * FROM sipuser WHERE name = '41215500329'
L’Asterisk cherche l’appelant dans la table sipuser, il le trouve. L’autorisation dans cette cas est basé sur le champ secret dans sipuser par contre pour l’autorisation de l’enregistrement (REGISTER) l’autorisation est toujours basé sur le secret mais du table sippeer.
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007c90a0' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007c90a0'
asterisk
SELECT * FROM sippeer WHERE name = '41215500327' AND host = 'dynamic'
L’asterisk cherche l’adresse ip et le port du compte 41215500327 pour router correctement le flux RTP.
asterisk
SELECT * FROM sippeer WHERE name = '41215500329' AND host = 'dynamic'
L’asterisk cherche l’adresse ip et le port du compte 41215500329 pour router correctement le flux RTP.
asterisk
SELECT * FROM sippeer WHERE name = '41215500327-007cd3e0' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '41215500327-007cd3e0'
asterisk
SELECT * FROM sippeer WHERE name = '41215500327' AND host = 'dynamic'
Le compte 41215500329 enregistré sur notre serveur Asterisk appel le compte 41215504127 enregistrés sur le serveur 91.121.147.45.
asterisk
SELECT * FROM sipuser WHERE name = '41215500329'
L’Asterisk cherche l’appelant dans la table sipuser, il le trouve et il demande l’authentification (INVITE).
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007c90a0' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329-007c90a0'
asterisk
SELECT * FROM sippeer WHERE name = '41215500329' AND host = 'dynamic'
L’asterisk cherche l’adresse ip et le port du compte 41215500329 pour router correctement le flux RTP.
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45'
L’Asterisk cherche l’adresse ip et le port du serveur dont le nom est 91.121.147.45.
Vous avez remarqué que
nous avons utilisé les IPs pour nommer les serveurs sip. On effet l’Asterisk
cherche les Peers au moment où il exécute la commande DIAL dans extensions.conf
Si URI demandé contient le caractère @ alors l’Asterisk cherche l’ip et le port dans sippeer avec la chaîne de caractère après ce caractère sinon il cherche tous la chaîne.
Exemple :
DIAL (SIP/41215500329)
> SELECT * FROM sippeer WHERE name = '41215500327' AND host = 'dynamic'
DIAL (SIP/41215504127@91.121.147.45)
> SELECT * FROM sippeer WHERE name = '91.121.147.45'
Asterisk route l’appel vers l’ip dans le champ host si la valeur de ce champ est NULL ou dynamic alors il route l’appel en utilisant l’IP du champ ipaddr.
Pour savoir vers quelle adresse IP l’appel sera router si les deux champs existent (host et ipaddr) on a mis une fausse valeur dans le champ host est la vrai IP du serveur dans ipaddr, l’appel a échoué car il était routé vers l’IP du champ host.
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45-007cd3e0' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45-007cd3e0'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45' AND host = 'dynamic'
asterisk
SELECT * FROM sippeer WHERE name = '91.121.147.45'
L’objective de ce teste est de valider que l’Asterisk ignore le port d’où le serveur SIP 94.23.242.200 a envoyé l’appel vers notre serveur Asterisk.
A- Insecure=NULL et ( port=5060 ou port=NULL )
mysql> select * from sippeer where name='94.23.242.200';
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
| id | name | host | context | insecure | ipaddr | port | regseconds | username | secret |
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
| 1 | 94.23.242.200 | 94.23.242.200 | fromip | NULL | NULL | 5060 | NULL | NULL | NULL |
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
Ngrep sur le serveur Asterisk RT
U 94.23.242.200:6060 -> 91.121.205.108:5060
INVITE sip:41215500329@91.121.205.108 SIP/2.0.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK796285ff;rport.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as27ad504e.
To: <sip:41215500329@91.121.205.108>.
Contact: <sip:41215500111@94.23.242.200:6060>.
Call-ID: 0888bf52606396d107b2230a473714e4@94.23.242.200.
U 91.121.205.108:5060 -> 94.23.242.200:6060
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK796285ff;received=94.23.242.200;rport=6060.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as27ad504e.
To: <sip:41215500329@91.121.205.108>.
Call-ID: 0888bf52606396d107b2230a473714e4@94.23.242.200.
U 91.121.205.108:5060 -> 94.23.242.200:6060
SIP/2.0 403 Forbidden.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK796285ff;received=94.23.242.200;rport=6060.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as27ad504e.
To: <sip:41215500329@91.121.205.108>;tag=as03b7985e.
Call-ID: 0888bf52606396d107b2230a473714e4@94.23.242.200.
L’autorisation serveur 94.23.242.200 a échoué car le port indique dans le table sippeer (5060) pour ce serveur ne correspond pas au port émetteur (6060).
B- Insecure=port
mysql> select * from sippeer where name='94.23.242.200';
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
| id | name | host | context | insecure | ipaddr | port | regseconds | username | secret |
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
| 1 | 94.23.242.200 | 94.23.242.200 | fromip | port | NULL | 5060 | NULL | NULL | NULL |
+----+---------------+---------------+---------+----------+--------+------+------------+----------+--------+
Ngrep sur le serveur Asterisk RT
U 94.23.242.200:6060 -> 91.121.205.108:5060
INVITE sip:41215500329@91.121.205.108 SIP/2.0.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK47e39d52;rport.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as6033954a.
To: <sip:41215500329@91.121.205.108>.
Contact: <sip:41215500111@94.23.242.200:6060>.
Call-ID: 04ca47f0138447272099a8730f06caad@94.23.242.200.
U 91.121.205.108:5060 -> 94.23.242.200:6060
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK47e39d52;received=94.23.242.200;rport=6060.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as6033954a.
To: <sip:41215500329@91.121.205.108>.
Call-ID: 04ca47f0138447272099a8730f06caad@94.23.242.200.
U 91.121.205.108:5060 -> 85.1.36.122:64979
INVITE sip:41215500329@85.1.36.122:64979 SIP/2.0.
Via: SIP/2.0/UDP 91.121.205.108:5060;branch=z9hG4bK76a98c84;rport.
From: "41215500111" <sip:41215500111@91.121.205.108>;tag=as7bef71ce.
To: <sip:41215500329@85.1.36.122:64979>.
Contact: <sip:41215500111@91.121.205.108>.
Call-ID: 049ee70162a3b97923fbe8f3706bdd11@91.121.205.108.
U 85.1.36.122:64979 -> 91.121.205.108:5060
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 91.121.205.108:5060;branch=z9hG4bK76a98c84;rport=5060.
From: "41215500111" <sip:41215500111@91.121.205.108>;tag=as7bef71ce.
To: <sip:41215500329@85.1.36.122:64979>;tag=983006909.
Call-ID: 049ee70162a3b97923fbe8f3706bdd11@91.121.205.108.
U 85.1.36.122:64979 -> 91.121.205.108:5060
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 91.121.205.108:5060;branch=z9hG4bK76a98c84;rport=5060.
From: "41215500111" <sip:41215500111@91.121.205.108>;tag=as7bef71ce.
To: <sip:41215500329@85.1.36.122:64979>;tag=983006909.
Call-ID: 049ee70162a3b97923fbe8f3706bdd11@91.121.205.108.
U 91.121.205.108:5060 -> 94.23.242.200:6060
SIP/2.0 180 Ringing.
Via: SIP/2.0/UDP 94.23.242.200:6060;branch=z9hG4bK47e39d52;received=94.23.242.200;rport=6060.
From: "41215500111" <sip:41215500111@94.23.242.200:6060>;tag=as6033954a.
To: <sip:41215500329@91.121.205.108>;tag=as50c86d3b.
Call-ID: 04ca47f0138447272099a8730f06caad@94.23.242.200.
L’Asterisk ignore la valeur du port 5060 durant l’autorisation d’appels entrant depuis le serveur 94.23.242.200 par contre il va l’utilise pour router les appels vers ce serveur.
Ci-dessous le résultat d’un appel depuis 41215500329 enregistré sur notre serveur vers 41215500111 (94.23.242.200) :
U 85.1.36.122:64979 -> 91.121.205.108:5060
INVITE sip:41215500111@astrad9.switzernet.com;user=phone SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK724ff92ed9f4fa8b6b663b5f24c44e76;rport.
From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=3434508183.
To: <sip:41215500111@astrad9.switzernet.com;user=phone>.
U 91.121.205.108:5060 -> 85.1.36.122:64979
SIP/2.0 407 Proxy Authentication Required.
Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK724ff92ed9f4fa8b6b663b5f24c44e76;received=85.1.36.122;rport=64979.
From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=3434508183.
To: <sip:41215500111@astrad9.switzernet.com;user=phone>;tag=as166530ab.
U 85.1.36.122:64979 -> 91.121.205.108:5060
ACK sip:41215500111@astrad9.switzernet.com;user=phone SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK724ff92ed9f4fa8b6b663b5f24c44e76;rport.
From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=3434508183.
To: <sip:41215500111@astrad9.switzernet.com;user=phone>;tag=as166530ab.
U 85.1.36.122:64979 -> 91.121.205.108:5060
INVITE sip:41215500111@astrad9.switzernet.com;user=phone SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK7d131e0d26bd2da966bfa524b1d2d43c;rport.
From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=3434508183.
To: <sip:41215500111@astrad9.switzernet.com;user=phone>.
U 91.121.205.108:5060 -> 85.1.36.122:64979
SIP/2.0 100 Trying.
Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK7d131e0d26bd2da966bfa524b1d2d43c;received=85.1.36.122;rport=64979.
From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=3434508183.
To: <sip:41215500111@astrad9.switzernet.com;user=phone>.
U 91.121.205.108:5060 -> 94.23.242.200:5060
INVITE sip:41215500111@94.23.242.200 SIP/2.0.
Via: SIP/2.0/UDP 91.121.205.108:5060;branch=z9hG4bK3c5c3015;rport.
From: "41215500329" <sip:41215500329@91.121.205.108>;tag=as08fe4c3e.
To: <sip:41215500111@94.23.242.200>.
U 91.121.205.108:5060 -> 94.23.242.200:5060
INVITE sip:41215500111@94.23.242.200 SIP/2.0.
Via: SIP/2.0/UDP 91.121.205.108:5060;branch=z9hG4bK3c5c3015;rport.
From: "41215500329" <sip:41215500329@91.121.205.108>;tag=as08fe4c3e.
To: <sip:41215500111@94.23.242.200>.
http://wiki.kolmisoft.com/index.php/Two_SIP_listening_ports_for_single_Asterisk
http://lists.digium.com/pipermail/asterisk-users/2008-November/221970.html
http://www.asterisk.org/doxygen/trunk/Config_sip.html
http://switzernet.com/3/company/110217-asterisk-mysql/
http://ofps.oreilly.com/titles/9780596517342/ch05.html#sip-conf-type-option
http://www.voip-info.org/wiki/view/Asterisk+config+sip.conf
http://www.voip-info.org/wiki/view/Asterisk+sip+type
http://www.voip-info.org/wiki/view/Asterisk+RealTime+Sip
http://kb.asipto.com/asterisk:realtime:kamailio-3.0.x-asterisk-1.6.2-astdb
http://www.mail-archive.com/asterisk-users@lists.digium.com/msg227283.html