Collegare due Asterisk dietro un NAT, uno con IP pubblico statico e l'altro dinamico

Vogliamo collegare due server Asterisk attraverso un trunk IAX. Entrambi dietro un NAT. Uno con IP pubblico statico e l'altro collegato ad un ADSL con IP dinamico.

Configurazione del server Asterisk con IP dinamico (server A)

Trunk name

milano

Peer details:

deny=all
allow=ulaw,alaw
type=friend
host={ip-statico-server-b}
qualify=yes
context=from-internal
secret=any-strong-password
auth=md5

Register string:

bergamo:any-strong-password@{ip-statico-server-b}

Configurazione del server Asterisk con IP statico (server B)

Trunk name

bergamo

Peer details:

deny=all
allow=ulaw,alaw
type=friend
host=dynamic
qualify=yes
context=from-internal
secret=any-strong-password
auth=md5

Configurazione del firewall

In entrambi i firewall sarà necessario configurare il port forwarding della porta UDP 4569. Se il firewall collegato all'ADSL con IP pubblico dinamico è un pfSense dovremo creare uno script che resetterà le connessioni stabilite tra i centralini Asterisk ogni volta che l'IP dinamico sarà cambiato. Configureremo poi cron per fargli esseguire questo script ogni minuto... oppure ogni 5. Il valore della variabile provider_voip_ip deve essere l'ip-statico-server-b

#!/bin/sh
# 
# Clear voip phone states entries when wan ip changes.
# 
# HowTo:
#       - From pfSense shell
#       - ee
#       - paste this code
#       - Change the value of ext_if, local_voip_ip and provider_voip_ip
#       - press esc a a
#       - save as /usr/local/etc/rc.d/voipstate.sh 
#       - chmod 744 /usr/local/etc/rc.d/voipstate.sh
#
# Cronjob:
#       - In pfSense webgui Diagnostics -> Edit File
#       - load /cf/conf/config.xml
#       - under cron add 
#               <item>
#                       <minute>*/1</minute>
#                       <hour>*</hour>
#                       <mday>*</mday>
#                       <month>*</month>
#                       <wday>*</wday>
#                       <who>root</who>
#                       <command>/usr/local/etc/rc.d/voipstate.sh</command>
#               </item>
#       - save the config.xml
#       - reboot pfSense
#

ext_if="pppoe0" # Enter Your Wan Nic Name em0, vlan1
voip_file="/var/run/voip_file.ip"
local_voip_ip="{ip-privato-server-a}"
provider_voip_ip="{ip-pubblico-server-b}"
EXIT_SUCCESS=0
EXIT_FAILURE=1
if [ `id -u` -ne 0 ]
then
echo "Only root may run this program."
exit $EXIT_FAILURE
fi
usage(){
echo "Usage: $0"
}
get_ip(){
if [ -f $voip_file ]
then
registered_ip=`cat ${voip_file}`
else
registered_ip=""
fi
current_ip=`ifconfig ${ext_if} | awk '/inet / { print $2 }'`
}
update_hosts(){
if [ "$registered_ip" != "$current_ip" ]
then
echo "WAN ip address changed, clearing states entries.. " | logger
echo
/sbin/pfctl -k $local_voip_ip -k $provider_voip_ip
echo $current_ip > $voip_file 
echo "done." | logger
fi
}
#
# Main
#
get_ip
update_hosts
exit $EXIT_SUCCESS