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.

Architecture

 

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.

Configuration

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)

Scénarios I

 

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

Teste 1

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'

Teste 2 et 4

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'

Teste 3

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'

Scénarios II

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>.

Référence

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://astbook.asteriskdocs.org/en/2nd_Edition/asterisk-book-html/asterisk-book.html#I_section12_tt1465

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