NATの背後にあるクラウドAsteriskサーバーをhello-worldの例でセットアップしようとしています。NATの問題があります。Asteriskが提供しているIPアドレスSDPを介してクライアントに送信されるのは、外部アドレスではなく、NATの背後にあるローカルアドレスです。
sip.conf
にexternip
値を設定しようとしましたが、効果がないようです。
[general]
externip=xxx.yyy.zzz.vvv
nat=yes
tcpenable=yes
クライアントで受信したSDPがサーバーのexternip
設定と一致していません。
v=0
o=root 291445984 291445984 IN IP4 172.31.46.110
s=Asterisk PBX 11.7.0~dfsg-1ubuntu1
c=IN IP4 172.31.46.110
t=0 0
m=audio 10078 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=sendrecv
m=video 0 RTP/AVP 96
SDPのアドレスがexternip
フィールドで指定されたアドレスと一致することを期待しています。実際のIPアドレスと、DNSを介してIPアドレスに正しく解決されるサーバー名の両方を試しました。
externip
値を間違って設定していますか?または、Asteriskに外部IPアドレスをアドバタイズさせるために必要な別の設定はありますか?
localnet
を設定するのを忘れました。構成ファイルは、これをローカルネットワークのネットブロックと等しく設定する必要があることを警告していました。
;----------------------------------------- NAT SUPPORT ------------------------
;
; WARNING: SIP operation behind a NAT is tricky and you really need
; to read and understand well the following section.
;
; When Asterisk is behind a NAT device, the "local" address (and port) that
; a socket is bound to has different values when seen from the inside or
; from the outside of the NATted network. Unfortunately this address must
; be communicated to the outside (e.g. in SIP and SDP messages), and in
; order to determine the correct value Asterisk needs to know:
;
; + whether it is talking to someone "inside" or "outside" of the NATted network.
; This is configured by assigning the "localnet" parameter with a list
; of network addresses that are considered "inside" of the NATted network.
; IF LOCALNET IS NOT SET, THE EXTERNAL ADDRESS WILL NOT BE SET CORRECTLY.
; Multiple entries are allowed, e.g. a reasonable set is the following:
;
; localnet=192.168.0.0/255.255.0.0 ; RFC 1918 addresses
; localnet=10.0.0.0/255.0.0.0 ; Also RFC1918
; localnet=172.16.0.0/12 ; Another RFC1918 with CIDR notation
; localnet=169.254.0.0/255.255.0.0 ; Zero conf local network
実際、例のlocalnet
ディレクティブの4つすべてのコメントを外して、それを1日と呼ぶのは通常は問題ありません。
(そして、サービスプロバイダーのIPv6サポートの欠如について非常に大声で文句を言う必要があります...)