ปัญหาเรื่องเสียงของ elastix เมื่อใช้ dynamic ip address

|

Q : คู่สนทนาไม่ได้ยินเสียงพูดของอีกฝ่ายเมื่อติดตั้ง elastix บน ADSL ที่เป็น dynamic IP.
A : เรื่องมันยาว…
โดยปกติเมื่อเราใช้งาน Elastix ที่มี ip จริง เราจะสามารถโทรหากันได้อย่างมีความสุขทั้งฝั่งโทรและฝั่งรับเสียงใสแจ๋ว
แต่เมื่อเราใช้บน ADSL ที่มี ip address เป็นแบบ dynamic ก็จะเกิดปัญหา ได้ยินมั่ง ไม่ได้ยินมั่ง หรือ ไม่ได้ยินเลย

หนึ่งในวิธีแก้ (ปัจจัยของ VoIP มีเยอะดังนั้นขอเรียกว่าเป็นหนึ่งในวิธีแก้)
คือ การทำให้ Elastix รู้จักว่าตัวเองมี ip address อะไรโดยแก้ไขค่า /etc/asterisk/sip_nat.conf

How-to

# vi /etc/asterisk/sip_nat.conf
ใส่ค่าเหล่านี้ลงไป
nat =yes
externip =58.8.8.8
localnet =192.168.1.0/255.255.255.0
qualify =yes
externrefresh =10

ค่า externip จะเป็น ip address ของเราที่ใช้อยู่ขณะนั้น โดยดูได้จากตัว router หรือ http://whatismyip.com
ค่า localnet ให้แก้ไขเป็นวง network ของ Elastix

จบ

แต่เนื่องจาก เราใช้ ADSL นั่นหมายความว่าทุกครั้งที่เรา disconnect แล้ว connect ใหม่ เราจะได้ ip address ใหม่
ดังนั้นเราจึงต้องทำ script สำหรับให้ Elastix เปลี่ยน ip address ให้โดยอัตโนมัติ

# touch /var/lib/asterisk/agi-bin/checkip.pl
# chown asterisk:asterisk /var/lib/asterisk/agi-bin/checkip.pl
# chmod 755 /var/lib/asterisk/agi-bin/checkip.pl
# vi /var/lib/asterisk/agi-bin/checkip.pl
ใส่ค่าเหล่านี้ลงไป

#!/usr/bin/perl
#
# This program gets the current IP address (as assigned by the ISP) from
# whatismyip.org and modifies /etc/asterisk/sip_nat.conf if the external IP
# address has changed. You can Use Webmin to install any missing Perl
# modules, and to invoke the script as cron job that runs every 5 minutes
#
use strict;
use warnings;
use WWW::Mechanize;
use Tie::IxHash;
use Data::Validate::IP qw(is_public_ipv4);
my $s_filepath = “/etc/asterisk/sip_nat.conf”;
my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->get(‘http://whatismyip.com/automation/n09230945.asp’);
$mech->success or die ‘Cannot connect to http://whatismyip.com/automation/n09230945.asp’;
my ($ip) = ($mech->content() =~ /(\d+\.\d+\.\d+\.\d+)/);
if (is_public_ipv4($ip)) {
tie my %configvars, ‘Tie::IxHash’;
# The ‘fromdomain’ (& possibly ‘localnet’) values in the next line MUST be changed
%configvars = (‘nat’ => ‘yes’, ‘externip’ => ‘0.0.0.0’,’fromdomain’ => ‘foo.dyndns.com’,’localnet’ => ‘192.168.0.0/255.255.255.0’) ;
open IN,”<$s_filepath”;
while (my $i = ) {
chop $i;
if ($i =~ /=/) {
$i =~ s/\s//g;
my ($key,$value) = split /=/,$i;
$configvars{$key} = $value;
}
}
close IN;
if ($configvars{‘externip’} ne $ip) {
$configvars{‘externip’} = $ip;
open OUT,”>$s_filepath”;
while (my ($key, $value) = each %configvars) {
select OUT;
print “$key=$value\n”;
};
select STDOUT;
close OUT;
`/usr/sbin/asterisk -rx reload`;
};
};

แก้ไข foo.dyndns.com เป็น dynamic dns domain ที่จดไว้ เช่น sourcode.dyndns.org
แก้ไข 192.168.0.0/255.255.255.0 ให้เป็นวง network ของ Elastix

จากนั้น ทำการทดสอบ script
# cd /var/lib/asterisk/agi-bin
# perl checkip.pl

ซึ่งถ้ามันทำงาน มันจะไม่มีอะไรเกิดขึ้น
ซึ่งถ้าท่านผู้อ่านได้ลองทำตามยังไงก็ error แบบนี้

[email protected]:/var/lib/asterisk/agi-bin $ perl checkip.pl
Can’t locate WWW/Mechanize.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at checkip.pl line 11.
BEGIN failed–compilation aborted at checkip.pl line 11.
[email protected]:/var/lib/asterisk/agi-bin $

ถ้าเจอแบบข้างบนแสดงว่ามาถูกทางละ
ให้แก้ไขตามนี้

# yum install perl-Tie-IxHash.noarch
# yum install perl-Net-Netmask.noarch
# wget ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el5/en/ppc/RPMS.fabian/perl-Data-Validate-IP-0.10-1.el5.rf.noarch.rpm
# rpm -ivh perl-Data-Validate-IP-0.10-1.el5.rf.noarch.rpm

จากนั้นลองทดสอบอีกครั้ง
# cd /var/lib/asterisk/agi-bin
# perl checkip.pl

ครั้งนี้จะไม่เกิด error ละผ่านแน่นอน ถ้าไม่ผ่านให้ย้อนกลับไปทำอีกรอบ !
จากนั้นทำการสร้าง crontab เพื่อให้ script ทำงานทุกชั่วโมง

# crontab -e
ใส่ค่าเหล่านี้ลงไป
0 * * * * perl /var/lib/asterisk/agi-bin/checkip.pl >/dev/null 2>&1

เช็คเพื่อความถูกต้อง
# crontab -l
จะต้องได้ผลลัพย์ออกมาเป็น
0 * * * * perl /var/lib/asterisk/agi-bin/checkip.pl >/dev/null 2>&1

จบ

credit :
http://fonality.com/trixbox/forums/trixbox-forums/help/nat-problems-changed-sipnatconf-and-still-no-audio
http://adminschoice.com/crontab-quick-reference

love

ความรัก ทำให้คนอายุลดลง 10 ปี
ถ้าเรามีความรัก หลายๆ ครั้ง เราก็ไม่แก่เลยซิ ?

ปล. ความรักในที่นี้ไม่ได้หมายถึงความรักแบบหนุ่มสาวเท่านั้น อาจเป็นครอบครัว พี่น้อง ว่ากันไป

|