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