Asterisk et NAT

Oussama Hammami, 2011-03-03

Switzernet

 

 

 

Le routeur NAT

Un routeur, comme son nom l'indique, redirige les paquets qu'il reçoit en fonction d'une table de routage vers le routeur suivant jusqu'à atteindre le réseau local de destination. Chaque paquet comporte l'adresse d'origine et l'adresse de destination. Dans le cas d'adresses privées, l'adresse d'origine est une adresse privée inconnue de l'Internet. Le destinataire ne pourra pas répondre. Il faut donc remplacer l'adresse privée d'origine par une adresse publique. C'est le travail du routeur NAT (Network Address Translation) qui effectue la transformation des adresses.

Pour pouvoir configurer correctement un routeur NAT, il faut comprendre la notion de port.

Le protocole TCP/IP utilise des ports (un nombre de 0 à 65535) comme le moyen de nommer les bouts d'une connexion logique, une conversation qui comporte plusieurs échanges. Les ports permettent de réaliser simultanément des milliers de connexions logiques sur la même adresse IP. Ils permettent de partager la liaison Internet entre des programmes différents et des machines différentes. Comme pour les adresses IP, l'IANA a classé les ports en 3 catégories [http://www.iana.org/assignments/port-numbers].

 

Par défaut, le protocole SIP utilise le port 5060, http le port 80, le SMTP le port 25, etc...

Lorsqu'une machine du réseau local envoie des paquets à un serveur à l'extérieur, l'adresse d'origine est une adresse privée. Le destinataire ne pourra pas répondre à cette adresse. Pour résoudre ce problème, le routeur NAT remplace l'adresse et le port d'origine par l'adresse Internet publique du routeur et un numéro de port libre choisi au hasard en notant adresse et port associés à la machine locale (voir sur le dessin ci-après).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

La machine de destination renvoie la réponse sur l'adresse et le port visible de l'Internet au routeur NAT. Celui-ci fait alors la transformation inverse pour renvoyer les paquets vers la machine locale. Dans ce cas de figure, il n'y a rien de spécial à configurer. C'est comme cela que fonctionnent les messageries instantanées. Le logiciel de la machine sur le réseau privé se connecte au serveur de messagerie qui connaît ainsi l'adresse externe et le numéro de port du routeur qui permet de contacter cette machine.

En revanche, une machine qui appelle depuis l'Internet pour atteindre une adresse privée n'a aucun moyen d'y arriver puisque le routeur ne sait pas sur quelle machine du réseau Interne, il faut router l'appel. Il existe un moyen qui s'appelle port forwarding.

Les problèmes engendrés par le NAT

Pour être pratiques et courantes, les fonctionnalités du NAT n’en posent pas moins des problèmes de nature différente, comme les protocoles dits « sensibles » au NAT, la difficulté de recevoir une connexion derrière un NAT ou la sécurité.

Le problème le plus important à considérer concerne les protocoles dits « sensibles » au NAT. C’est le cas des principaux protocoles de signalisation utilisés pour les échanges multimédias, dont H.323, SIP et MGCP, mais également de bien d’autres protocoles, comme Kerberos, SNMP, DNS, ICMP ou encore les protocoles de partage de fichiers tels que FTP et les protocoles de mobilité tels que IP Mobile.

Ces protocoles ne se contentent pas de mentionner leur adresse IP dans l’en-tête des paquets qu’ils envoient, mais ils l’indiquent également dans le corps de leurs messages.

Par exemple, avec le protocole SIP, un message d’invitation INVITE comporte dans le paquet des informations sur l’adresse IP de la source. Ces informations permettent d’établir entre les correspondants la connexion dans laquelle les données véritables (la voix ou la vidéo notamment) sont transmises. Dans cette situation, même si le boîtier NAT modifie l’adresse IP source du paquet, le récepteur ne peut répondre correctement à la requête puisque cette dernière comporte une adresse IP source initiale, qui est une adresse privée. Le récepteur envoie donc sa réponse vers l’adresse IP source spécifiée qui ne lui est pas accessible, et le paquet de réponse n’arrive jamais à son destinataire.

Cette contrainte ne se pose pas pour toutes les applications. Par exemple, les flux d’application Web utilisent le protocole HTTP, dont les paquets ne contiennent pas l’adresse IP de la source à l’origine de la requête. En conséquence, le récepteur peut répondre sans connaître de problème de routage. Ce cas est en fait celui de la majorité des protocoles mais pas des protocoles de signalisation tels que SIP et H.323.

 

Contrairement aux protocoles SIP et H.323, qui n’assurent que la fonction de signalisation et se combinent généralement à RTP pour la fonctionnalité de transport des flux, le protocole IAX est à la fois un protocole de transport et un protocole de signalisation. Cela lui permet plus facilement de traverser les pare-feu et de supporter les translations d’adresses IP (NAT) dans un réseau. Ses flux n’utilisent qu’un port fixe et unique (le port 4569) et peuvent de la sorte être aisément identifiés.

Asterisk et NAT

SIP est un protocole qui permet d’initialiser et de terminer une session entre deux interlocuteurs.

Pour le temps de la communication, c’est le protocole RTP qui est utilisé.

Dans Asterisk, tous les messages SIP passent par le serveur, avant d’être redirigé vers le bon peer.

Le protocole RTP par contre, fonctionne de façon décentralisée, peer-to-peer.

Asterisk ne fonctionne donc, de façon générale, uniquement comme un relais permettant l’initialisation de la communication, et les paquets transportant la voix sont directement échangés entre les différents clients.

Cependant, le protocole NAT pose quelques soucis aux systèmes peer-to-peer, et plus particulièrement à l’échange des paquets de voix dans le protocole RTP. C’est pourquoi le serveur Asterisk sera configuré, dans ce cas-ci, de façon à centraliser les appels. Ceci signifie que tous les paquets RTP seront envoyés de l’interlocuteur au serveur avant d’être redirigés vers le bon client, l’autre interlocuteur.

Voilà pourquoi le serveur doit pouvoir supporter une charge de 32 Mbps. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de contourner le problème dû à NAT.

Il y a 200 téléphones par serveur, donc au maximum 200 communications simultanées. Chaque client envoie et reçoit en moyenne 10 ko/s. Pour une communication, le serveur transmet par conséquent 20 ko/s par client. La charge maximale estimée est donc de 20 ko/s * 200 = 4 Mo/s = 32 Mbps. Il faut donc 32 Mbps en upstream et 32 Mbps en downstream.

 

"When SIP was designed it was expected that IP V.6 would be widely available by the time of first services deployment. Unfortunatly this is not the case and the concept of NAT had to be added to SIP."

 

Cette citation illustre le fait que NAT pose un réel problème par rapport à l’idée initiale des développeurs d’Asterisk. Il est important de noter que les administrateurs pourront rebasculer à une configuration « décentralisée » si IPv6 venait à se déployer.

 

Les ports utilisés par Asterisk sont les suivants, côté serveur :

 

Les ports utilisés par les SoftPhone SIP sont les suivants :

 

Linksys SPA921

 

Siemens C470

 

Siemens C450

 

rtp.conf

[general]

;

; RTP start and RTP end configure start and end addresses

;

; Defaults are rtpstart=5000 and rtpend=31000

;

 

Configuration dans sip.conf

Parmi les paramètres décrivant un compte d’utilisateur on a :

canreinvite Ce paramètre peut prendre les valeurs yes ou no. Si sa valeur est fixée à yes, Lorsqu’une communication st en train de s’établir le serveur Asterisk va récupérer des informations notamment vers qui envoyer les flux) et ils les réémettra dans un nouveau message d’invitation une fois que la communication sera acceptée seulement.

Attention, si l’utilisateur se trouve derrière un NAT, il est indispensable de mettre la valeur de ce paramètre à no pour laisser passer les flux multimédia correctement, car le nouveau message ’invitation du serveur Asterisk ne tiendrait pas compte du NAT.

 

nat Précise si les flux traversant un réseau utilisent la translation d’adresse (NAT). La valeur du paramètre nat est yes ou no.

Ce paramètre est souvent indispensable car l’utilisation du nat est classique, même chez les particuliers.

Paramètre NAT dans Realtime

Configuration

extconfig.conf

[settings]

sippeers => mysql,asterisk,sippeer

sipusers => mysql,asterisk,sipuser

 

sip.conf

 [general]

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@91.121.99.16

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> use asterisk

mysql> select * from sipuser ;

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

| id | name        | context     | secret       | deny                                                   | nat  |

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

|  1 | 41215500329 | fromaccount | PASSWORD1    | 94.23.242.200;91.121.147.45;94.23.225.212;91.121.99.16 | yes  |

|  2 | 41215504127 | fromaccount | PASSWORD2    | 94.23.242.200;91.121.147.45;94.23.225.212;91.121.99.16 | yes  |

|  3 | 41215500327 | fromaccount | PASSWORD3    | 94.23.242.200;91.121.147.45;94.23.225.212;91.121.99.16 | yes  |

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

 

mysql> select * from sippeer;

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

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

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

|  1 | 94.23.242.200 | 94.23.242.200 | fromip   | port     | NULL         |  5060 |       NULL | NULL        | NULL         | yes  |

|  2 | 91.121.147.45 | 91.121.147.45 | fromnode | port     | NULL         |  5060 |       NULL | NULL        | NULL         | yes  |

|  3 | 94.23.225.212 | 94.23.225.212 | fromnode | port     | NULL         |  5060 |       NULL | NULL        | NULL         | yes  |

|  4 | 41215500329   | dynamic       | NULL     | NULL     | 81.62.111.35 | 53894 | 1299235277 | 41215500329 | PASSWORD1    | yes  |

|  5 | 41215504127   | dynamic       | NULL     | NULL     | NULL         |  NULL |       NULL | NULL        | PASSWORD2    | yes  |

|  7 | 41215500327   | dynamic       | NULL     | NULL     | NULL         |  NULL |       NULL | NULL        | PASSWORD3    | yes  |

|  8 | 91.121.167.75 | 91.121.167.75 | fromnode | port     | NULL         |  5060 |       NULL | NULL        | NULL         | yes  |

|  9 | 91.121.99.16  | 91.121.99.16  | fromnode | port     | NULL         |  5060 |       NULL | NULL        | NULL         | yes  |

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

Validation

L’objective de ces testes est de savoir lesquels des paramètres (le NAT de la table sipuser ou sippeer) Asterisk utilise pour activer NAT.

On a configuré deux téléphones :

Modèle de téléphone

Serveur

Compte

Siemens C470 

91.121.205.108 (Asterisk)

41215500329

Linksys SPA921

91.121.99.16

41215500327

 

Sipuser

Sippeer

Résultat

41215500329

41215500327

41215500329

41215500327

91.121.99.16

41215500327 -> 41215500329

41215500329 -> 41215500327

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Never

Yes

Yes

Yes

Yes

Yes

Never

Yes

Yes

Yes

Yes

Yes

No annex 1

Yes

Yes

Never

Yes

Yes

No annex 2

Yes

Yes

Yes

Yes

Never

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Never

Yes

No annex 3


Annexe  1

Erreur durant l’autorisation de l’appel

U 81.62.111.35:53894 -> 91.121.205.108:5060

INVITE sip:41215500327@astrad9.switzernet.com;user=phone SIP/2.0.

Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK4f04197a616c95cb414061871df176f0;rport.

From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=1793765550.

To: <sip:41215500327@astrad9.switzernet.com;user=phone>.

Call-ID: 4168805401@192_168_1_188.

CSeq: 2 INVITE.

Contact: <sip:41215500329@192.168.1.188:5060>.

Max-Forwards: 70.

User-Agent: C470 IP/022270000000.

Supported: replaces.

Allow-Events: message-summary, refer.

Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, INFO, REFER, SUBSCRIBE, NOTIFY.

Content-Type: application/sdp.

Content-Length: 356.

.

v=0.

o=41215500329 16400 10 IN IP4 192.168.1.188.

s=Mapping.

c=IN IP4 192.168.1.188.

t=0 0.

m=audio 16400 RTP/AVP 0 8 96 97 2 18 101.

a=rtpmap:0 PCMU/8000.

a=rtpmap:8 PCMA/8000.

a=rtpmap:96 G726-32/8000.

a=rtpmap:97 AAL2-G726-32/8000.

a=rtpmap:2 G726-32/8000.

a=rtpmap:18 G729/8000.

a=fmtp:18 annexb=no.

a=rtpmap:101 telephone-event/8000.

a=fmtp:101 0-16.

 

 

U 91.121.205.108:5060 -> 192.168.1.188:5060

SIP/2.0 407 Proxy Authentication Required.

Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK4f04197a616c95cb414061871df176f0;received=81.62.111.35;rport=53894.

From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=1793765550.

To: <sip:41215500327@astrad9.switzernet.com;user=phone>;tag=as5f01ce22.

Call-ID: 4168805401@192_168_1_188.

CSeq: 2 INVITE.

User-Agent: Asterisk PBX.

Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY.

Supported: replaces.

Proxy-Authenticate: Digest algorithm=MD5, realm="switzernet", nonce="5dd344cc".

Content-Length: 0.

Annexe 2

Erreur durant l’enregistrement du téléphone

U 81.62.111.35:53894 -> 91.121.205.108:5060

REGISTER sip:astrad9.switzernet.com SIP/2.0.

Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK889dc116358d1b7f7944ce23ee1ea895;rport.

From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=2567224366.

To: "41215500329" <sip:41215500329@astrad9.switzernet.com>.

Call-ID: 273048415@192_168_1_188.

CSeq: 1 REGISTER.

Contact: <sip:41215500329@192.168.1.188:5060>.

Max-Forwards: 70.

User-Agent: C470 IP/022270000000.

Expires: 180.

Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, INFO, REFER, SUBSCRIBE, NOTIFY.

Content-Length: 0.

.

 

 

U 91.121.205.108:5060 -> 192.168.1.188:5060

SIP/2.0 100 Trying.

Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK889dc116358d1b7f7944ce23ee1ea895;rport;received=81.62.111.35.

From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=2567224366.

To: "41215500329" <sip:41215500329@astrad9.switzernet.com>.

Call-ID: 273048415@192_168_1_188.

CSeq: 1 REGISTER.

User-Agent: Asterisk PBX.

Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY.

Supported: replaces.

Contact: <sip:41215500329@91.121.205.108>.

Content-Length: 0.

.

 

 

U 91.121.205.108:5060 -> 192.168.1.188:5060

SIP/2.0 401 Unauthorized.

Via: SIP/2.0/UDP 192.168.1.188:5060;branch=z9hG4bK889dc116358d1b7f7944ce23ee1ea895;rport;received=81.62.111.35.

From: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=2567224366.

To: "41215500329" <sip:41215500329@astrad9.switzernet.com>;tag=as2f10b3ee.

Call-ID: 273048415@192_168_1_188.

CSeq: 1 REGISTER.

User-Agent: Asterisk PBX.

Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY.

Supported: replaces.

WWW-Authenticate: Digest algorithm=MD5, realm="switzernet", nonce="24c620de".

Content-Length: 0.

.

Annexe 3

Durant ce teste la voix passe dans un seul sens de 41215500327 vers 41215500329

# diff ERR-41215500329-41215500327.txt  OK-41215500329-41215500327.txt

3c3

< Via: SIP/2.0/UDP 91.121.205.108:5060;branch=XXXXXXXXXXXXXXXXXXX.

---

> Via: SIP/2.0/UDP 91.121.205.108:5060;branch=XXXXXXXXXXXXXXXXXXX;rport.

22c22

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

---

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

38c38

< Via: SIP/2.0/UDP 91.121.205.108:5060;branch=XXXXXXXXXXXXXXXXXXX.

---

> Via: SIP/2.0/UDP 91.121.205.108:5060;branch=XXXXXXXXXXXXXXXXXXX;rport=5060.

50c50

< o=Sippy 141859052 1 IN IP4 91.121.99.16.

---

> o=Sippy 141022092 1 IN IP4 91.121.99.16.

53c53

< m=audio 16438 RTP/AVP 0 101.

---

> m=audio 16442 RTP/AVP 0 101.

82c82

< m=audio 5528 RTP/AVP 0 8 18 2 101.

---

> m=audio 5308 RTP/AVP 0 8 18 2 101.

 

L’Asterisk n’ajoute pas correctement le rport selon la  RFC3581 [http://tools.ietf.org/html/rfc3581#section-4]

Référence

http://en.wikipedia.org/wiki/Session_Description_Protocol

http://www.juniper.net/techpubs/software/junos-security/junos-security10.0/junos-security-swconfig-security/sip-alg-understanding.html

http://tools.ietf.org/html/rfc3581#section-4

http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html

http://www.asterisk.org/doxygen/trunk/Config_sip.html

http://www.voip-info.org/wiki/view/Asterisk+sip+directrtpsetup

http://www.voip-info.org/wiki/view/Asterisk+sip+canreinvite

http://my-svn.assembla.com/svn/ulb_asterisk/tex/implem_rapport.pdf

http://www.urec.cnrs.fr/IMG/pdf/cours.rtprsvp.pdf

http://switzernet.com/3/company/110301-asterisk-doc-pdf/1-Asterisk-The-Future-of-Telephony.pdf

http://switzernet.com/3/company/110301-asterisk-doc-pdf/2-T%c3%a9l%c3%a9phonie-sur-IP.pdf

http://switzernet.com/3/company/110301-asterisk-doc-pdf/3-Asterisk-La-telephonie-d-entreprise-libre.pdf