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