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 }}} * Relancer le service Asterisk ! On peut peut-être se contenter de lui faire recharger sa configuration, mais... On est jamais trop sûr avec cette bestiole ! ;-) == 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 dans `/etc/modules` qu'il n'est pas chargé au démarrage. Si c'est le cas, le décharger du noyau avec `modprobe -r nf_nat_sip` (ou `modprobe -r ip_nat_sip`) et le commenter, 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 avec NAT sans support SIP == * Il faut transférer les demandes de connexions destinées aux ports UDP entre 50600 et 50699 vers la passerelle Linux.