Tester la commande Dial d’Asterisk en précisant l’adresse IP et le port du téléphone

Oussama Hammami, 2011-01-07

Switzernet

 

 

Objectif

La commande Dial : Met en relation l’appelant et l’utilisateur ou le service spécifié en argument de l’application Dial. Cette commande est donc utilisée pour affecter un numéro de téléphone à un utilisateur, à un terminal ou à un service.

En argument de l’application, il faut indiquer le nom du compte à contacter, préfixé par le protocole de signalisation que le compte utilise (IAX2, SIP, etc.). Cela permet au serveur Asterisk de déterminer dans quel fichier de configuration se trouvent les propriétés du compte appelé (iax.conf, sip.conf, etc.). Il est possible d’appeler plusieurs correspondants en même temps en mettant leur extension respective en arguments de l’application Dial, séparés par le caractère & (esperluette). Par exemple : Dial (SIP/1001 & SIP/1005) fait sonner les postes affectés aux comptes 1001 et 1002 en même temps.

 

L’objectif de ce document est de tester le fonctionnement d’Asterisk lors d’un appel en utilisant dans extensions.conf la commande DIAL avec l’URI direct de client (adresse IP et port du téléphone SIP du client) sans compter sur Asterisk pour récupérer ces informations.

Scénario

Après l’enregistrement du client l’Asterisk exécute une requête update mettant à jours l’adresse IP et le port du contact de ce dernier, ces informations seront utilisées pour acheminer les appels entrants vers le téléphone en question.

 

Si le client utilise deux applications SIP (ou téléphones) l’appel entrant sera routé vers le dernier téléphone enregistré.

Le but est d’ajouter à cet instant une deuxième entrée dans la table sippeer qui gardera l’adresse IP et le Port de ce deuxième téléphone.

Exemple

Ci-dessous on a deux téléphones enregistrés avec le même compte 41215500329

mysql> select * from location3 where username=41215500329;

+-------------+-------------------------------------+---------------------+

| username    | contact                             | expires             |

+-------------+-------------------------------------+---------------------+

| 41215500329 | sip:41215500329@212.147.8.105:62585 | 2011-06-30 16:57:37 |

| 41215500329 | sip:41215500329@85.3.159.248:55427  | 2011-06-30 16:57:48 |

+-------------+-------------------------------------+---------------------+

2 rows in set (0.00 sec)

 

mysql> insert into sippeers2 (name,host,ipaddr,port) values ('41215500329_1','212.147.8.105','212.147.8.105','62585');

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into sippeers2 (name,host,ipaddr,port) values ('41215500329_2','85.3.159.248','85.3.159.248','55427');

Query OK, 1 row affected (0.00 sec)

 

mysql> select name,host,context,insecure,ipaddr,port,regseconds,username,nat from sippeers2 where name like "41215500329%";

+---------------+---------------+-----------+----------+---------------+-------+------------+-------------+------+

| name          | host          | context   | insecure | ipaddr        | port  | regseconds | username    | nat  |

+---------------+---------------+-----------+----------+---------------+-------+------------+-------------+------+

| 41215500329   | dynamic       | forbidden | no       | 85.3.159.248  | 55427 | 1309445868 | 41215500329 | yes  |

| 41215500329_1 | 212.147.8.105 | forbidden | no       | 212.147.8.105 | 62585 |       NULL | NULL        | yes  |

| 41215500329_2 | 85.3.159.248  | forbidden | no       | 85.3.159.248  | 55427 |       NULL | NULL        | yes  |

+---------------+---------------+-----------+----------+---------------+-------+------------+-------------+------+

3 rows in set (0.00 sec)

 

La commande Dial utilisée pour appeler ce client est :

exten => _[*0-9]!,n,Dial(SIP/41215500329@41215500329_1&SIP/41215500329@41215500329_2,30)

 

Voici le diagramme d’un appel entrant de 41215500327 vers 412155329 en faisant sonner les deux téléphones du compte 41215500329:

Cliquer sur le nom du paquet pour voir son contenu.

Testes des différents modèles des téléphone SIP

 

model

Caller (A)

Called (B)

Exten

Mysql

Ngrep

RTP

Linksys SPA 921

41215506874

41215500327

Dial(SIP/41215500327@41215500327_1,30)

[txt]

[txt]

yes [txt]

SIEMENS C470

41215506874

41215500329

Dial(SIP/41215500329@41215500329_1,30)

[txt]

[txt]

yes [txt]

SIEMENS C450

41215506874

41215504126

Dial(SIP/41215504126@41215504126_1,30)

[txt]

[txt]

yes [txt]

X-Lite (Iphone)

41215506874

41215500336

Dial(SIP/41215500336@41215500336_1,30)

[txt]

[txt]

yes [txt]

X-Lite (Windows)

41215506874

41215500336

Dial(SIP/41215500336@41215500336_1,30)

[txt]

[txt]

yes [txt]

SofiaSIP (Nokia)

41215506874

41215500329

Dial(SIP/41215500329@41215500329_1,30)

[txt]

[txt]

yes [txt]

Grandstream BT120

41215506874

41215507392

Dial(SIP/41215507392@41215507392_1,30)

[txt]

[txt]

yes [txt]

Linksys SPA1001

41215506874

41215507392

Dial(SIP/41215507392@41215507392_1,30)

[txt]

[txt]

yes [txt]

 

NB

La capture des paquets RTP ne correspond pas à la capture des échanges SIP c-à-d que les ports utilisés pour le transport des paquets RTP ne sont pas ceux qui sont  indiqués dans la session SDP des échanges SIP.

En revanche voici une capture complète d’un appel entrant avec cette commande DIAL :

La commande utilisée pour cette capture est :

# ngrep -pql -W byline "" host 212.147.8.105 | perl -ne 'if(/^(u |user-a|sip|invi|ack|canc|bye|reg|m=)/i){s/[\r\n]//g; $uu=(/^u /i)?1:0; if($u==1 && $uu==1){printf " | "}else{printf "\n"}; printf "%s",$_; $u=$uu;}'

SIP

U 94.23.225.212:5060 -> 212.147.8.105:1240

INVITE sip:41215504126@212.147.8.105:1240 SIP/2.0.

User-Agent: Asterisk PBX.

m=audio 11584 RTP/AVP 0 8 18 4 111 101.

U 212.147.8.105:1240 -> 94.23.225.212:5060

SIP/2.0 100 Trying.

U 212.147.8.105:1240 -> 94.23.225.212:5060

SIP/2.0 180 Ringing.

U 212.147.8.105:1240 -> 94.23.225.212:5060

SIP/2.0 200 OK.

m=audio 5004 RTP/AVP 0 101.

U 94.23.225.212:5060 -> 212.147.8.105:1240

ACK sip:41215504126@192.168.1.113:5060 SIP/2.0.

User-Agent: Asterisk PBX.

RTP

U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 |

 

...

 

 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 212.147.8.105:5004 -> 94.23.225.212:11584 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 94.23.225.212:11584 -> 212.147.8.105:5004 | U 94.23.225.212:11584 -> 212.147.8.105:5004

SIP

U 212.147.8.105:1240 -> 94.23.225.212:5060

BYE sip:41215500329@94.23.225.212 SIP/2.0.

User-Agent: C450 IP010720000000.

U 94.23.225.212:5060 -> 212.147.8.105:1240

SIP/2.0 200 OK.

User-Agent: Asterisk PBX.

^C

#

 

 

Le trafic RTP est acheminé correctement, Asterisk gère le NAT car on a activé  l’option ‘nat=yes’ dans la table sipppeer.

mysql> select * from sippeers2 where name like '41215500336%';

+------+---------------+---------------+-----------+----------+---------------+-------+-----+

| id   | name          | host          | context   | insecure | ipaddr        | port  | nat |

+------+---------------+---------------+-----------+----------+---------------+-------+-----+

| 7563 | 41215500336_1 | 212.147.8.105 | forbidden | no       | 212.147.8.105 | 55129 | yes |

+------+---------------+---------------+-----------+----------+---------------+-------+-----+

 

Ci-dessous le log des requêtes MySQL que Asterisk exécute lors d’un appel entrant :

110630 13:24:21 33893 Init DB   asterisk

                33893 Query     SELECT * FROM sipusers WHERE name = '41215502796'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE host = '91.121.143.56' AND port = '5060'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '91.121.143.56-3c00b050' AND host = 'dynamic'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '91.121.143.56-3c00b050'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1' AND host = 'dynamic'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '91.121.143.56' AND host = 'dynamic'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '91.121.143.56'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1-007b6060' AND host = 'dynamic'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1-007b6060'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1' AND host = 'dynamic'

                33893 Init DB   asterisk

                33893 Query     SELECT * FROM sippeers2 WHERE name = '41215500327_1'

 

Ci-dessous l’invite d’un appel entrant vers un téléphone enregistré dans Porta-SIP

U 66.234.138.73:5060 -> 212.147.8.105:1237

INVITE sip:41215506874@212.147.8.105:1237 SIP/2.0.

Record-Route: <sip:66.234.138.73;ftag=d1ab7839446a48bd39c4ce5f16b68f36;lr>.

Via: SIP/2.0/UDP 66.234.138.73;branch=z9hG4bKc128.2d1faa2d2a55a5d8b40496918b9c47dc.0.

Via: SIP/2.0/UDP 66.234.138.73:5061;branch=z9hG4bK59089222b59cf0ad69c604bca3790a32;rport=5061.

Max-Forwards: 16.

From: 41215500327 <sip:41215500327@66.234.138.73>;tag=d1ab7839446a48bd39c4ce5f16b68f36.

To: <sip:41215506874@66.234.138.73>.

Call-ID: 595c5ac34b2ec2f2380b0ff15657817e@94.23.225.212.

CSeq: 200 INVITE.

Contact: Anonymous <sip:66.234.138.73:5061>.

Expires: 300.

User-Agent: Sippy.

cisco-GUID: 726268302-501283260-734815433-384090803.

h323-conf-id: 726268302-501283260-734815433-384090803.

Content-Length: 389.

Content-Type: application/sdp.

.

v=0.

o=Sippy 148946828 0 IN IP4 66.234.138.73.

s=session.

t=0 0.

m=audio 24324 RTP/AVP 0 8 18 4 111 101.

c=IN IP4 94.23.225.212.

a=rtpmap:0 PCMU/8000.

a=rtpmap:8 PCMA/8000.

a=rtpmap:18 G729/8000.

a=fmtp:18 annexb=no.

a=rtpmap:4 G723/8000.

a=fmtp:4 annexa=no.

a=rtpmap:111 G726-32/8000.

a=rtpmap:101 telephone-event/8000.

a=fmtp:101 0-16.

a=silenceSupp:off - - - -.

a=ptime:20.

a=sendrecv.

 

Le serveur SIP envoi l’invite sans ajouter dans contact ou to l’adresse IP local du téléphone derrière nat.                               

Référence

http://switzernet.com/3/public/110627-astrad-empty-udp-keepalive/

http://switzernet.com/3/public/110627-astrad-nat-port-mapping/

http://switzernet.com/3/public/112706-astrad-forcing-expire-time/

http://switzernet.com/3/public/110609-astradv8-notify/

http://switzernet.com/3/public/110601-astradV7-validation/

http://switzernet.com/3/public/110523-astrad-wish-list/

http://switzernet.com/3/public/110126-astrad-versions/

http://switzernet.com/3/public/110317-db3-versions/