< 添 付 2> Asterisk の IPv6 対 応 について 2012 年 12 月 3 日 公 開 IPv6 普 及 高 度 化 推 進 協 議 会 IPv4/IPv6 共 存 WG アプリケーションのIPv6 対 応 検 討 SWG
Asteriskは 米 国 Digium 社 の 登 録 商 標 または 商 標 です そのほかの 記 載 の 会 社 名 製 品 名 は それぞれの 会 社 の 商 標 もしくは 登 録 商 標 です 2
はじめに IPv6に 対 応 したアプリケーション 開 発 に 必 要 な 要 素 とし て 開 発 環 境 ツール そしてコーディングなどがあげ られるが これらに 関 し 必 要 な 情 報 が 不 足 している 本 SWGでは 必 要 な 情 報 の 整 理 検 討 を 実 施 し SocketプログラミングとWebサービスに 大 別 したうえで それぞれのガイドラインを 作 成 することにした Socketプログラミングに 関 する 検 討 では アプリケーシ ョンの 例 としてAsterisk(IP-PBXソフトウェア) を 対 象 に IPv6 対 応 方 法 に 関 する 調 査 をした 本 書 では AsteriskのIPv6 対 応 方 法 の 調 査 結 果 を 述 べる Asteriskでは SIPを 用 いているため SIPについ ても 解 説 する 3
SIP SIP(Session Initiation Protocol)とは 2つ 以 上 のクライアント 間 でセ ッションを 確 立 するためのIETF 標 準 の 通 信 プロトコル IETFにて 汎 用 のセッション 制 御 プロトコルとして 開 発 された RFC3261 : Session Initiation Protocol RFC4566 : Session Description Protocol 特 徴 として HTTPに 似 た テキストベースのリクエストとレスポンスに よって 通 信 を 行 い 相 手 先 ( 通 話 先 ) はURI(Uniform Resource Identifier)を 指 定 URIで 得 られる 通 信 先 は 下 位 レイヤではIPの 通 信 先 として 処 理 SIPサーバは 次 の 機 能 から 構 成 プロキシサーバ リダイレクトサーバ ロケーションサーバ レジスターサーバ 4
SIP Protocol Architecture G.711 etc SDP RTP RTCP SIP UDP TCP IP G.711: ITU-T standard for audio companding. SDP: Session Descripton Protocol RTCP: RTP Control Protocol SIP: Session Initiation Protocol RTP: Realtime Transport Protocol TCP: Transmisson Control Protocol UDP: User Datagram Protocol IP: Internet Protocol 5
SIP の 一 般 的 な 接 続 シーケンス Register 100 Trying SIP Server Register 100 Trying Register SIP UA 200 OK 200 OK INVITE / SDP INVITE / SDP SIP UA 100 Trying 180 Ringing 200 OK / SDP 100 Trying 180 Ringing 200 OK / SDP Basic SIP Call ACK BYE 200 OK / SDP RTP stream RTP stream RTCP stream BYE 200 OK / SDP 6 Media (UDP) 厳 密 には レジストラ SIP プロキシ メディアサーバ 等 に 機 能 分 担 されるが こ こでは 単 にSIPサーバとして 扱 う また SIP Server では RTP を 終 端 するも のもあるが ここでは RTP を 終 端 しない ものを 例 示 する
Asterisk について オープンソースの IP-PBX ソフトウェア (IPネットワーク 内 で IP 電 話 端 末 の 回 線 交 換 を 行 う 装 置 およびソフトウェア) http://www.asterisk.org/ 複 数 のバージョン(1.4.x 1.8.x 10.x 11.x) 呼 制 御 SIP/IAX2/H.323 などに 対 応 メディア 音 声 :G.711 G.722 G.729 等 に 対 応 映 像 :H.263 H.264 等 に 対 応 (トランスコードは 不 可 ) 7
Asterisk の IPv6 対 応 について バージョン 1.8 系 より 対 応 ( 最 新 版 は 11.0.1(2012/11/19 現 在 )) IPv6 対 応 箇 所 呼 制 御 (SIP/IAX) SIP は UDP/TCP/TLS に 対 応 管 理 機 能 ( 設 定 用 Web インタフェース AMI:Asterisk Management Interface) メディアトランスポート(RTP/SRTP) IPv4/IPv6 の 相 互 接 続 について B2BUA (ゲートウェイ)を 用 いた 接 続 形 式 で IPv4 端 末 と IPv6 端 末 との 相 互 接 続 が 可 能 (この 場 合 Asterisk が 動 作 し ている 計 算 機 の OS がデュアルスタックで 動 作 していることが 前 提 ) 8
Asterisk の 主 要 機 能 と IPv6 対 応 大 項 目 中 項 目 概 要 IPv6 対 応 呼 制 御 SIP SIP による 呼 制 御 機 能 IAX IAX による 呼 制 御 機 能 H.323 H.323 による 呼 制 御 機 能 Websocket Websocket による 呼 制 御 連 携 メディア 処 理 RTP 音 声 / 映 像 ストリーム 暗 号 化 SIPS 対 応 SIP over TLS SRTP 暗 号 化 RTP 管 理 機 能 AMI Asterisk Management Interface Web インタフェース ブラウザからの 設 定 機 能 PBX 間 連 携 DUNDi Asterisk 間 の 相 互 接 続 機 能 2012/11/1 現 在 (Asterisk 11) 9
SIP メッセージ 例 接 続 例 (Asterisk が B2BUA で 動 作 ) 転 送 相 手 がIPv4かIPv6を Asterisk への 登 録 情 報 を 元 に 判 定 し それぞれの プロトコルに 応 じて SIP メッセージを 組 立 て 転 送 する IPv4 端 末 Asterisk(5060/udp を::/0 でbind) IPv4 IPv6 IPv6 端 末 INVITE sip:6001@192.168.1.212:51784;rinstance=51c2ff3360b4f8d6;transport=udp SIP/2.0 Via: SIP/2.0/UDP 192.168.1.214:5060;branch=z9hG4bK727d226d Max-Forwards: 70 From: "ekiga" <sip:6000@192.168.1.214>;tag=as3350c74c To: <sip:6001@192.168.1.212:51784;rinstance=51c2ff3360b4f8d6;transport=udp> Contact: <sip:6000@192.168.1.214:5060> Call-ID: 4c9d4cb6326cf955529abb9b7a253f6d@192.168.1.214:5060 CSeq: 102 INVITE User-Agent: Asterisk PBX 10.0.0-rc1 Date: Wed, 16 Nov 2011 13:50:02 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,PUBLISH Supported: replaces, timer Content-Type: application/sdp Content-Length: 442 v=0 o=root 318336445 318336445 IN IP4 192.168.1.214 s=asterisk PBX 10.0.0-rc1 c=in IP4 192.168.1.214 b=ct:384 : SIP メッセージ 中 のアドレスにつ いて IPv4/IPv6 のチェックを 行 っている 10 INVITE sip:6001@ietugu.example.com SIP/2.0 Via: SIP/2.0/UDP [2001:db8:1::215:c5ff:fe12:2c68]:5060;branch=z9hG4bK1900520024 From: <sip:6000@ietugu.example.com>;tag=623328519 To: <sip:6001@ietugu.example.com> Call-ID: 134945149 CSeq: 20 INVITE Contact: <sip:6000@[2001:db8:1:1:215:c5ff:fe12:2c68]> Content-Type: application/sdp Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO Max-Forwards: 70 Subject: Phone call Content-Length: 384 v=0 o=6000 123456 654321 IN IP6 2001:db8:1:1:215:c5ff:fe12:2c68 s=a conversation c=in IP6 2001:db8:1:1:215:c5ff:fe12:2c68 b=as:1024 t=0 0 m=audio 7078 RTP/AVP 0 101 : 接 続 情 報 を 転 送 先 にあわ せてIPv6 アドレスを 使 用 して 作 成 する 10
接 続 例 2(ENUMによる 名 前 解 決 ) Asterisk は ENUM にも 対 応 しており インターネット 上 の VoIP 接 続 も 可 能 名 前 解 決 は 標 準 ライブラリ 関 数 の res_search() を 使 用 するため IPv6 対 応 はOS のリゾルバライブラリに 依 存 する IPv4 端 末 IPv4 INVITE To: 9000@example.com Asterisk DNS サーバ インターネット Asterisk ENUM 公 衆 交 換 電 話 網 の 電 話 番 号 体 系 をインターネット のIPアドレス 体 系 と 統 合 する 電 話 番 号 マッピング (telephone number mapping) の 代 表 的 な 規 格 IPv6 IPv6 端 末 9000 番 へ 発 信 したい 場 合 に 該 当 する 通 信 方 法 を DNS で 検 索 する NAPTR? 0.0.0.9.e164.arpa. "E2U+sip" sip:[2001:db8::1] INVITE DNSサーバ は 通 信 方 式 (こ こでは SIP)とSIP サーバの IPv6 アドレスを 返 却 する INVITE 200 OK 200 OK 200 OK 11
設 定 ファイル bind() を 行 うアドレスは IPv4/IPv6 の 両 方 が 記 述 可 能 ( 設 定 ファイ ルは sip.conf) IPv4 example: bindaddr=0.0.0.0:5062 bindaddr=0.0.0.0 IPv6 example: bindaddr=[::]:5062 bindaddr=:: bindaddr=0.0.0.0 とした 場 合 IPv4 のみ 受 信 可 能 bindaddr=< 特 定 の IPv4/IPv6> アドレスを 指 定 した 場 合 は そのア ドレスファミリのみ 受 信 可 能 デュアルスタックにする 場 合 は bindaddr=:: とするが 挙 動 はOS 依 存 である IPV6_V6ONLY マクロを 意 識 した 設 定 項 目 はない Linux の 場 合 /proc/sys/net/ipv6/bindv6only=0 としないとデュア ルスタックにはならない 12
ログファイル ログファイル 中 の IPv6 アドレス 表 示 は '[<IPv6 アドレス>]:<ポート 番 号 >' となる 例 [Nov 16 22:50:02] VERBOSE[6103] chan_sip.c: Peer audio RTP is at port [2001:db8:1:1:215:c5ff:fe12:2c68]:7078 [Nov 16 22:50:02] VERBOSE[6103] chan_sip.c: Peer video RTP is at port [2001:db8:1:1:215:c5ff:fe12:2c68]:9078 13
ソケットまわり アプリ 内 でライブラリ 化 されており getaddrinfo() などの 関 数 は 隠 蔽 されてい る 14
アドレス 情 報 の 保 持 (1) 従 来 は struct sockaddr_in を 使 用 していたのが struct sockaddr_storage を 使 用 するように 修 正 されている asterisk 1.4.40 の 場 合 asterisk 10.3.1 の 場 合 channel/chan_sip.c より struct sip_pvt { : struct sockaddr_in sa; }; struct sip_peer { : struct sockaddr_in addr; }; 一 部 のOS(MacOS 等 )では 構 造 体 の 長 さが 必 要 なため 移 植 性 を 考 慮 して 追 加 されている 15 include/asterisk/netsock2.h より struct ast_sockaddr { struct sockaddr_storage ss; socklen_t len; }; channel/sip/include/sip.h より struct sip_pvt { : struct ast_sockaddr sa; }; struct sip_peer { : struct ast_sockaddr addr; };
アドレス 情 報 の 保 持 (2) アドレスの 文 字 列 を 格 納 する 文 字 配 列 の 要 素 数 を INET_ADDRSTRLEN から INET6_ADDRSTRLEN へ 変 更 している asterisk 1.4.40 の 場 合 channel/chan_sip.c より static void realtime_update_peer( ) { : char ipaddr[inet_addrstrlen] }; asterisk 10.3.1 の 場 合 channel/sip/include/sip.h より static void realtime_update_peer( ) { : char ipaddr[inet6_addrstrlen] }; 16
IPv6 対 応 汎 用 関 数 (1) main/netsock2.c: int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags) IP アドレスとポートを 分 離 する ex) [2001:db8:cafe:babe::1]:5060 => 2001:db8:cafe:babe::1 と 5060 に 分 離 int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family) アドレス 解 決 を 行 う 引 数 にアドレスファミリーが 入 る 検 索 されたアドレスすべてを 引 数 で 与 えられた 領 域 に 保 存 する この 関 数 を 利 用 して channels/chan_sip.c で 下 記 の 関 数 が 定 義 されている static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr, const char* name, int flag, int family) 指 定 したアドレスファミリで 検 索 し 先 頭 の1つだけを 返 却 する static int ast_sockaddr_resolve_first(struct ast_sockaddr *addr, const char* name, int flag) 設 定 ファイルで 指 定 されたbindaddrのアドレスファミリで 検 索 し 先 頭 の1つだけ 返 却 する 17
IPv6 対 応 汎 用 関 数 (2) int ast_sockaddr_ipv4_mapped(const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped) IPv4 mapped address( 実 体 は struct sockaddr_in6)が 格 納 された ast_sockaddr を IPv4 アドレスが 格 納 された 形 式 ( 実 体 は struct sockaddr_in)に 変 換 する int ast_set_qos(int sockfd, int tos, int cos, const char *desc) IP ヘッダの TOS フィールド もしくは IPv6 ヘッダの Traffic Class フィ ールドを 設 定 する(Linux の 場 合 は SO_PRIORITY ソケットオプションにより cos の 値 が 設 定 される) 18
接 続 設 定 ファイルに 書 かれている IP アドレス を struct in_addr もしくは struct in6_addr に 変 換 するために getaddrinfo() を 使 用 し ている getaddrinfo() は 前 述 の ast_sockaddr_resolve() 経 由 で 呼 び 出 され ており 場 合 によっては 取 得 されるアドレ スリストの 先 頭 のみを 使 用 している 19
まとめ アドレス 操 作 関 数 は IPv4/IPv6 を 意 識 し ているものの 局 所 化 できるように 内 部 関 数 を 作 成 して 使 用 している 20
参 考 文 献 (Webサイト) SIP IPv6 関 連 SIP FORUM IPv6 task group http://www.sipforum.org/content/view/398/286/ Asterisk 関 連 Asterisk wiki http://wiki.asterisk.org IPv6 関 連 Internet Week 2011より 事 例 から 学 ぶIPv6トラブル シューティング http://www.nic.ad.jp/ja/materials/iw/2011/procee dings/t2/t2-02.pdf 21