使用 DDNS 的問題

從 $1

對於使用 DDNS 的 Trunk,當對方主機的 IP 變更後,該 Trunk 總是呈現 UNREACHABLE 狀態,即使 DNS 紀錄已經被更新了。

Ans: 將以下程式碼,使用 Cron 定時執行它。此程式在運作時不會對線上的通話有任何影響

檔名:ast-fix-ddns.sh
#!/bin/bash
# written by alang
# updated by 2009/8/30
#
PEER="hkpbx" # Peer name which is using dynamic IP
ASTCMD="/usr/sbin/asterisk -rx"
NSCMD="/usr/bin/nslookup" # It is not necessary

STATUS=$($ASTCMD "sip show peer $PEER" | grep Status | cut -f 2 -d ":" | sed 's/ //g')
PEERHOST=$($ASTCMD "sip show peer $PEER" | grep ToHost | cut -f 2 -d ":")
OLDIP=$($ASTCMD "sip show peer $PEER" | grep "Addr->IP" | cut -f 2 -d ":" | awk -F "Port" '{print $1}' | sed 's/ //g')

if $($NSCMD $PEERHOST > /dev/null 2>&1);then
   NEWIP=$($NSCMD $PEERHOST | grep Add | grep -v "#" | cut -f 2 -d ' ')
else
   NEWIP=$(ping -c1 $PEERHOST 2>/dev/null | sed -n '/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)/p' | sed -n '1p' | sed 's/.* (//' | sed 's/).*$//')
fi

if [ $STATUS == "UNREACHABLE" ];then
  [ "x$NEWIP" != "x" -a "x$NEWIP" != "x$OLDIP" ] && $ASTCMD "sip reload"
fi
#EOF

Notes:
1. PEER, 使用 DDNS 的 Trunk Name。
2. ASTCMD, 系統上 asterisk 指令路徑。
3. NSCMD, 系統上 nslookup 指令路徑。

Update:
2009/8/30

  • 解析 IP 時若系統無 nslookup 指令會使用 ping 指令取代 (此法可用於 embedded system)

Cron table 設定每10分鐘執行

#>crontab -e

*/10 * * * * /root/bin/ast-fix-ddns.sh > /dev/null 2>&1

Notes: 指令的路徑請自行修改。

自己的主機使用 Dynamic IP,只要 IP 變更,所有 SIP Trunk 都會無法連結

寫一個 Cron job 定時偵測自己的外部 IP 是否已變更,若有變更時,自動重啟 asterisk 服務即可。重啟服務的期間會終止所有通話功能

技巧提示:

  • 取得主機目前的外部 IP 位址
EXTIP=$(wget -q -O - http://checkip.dyndns.com|cut -b77-92|tr -d "</body>");echo $EXTIP

  • 修改為 static IP 模式時,系統要作 sip reload;若修改為 dynamic IP 模式,系統要作服務重啟。
  • 以上若選擇前者,為了不會對系統原始設計架構有任何影響,將新 IP 寫入一個新檔 sip_externip.conf,然後在 sip.conf 使用 include 方式套用。

參考詳細資訊

 

 

標籤:
 
註解 (3)
查看第3個(總3個)評論: 查看所有
Hi,我裝了一套Asterisk(Elastix)在我的主機,但是因為使用動態IP,因此每次IP變動后都要重新設置Asterisk,十分麻煩,有沒有什麼辦法可以讓主機自動檢測IP的變動,并自動更新Asterisk系統內的IP設定值。
謝謝。
KK
發佈時間 21:58, 28 Oct 2009 ()
此篇的第二段就是有關這,請閱讀參考連結的範例。
發佈時間 16:31, 29 Oct 2009 ()
謝謝您,幫了我一個大忙,繞了兩個大圈才弄明白,感恩哦!
發佈時間 22:28, 23 Nov 2009 ()
查看第3個(總3個)評論: 查看所有
您必須 登入 才能發佈評論。