Zoiper5のstunパケットを覗いてみた

wireshark zoiper5 stun

stunとは

zoiper stun

ソフトフォンZoiper5にはstun設定が有ります。
デフォルトでstun.zoiper.comを使用します。
SIPアカウント毎にカスタムstunで任意のstunサーバーを使用する事も出来ます。

stun オン/オフでのSIPパケットの変化

stunオン

INVITE sip:1000@sip.com;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.101:5060;branch=z9hG4bK-524287-1---43f96490bdc84c;rport
Max-Forwards: 70
Contact: sip:2000@210.194.xxx.yyy:62061;transport=UDP
To: sip:1000@sip.com
From: sip:2000@sip.com;transport=UDP;tag=b24b4b
Call-ID: bcF_yDnQ5mXwp1jRGjWwgg..
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SSCRIBE
Content-Type: application/sdp
User-Agent: Z 5.5.8 v2.10.17.2
Allow-Events: presence, kpml, talk
Content-Length: 628
:
v=0
o=Z 279549408 1 IN IP4 210.194.xxx.yyy
s=Z
c=IN IP4 210.194.xxx.yyy
m=audio 8000

stunオフ

INVITE sip:1000@sip.com;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.101:5060;branch=z9hG4bK-524287-1---43f96490bdc84c;rport
Max-Forwards: 70
Contact: sip:2000@192.168.1.101:5060;transport=UDP
To: sip:1000@sip.com
From: sip:2000@sip.com;transport=UDP;tag=b24b4b
Call-ID: bcF_yDnQ5mXwp1jRGjWwgg..
CSeq: 1 INVITE
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SSCRIBE
Content-Type: application/sdp
User-Agent: Z 5.5.8 v2.10.17.2
Allow-Events: presence, kpml, talk
Content-Length: 628
:
v=0
o=Z 279549408 1 IN IP4 192.168.1.101
s=Z
c=IN IP4 192.168.1.101
m=audio 8000

・stunオンの場合、SIPヘッダーのContactとボディ部分のSDPにパブリックIPが入る
・stunオフの場合、SIPヘッダーのContactとボディ部分のSDPにプライベートIPが入る

PCのソフトフォンは自分の環境のグローバルIPアドレスとIPマスカレードされた際のポート番号を知りません。
PBXの様にグローバルIPアドレスが変わらない場合は固定で設定しておくも可能ですが、ソフトフォンなどは絶えずグローバルIPアドレスが変わる可能性が有ります。

それでSIPの通信とは別にstunサーバーに自分のグローバルIPアドレスとポートを定期的に問い合わせます。
帰ってきたグローバルIPアドレスとポートをSIPヘッダーとSDPに埋め込みます。

なぜstunが必要なのか

インターネット上のSIPサーバーに向けてNAT配下のZoiper5から発信した例です。
stunオフの場合です。

SIPヘッダーのContactにプライベートIPが入っているので、応答がプライベートIP宛になってしまい行き先が無くINVITEの再送が繰り返されています。
SIPのやりとりが成立しないので音声は当然疎通しませんが、SDPもプライベートIPになっているのでRTP(音声)も届きません。

・stunはNAT配下のSIPや音声やビデオが外部と通信する為の技術です。
・通信先が同じLAN内の場合、stunは必要ありません。


stunに依存しないNAT超え技術も有ります。
例えばAsteriskではnat=yesに設定する事でSIPヘッダー/SDPがプライベートIPでも、SIPヘッダーを無視してIPヘッダーのグローバルIPに応答を返す事が可能です。

Asterisk sip nat
https://www.voip-info.org/asterisk-sip-nat/

ルーターのSIP-NAT機能

ルーターの機能でパケットがNAT超えする際に、SIPヘッダーとSDPをグローバルIPアドレスに書き換えてくれます。この場合stunは不要です。
ただしSIP-NATを無効にする事を推奨している場合も有ります。

Wiresharkで覗く

XOR-MAPPED-ADDRESSに自分のグローバルIPとポートが入ります。

stun binding

stunの問い合わせをBinding Request, 応答をBinding Success Responseと呼びます。

whatsmydns.netで確認するとSRVレコードで冗長化されていてstun1とstun2のサブドメインにルーティングされている様です。

まとめ

stunはSIPや音声やビデオがNAT超えをする為の技術です。(Session Traversal Utilities for NAT)
stunサーバーに自分のグローバルIPとIPマスカレードされたポートを問い合わせます。
WebRTCやMicrosoft Teamsにも使われています。

stunに依存しないNAT超え技術も有ります。
ルータの機能でパケットを書き換えたり、サーバー側でもNAT超えテクニックが有ります。

TwitterFacebookLinkedInHatenaPocketCopy Link