Modifications entre les versions 1 et 2
Version 1 à la date du 2008-05-15 13:21:27
Taille: 2575
Commentaire: allez zou, une solution qui marche, une ! :-)
Version 2 à la date du 2008-05-15 13:21:56
Taille: 2575
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 7: Ligne 7:
En revanche quand Asterisk est derrière un NAT géré par Linux, lui même derrière un NAT non contrôlable (par exemple un modem ADSL), là les choses se corsent... Ça ne marche tout simplement pas car l'IP reçue par le correspondant est soit celle du serveur Asterisk, soit celle de la passerelle NAT (quand on utilise `nf_nat_sip`). En revanche quand Asterisk est derrière un NAT géré par Linux, lui même derrière un NAT sans support SIP (par exemple un modem ADSL), là les choses se corsent... Ça ne marche tout simplement pas car l'IP reçue par le correspondant est soit celle du serveur Asterisk, soit celle de la passerelle NAT (quand on utilise `nf_nat_sip`).

Présentation de la configuration « Asterisk derrière du NAT » au CNF de Hanoï.

Problème

Quand Asterisk a son IP publique, pas de souci. Quand Asterisk est derrière un NAT géré par Linux, ça peut encore passer grâce au module nf_nat_sip des noyaux récents (>= 2.6.20, il me semble).

En revanche quand Asterisk est derrière un NAT géré par Linux, lui même derrière un NAT sans support SIP (par exemple un modem ADSL), là les choses se corsent... Ça ne marche tout simplement pas car l'IP reçue par le correspondant est soit celle du serveur Asterisk, soit celle de la passerelle NAT (quand on utilise nf_nat_sip).

Solution

Il s'agit de configurer Asterisk en mode NAT externe et d'attribuer une plage de ports pour recevoir les flux RTP.

Configuration d'Asterisk

  • Le support du NAT pour SIP est à activer dans /etc/asterisk/sip.conf :

  • ; envoyer des paquets toutes les 60 secondes pour « conserver la ligne » (timeout NAT)
    rtpkeepalive=60
    ; l'adresse IP publique (la votre) à indiquer dans toutes les requêtes SIP
    externip = AAA.BBB.CCC.DDD
    ; les adresses de réseau locaux pour lesquels il ne faut pas utiliser l'IP externe
    localnet = 10.0.0.0/8
    localnet = 172.16.0.0/12
    localnet = 192.168.0.0/16
    ; ne pas faire de NAT avec les postes clients (ils sont sensés être routés)
    nat = no
  • Il faut spécifier une plage de ports dans /etc/asterisk/rtp.conf pour recevoir les flux RTP :

  • rtpstart=50600
    rtpend=50699

Configuration de la passerelle Linux

  • Il ne faut surtout pas utiliser le module nf_nat_sip (ou ip_nat_sip dans les anciens noyaux) faute de quoi l'adresse externip indiquée par Asterisk serait remplacée par l'adresse externe de la passerelle Linux !! Donc vérifier qu'il n'est pas chargé dans /etc/modules, le commenter si c'est le cas, voir même le mettre en liste noire en l'ajoutant dans /etc/modprobe.d/blacklist.

  • Il faut transférer les demandes de connexions destinées aux ports UDP entre 50600 et 50699 vers le serveur Asterisk, par exemple :
  • iptables -t nat -I PREROUTING -i $IF_EXTERNE -p udp -m multiport --dports 4569,5060,50600:50699 -j DNAT --to-destionation $IP_ASTERISK
    iptables -t filter -I FORWARD -d $IP_ASTERISK -p udp -m multiport --dports 4569,5060,50600:50699 -j ACCEPT

Configuration du modem ou autre matériel externe faisant aussi du NAT

  • Il faut transférer les demandes de connexions destinées aux ports UDP entre 50600 et 50699 vers la passerelle Linux.

ZAP/Hanoi/CNF/VoIP (dernière édition le 2008-05-15 13:27:29 par JeanChristopheAndré)