Asterisk NAT

2008年7月12日 (土) 18:35時点におけるMR G (トーク | 投稿記録)による版 (画像をつけてみた.)

目次

a) Asteriskサーバがグローバル、端末がNAT背後

イメージ図

Asteriskサーバ側がグローバルIPアドレスを持ち、それにアクセスする端末側がNAT背後にある場合の対応は比較的簡単です。
sip.confの各セクションに次のように記述します。

[201]
type=friend
username=201
secret=*****
context=default
host=dynamic
canreinvite=no
callgroup=1
pickupgroup=1
dtmfmode=rfc2833
disallow=all
allow=ulaw
qualify=1000
nat=yes

nat=yesを記述します。また相手(端末側)のNATテーブルをキープするためにqualify=1000(単位はミリ秒)を記述しておくと良いでしょう。遅延の大きい端末相手ならば2000あたりに設定します。
この方法でフリースポットやM-Zoneなどのホットスポット系から使用できることを確認しています。

b) AsteriskサーバがNAT背後

この場合は、かなりやっかいです。接続ないしRegisterする相手側がAsteriskの場合で、グローバルIPアドレスを持つ場合には相手にnat=yesを記述してもらえれば解決しますが、そうでない場合には対向先の状況にかなり依存するようです。

対応1

sip.confのgeneralセクションに以下のように記述してみます。

externip=xxx.xxx.xxx.xxx
externhost=sip.hogehoge.net
localnet=192.168.0.0/255.255.0.0

外側のIPアドレスが不明な場合にはDDNS(Dynamic DNS)サービスを利用するなどしてexternhost=を記述します。
ルータのNATを調整し、SIP(5060/UDP)とRTP(デフォルトでは10000~20000/UDP)をAsteriskサーバのローカルIPアドレスに向けます。
ただし、これらの対処を行ってもRegisterできないITSPがあります。

対応2

上記の方法で解決しない場合、ヤマハのルータを使えば解決する場合があります。ヤマハのルータではSIP-NAT機能を持つものがあり、これを利用することでAsteriskをNAT背後で動作させることが可能です。ただし、この方法についてはヤマハが保証しているわけではありませんので、ヤマハには問い合わせないで下さい。

  • ルータ自体のVoIP(IP電話)機能はオフにします
  • (当然ながら)SIPとRTPのポートはフィルタで開けます
  • 以下のコマンドでSIP-NATと静的マスカレードを設定します
nat descriptor type 200 masquerade
nat descriptor address outer 200 primary
nat descriptor sip 200 on
nat descriptor masquerade static 200 1 192.168.xxx.xxx udp 5000-5060
nat descriptor masquerade static 200 2 192.168.xxx.xxx udp 4569

この例ではRTPのポートに5000~5059/UDPを使用しています。またIAXも静的マスカレードを行っています。

Asterisk側では対応1と同じように外側のIPアドレスまたはホスト名を記述します。

externip=xxx.xxx.xxx.xxx
externhost=sip.hogehoge.net
localnet=192.168.0.0/255.255.0.0

対応1の方法ではRegisterできなかったITSPも、これで使用できる場合があります。

qualify

NATテーブルの保持のためITSP接続時でも相手に対してqualifyを指定するとテーブル維持に効果があります。ただし、ITSP側から文句を言われる可能性はあります。

c) Asteriskも端末もNAT背後

a)とb)の方法を組み合わせます。なお、b)の方法を実施するには外側IPアドレスがわからなくてはなりませんので、DDNSを使用する必要があります。端末側からAsteriskに接続するにはDDNSで取得したFQDNを指定します。

d) どうしてもダメな場合

IAXで接続させてくれるITSPを選択するのがベストでしょう。