AsteriskのIPv6対応について

Similar documents
(Microsoft PowerPoint - IPv6_summit_r2.ppt [\214\335\212\267\203\202\201[\203h])

PowerPoint Presentation

BSDソケットによるIPv6プログラミングを紐解く

システムインテグレータのIPv6対応

Microsoft PowerPoint pptx

情報ネットワーク演習 2007 年 10 月 11 日 ( 木 )

SIP について 渡邊研究室三浦健吉

システムインテグレータにおけるIPv4アドレス在庫枯渇に向けた取り組み

スライド 1

v6prog-05.ppt

SIP を使った簡単な通話 ( とりあえず試してみよう ) 相手 IP アドレスがわかっており ネットワークに接続されているとき INVITE 200 OK SIP 端末 (MSN Messenger) SIP 端末 (YAMAHA ルータ ) SIP アド

図解でわかるVoIPのすべて - IP電話の技術から構築まで -

IP-PBX Group SIP による IP-PBX 相互接続試験の実施 PBX テレコムサーバ相互接続試験実施連絡会中平猛

平成18年度電気関係学会東海支部連合大会

SIP概要説明資料

オペレーティングシステムとネットワークプログラミング 担当 : 吉藤英明 yoshfuji+camp2008 AT wide.ad.jp セキュリティ & プログラミングキャンプ /08 OS プロトコルスタック (C)2008 YOSHIFUJI Hideaki,

Microsoft Word - (修正)101.BLU-103のVoIP設定方法.docx

企業SIP網Q-sig⇔SIP間インタフェース仕様

untitled

PowerPoint Presentation

投影用スライドタイトル

untitled

本資料について

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

TS-1009

untitled

Prog1_10th

(Microsoft PowerPoint - janog23-server-ipv6-rel-public.ppt [\214\335\212\267\203\202\201[\203h])

21 VoIP An encrypted VoIP communication system for mobile telephones

NAT-f SIP NAT 1 1, 2 1 IP SIP NAT NAT NAT NAT-f NAT-free protocol NAT-f SIP Session Initiation Protocol NAT-f SIP NAT Researches on NAT traversal for

情報通信の基礎

情報ネットワーク演習 2006年10月5日

<4D F736F F F696E74202D D54352D6B61746F2D D B82C988CB91B682B582C882A2835C D834F E F205B8CDD8AB B83685D>

NTMobile SIP 1 SIP Session Initiation Protocol IP IP NAT Network Address Translation NTMobile Network Traversal with Mobility NTMobile RST Relay Serve

Managed Firewall NATユースケース

連絡先

SOC Report

Cisco CSS HTTP キープアライブと ColdFusion サーバの連携

目次 1. DB 更新情報受信 SW 仕様書 構成および機能 全体の構成 DB 更新情報受信 SW の機能 ソフトウェアの設計仕様 DB 更新情報受信 SW の仕様 資料編... 5

15群(○○○)-8編

NetLec17TCPIP1.ppt

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

Oracle DatabaseとIPv6 Statement of Direction

技術的条件集別表 35 IP トランスポート仕様

適切な名前に置き換えて保存

スライド 1

アドレス枯渇対応タスクフォース アドレス枯渇対応タスクフォースとは 来るべき アドレス 枯渇を より円滑に乗り越えるために 19の組織 団体 (2009 年 8 月時点 ) が力を合わせてアドレス枯渇の影響を ネットワークシステムやアプリケーション開発に係わる様々な立場から検証すると同時に それらの

F コマンド

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

Aspire UX 連携設定マニュアル MEDIAPOINT HD(TC-2500/TC-2500A) NEC エンジニアリング 2016 年 6 月 本資料は初期設定のマニュアルです 機器の操作方法については取扱説明書をご参照ください

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Android Layout SDK プログラミング マニュアル

1. 概要 この章では HDE Controller X LG Edition をお使いの方に向けて LGWAN 接続に特化した設定の説明をします HDE Controller X LG Edition 以外の製品をご利用のお客様はこの章で解説する機能をお使いになれませんのでご注意ください 452

P2P SIP解説

WebOTX SIP Application Server BIG-IP Local Traffic Manager 連携システム構築ガイド

Microsoft PowerPoint - 廣海.pptx

R80.10_FireWall_Config_Guide_Rev1

p_network-management_old-access_ras_faq_radius2.xlsx

(Microsoft PowerPoint - 2.\(\220\274\222J\202\263\202\361\)JANOG ppt [\214\335\212\267\203\202\201[\203h])

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

F コマンド

スライド 0

SIP SDP(Session Description Protocol) RTSP(Real-time Streaming Protocol) RTP(Real-time Transport Protocol) IP 1 [1] 1: IP RTP(Real-Time RFC1889 Transf

PowerPoint プレゼンテーション

スライド タイトルなし

Microsoft Word - トンネル方式(3 UNI仕様書5.1版)_ _1910.doc

/*

VoIPチュートリアル

講座内容 第 1 回オープンネットワークの概念と仕組み ( 講義 90 分 ) 基本的なネットワークの構成及び伝送技術について大規模化 マルチプロトコル化を中心に技術の発展と 企業インフラへの適用を理解する その基本となっている OSI 7 階層モデルについて理解する (1) ネットワークの構成と機

ネーミング(1)

Oracle DatabaseとIPv6 Statement of Direction

そもそも SIP とは?

Microsoft PowerPoint TTCセミナー原稿(TR-1038)r2.pptx

アプリケーション インスペクションの特別なアクション(インスペクション ポリシー マップ)

Microsoft PowerPoint - HNWG8_03_HN-WG.A_アーキテクチャおよび技術課題(9.18版).ppt

スライド 1

オートビュー

インターネットで個人放送局を開くには (1)

2011/04/20 DNSOPS.JP BoF Simplified DNS Query under IPv4/IPv6 Mixed Environment IPv4/IPv6 混在通信環境における適切な DNS 名前解決方式 北村浩 (NEC/ 電通大 ) 阿多信吾 ( 阪市大 )

オートビュー

<4D F736F F F696E74202D DB A B C C815B E >

untitled

TTC技術書

Microsoft PowerPoint - IW2011_D2_Kawashimam_Presen [互換モード]

2006年10月5日(木)実施

適切な名前に置き換えて保存

2.5 トランスポート層 147

buho210.dvi

インターネットVPN_IPoE_IPv6_fqdn

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

VPN 接続の設定

JJ SIP ドメイン解決のための DNS 相互接続共通インタフェース Common interconnection interface for SIP domain name resolution based on DNS 第 1.0 版 2018 年 8 月 29 日 一般社団法人情

2. ネットワークアプリケーションと TCP/IP 2.1. クライアント / サーバモデル TCP/IP プロトコルに従うネットワークアプリケーションの典型的モデルは, クライアント / サーバモデルである. クライアント / サーバモデルでは, クライアントからの要求に対してサーバがサービスを提

スライド タイトルなし

TFTP serverの実装

TCP UDP TCP UDP send()sendto()sendmsg() recv()recvfrom()recvmsg() OS Passive Active TCP UDP IP TCP UDP MTAMail Transf

Microsoft PowerPoint - CproNt02.ppt [互換モード]

VG シリーズ用ローカルファームアップ / 自動ファームウェア更新設定手順書 VG400aⅡ ローカルファームアップ / 自動ファームウェア更新設定手順書

PC にソフトをインストールすることによって OpenVPN でセキュア SAMBA へ接続することができます 注意 OpenVPN 接続は仮想 IP を使用します ローカル環境にて IP 設定が被らない事をご確認下さい 万が一仮想 IP とローカル環境 IP が被るとローカル環境内接続が行えなくな

PowerPoint Presentation

Transcription:

Asterisk の IPv6 対応について エヌ ティ ティ ソフトウェア株式会社高宮紀明

Asterisk は米国 Digium 社の登録商標または商標です そのほかの記載の会社名 製品名は それぞれの会社の商標もしくは登録商標です 2

自己紹介 1999 年より IPv6 にかかわり始める 2000 年 IPv6 対応ルータを販売 第一回 TAHI プロジェクト相互接続試験に参加 USAGI プロジェクト参加 (~2008) 主に MIPv6 スタック開発担当 成果は 2.6.21 以降の Linux カーネルにマージ IPv6 普及 高度化推進協議会参加 アプリケーションの IPv6 対応検討 SWG に参加 NGN 対応ソフトウェア開発 販売 (2008~) 3

目次 はじめに SIPについて Asterisk について 実際の通信について まとめ 4

はじめに IPv6 に対応したアプリケーション開発に必要な要素として 開発環境 ツール そしてコーディングなどがあげられるが これらに関し 必要な情報が不足している 本セッションでは前半の内容をもとに オープンソースにおける IPv6 対応の実例として Asterisk(IP-PBX ソフトウェア ) の IPv6 対応内容を紹介する 5

SIP について SIP プロトコル概要 接続シーケンス 6

SIP プロトコル概要 SIP(Session Initiation Protocol) とは 2 つ以上のクライアント間でセッションを確立するための IETF 標準の通信プロトコル IETF にて 汎用のセッション制御プロトコルとして開発された 特徴として HTTP に似た テキストベースのリクエストとレスポンスによって通信を行い 相手先 ( 通話先 ) は URI(Uniform Resource Identifier) を指定する G.711 etc SDP RTP RTCP SIP UDP G.711: ITU-T standard for audio companding. SDP: Session Descripton Protocol RTCP: RTP Control Protocol SIP: Session Initiation Protocol IP TCP RTP: Realtime Transport Protocol TCP: Transmisson Control Protocol UDP: User Datagram Protocol IP: Internet Protocol 7

SIP の一般的な接続シーケンス IP 電話機などの SIP 端末は SIP サーバに REGISTER を送信することで発着可能な状態となる この時に IP 電話機と SIP サーバ間で使用するプロトコルファミリが決まる Register 100 Trying SIP Server Register 100 Trying Register IP 電話機など 200 OK 200 OK INVITE / SDP INVITE / SDP IP 電話機など 100 Trying 180 Ringing 200 OK / SDP 100 Trying 180 Ringing 200 OK / SDP Basic SIP Call ACK RTP stream RTP stream RTCP stream Media (UDP) BYE 200 OK / SDP BYE 200 OK / SDP 厳密には レジストラ SIP プロキシ メディアサーバ等に機能分担されるが ここでは単に SIP サーバとして扱う また SIP Server では RTP を終端するものもあるが ここでは RTP を終端しないものを例示する 8

Asterisk について Asterisk とは オープンソースの IP-PBX ソフトウェア (IP ネットワーク内で IP 電話端末の回線交換を行う装置およびソフトウェア ) http://www.asterisk.org/ 複数のバージョン (1.4.x 1.8.x 10.x 11.x 12.x) 1.8.x 11.x は LTS(Long Term Support) としてリリース 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 がデュアルスタックで動作していることが前提 ) 9

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 間の相互接続機能 2013/11 月現在 (Asterisk 11) 10

Asterisk の動作環境 ここでは Asterisk のデュアルスタック環境での動作について説明します Asterisk の接続形式 Asterisk の設定 Asterisk が出力するログファイル 11

Asterisk の接続形式 発信側 IP 電話機は REGISTER 送信時に指定したプロトコルファミリに従い 発信を行う (INVITE の送信 ) Asterisk は 着側が REGISTER 送信時に指定したプロトコルファミリにより INVITE を転送する 発側 IP 電話機 (IPv4) IPv4 Asterisk(5060/udp を ::/0 で bind) IPv6 着側 IP 電話機 (IPv6) INVITE sip:6001@192.168.1.212:5060;... From: <sip:6000@192.168.1.214>;tag=as3350c74c To: <sip:6001@192.168.1.212:51784> Contact: <sip:6000@192.168.1.214:5060> Call-ID: 4c9d4cb63@192.168.1.214:5060 CSeq: 102 INVITE Content-Type: application/sdp Content-Length: 442 v=0 c=in IP4 192.168.1.214 : 12 INVITE sip:6001@[2001:db8:cafe:babe::2] SIP/2.0 From: <sip:6000@[2001:db8:cafe::babe::1]>;tag=623328519 To: <sip:6001@[2001:db8:cafe:babe::2]> Contact: <sip:6000@[2001:db8:cafe:babe::1]> Call-ID: 134945149 CSeq: 20 INVITE Content-Type: application/sdp Content-Length: 384 v=0 c=in IP6 2001:db8:cafe:babe::1 :

設定ファイル 待ち受けに使用される IP アドレスは IPv4/IPv6 の両方が記述可能 ( 設定ファイルは sip.conf) IPv4 example: bindaddr=0.0.0.0:5060 bindaddr=0.0.0.0 IPv6 example: bindaddr=[::]:5060 bindaddr=:: bindaddr=0.0.0.0 とした場合 IPv4 のみ受信可能 bindaddr=< 特定の IPv4/IPv6 アドレス > と指定した場合は そのプロトコルファミリのみ受信可能 デュアルスタックにする場合は bindaddr=:: とするが 挙動は OS 依存である Linux の場合 デュアルスタックで運用するためには /proc/sys/net/ipv6/bindv6only=0 であることを確認すること 13

ログファイル ログファイルでは IPv6 アドレスが出力される アドレス文字列の実体は getnameinfo() により得られるアドレス文字列が出力される RFC5952(A Recommendation for IPv6 Address Text Representation) に従うかどうかは実行環境での getnameinfo() の実装に依存する [Nov 16 22:50:02] VERBOSE[6103] chan_sip.c: Peer audio RTP is at port [2001:db8:cafe:babe::2]:7078 [Nov 16 22:50:02] VERBOSE[6103] chan_sip.c: Peer video RTP is at port [2001:db8:cafe:babe::2]:9078 14

ソケット関連の構造体 関数の扱いについて BSD ソケットの扱いは Asterisk の内部でライブラリ化されており SIP の処理の中で直接呼び出すことはほとんどない ここでは Asterisk が保持しているアドレス情報や内部関数の中で BSD ソケットで使用される構造体 関数がどのように使用されているかを解説する アドレス情報の保持 IPv6 汎用関数 実際の接続について 15

アドレス情報の保持 (1) IPv6 対応前では struct sockaddr_in が使用されていたが IPv6 対応後は struct sockaddr_storage が使用される IPv6 対応前 (asterisk 1.4.40) IPv6 対応後 (asterisk 11.6) channel/chan_sip.c より struct sip_pvt { : struct sockaddr_in sa; }; struct sip_peer { : struct sockaddr_in addr; }; 一部の OS(MacOS 等 ) では構造体の長さが必要なため 移植性を考慮して追加されている 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; }; 16

アドレス情報の保持 (2) アドレスの文字列を格納する文字配列の要素数を INET_ADDRSTRLEN (16) から INET6_ADDRSTRLEN (46) へ変更している IPv6 対応前 (asterisk 1.4.40) IPv6 対応後 (asterisk 11.6) channel/chan_sip.c より static void realtime_update_peer( ) { : char ipaddr[inet_addrstrlen] }; channel/sip/include/sip.h より static void realtime_update_peer( ) { : char ipaddr[inet6_addrstrlen] }; 17

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 に分離する if (*s == '[') { *host = ++s; IPv6 アドレスは [ と ] でアドレス文字列がくくられているため その文字列チェックを行っている (rfc3261) for (; *s && *s!= ']'; ++s) { } if (*s == ']') { host_end = s; ++s; } if (*s == ':') { *port = s + 1; } } else { IPv4 文字列を想定した処理 ( 省略 ) } 18

IPv6 対応汎用関数 (2) main/netsock2.c int ast_sockaddr_resolve(struct ast_sockaddr **addrs, const char *str, int flags, int family) アドレス解決を行う 引数 family にプロトコルファミリーが入る 内部で呼ばれる getaddrinfo() の結果が 引数 addrs に保存される 名前解決のみで使用され getaddrinfo() の結果はチェックされない memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; if ((e = getaddrinfo(host, port, &hints, &res))) { ( エラー処理 省略 ) } res_cnt = 0; for (ai = res; ai; ai = ai->ai_next) { res_cnt++; } i = 0; for (ai = res; ai; ai = ai->ai_next) { (*addrs)[i].len = ai->ai_addrlen; memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen); ++i; } 19 getaddrinfo() の検索条件を設定する getaddrinfo() の検索結果の数を計上し 関数の引数にコピーしている

IPv6 対応汎用関数 (3) channel/chan_sip.c static int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr, const char* name, int flag, int family) 指定したプロトコルファミリでホスト名の解決を行い 先頭の 1 つだけを返却する 内容は前ページの ast_sockaddr_resolve() を呼び その一つだけを返す実装となっている static int ast_sockaddr_resolve_first(struct ast_sockaddr *addr, const char* name, int flag) 設定ファイルで指定されたデフォルトのプロトコルファミリでホスト名の解決を行い 先頭の 1 つだけ返却する 上記の ast_sockaddr_resolve_first_af() の最後の引数 family を 設定ファイルで記述されているサーバの受信アドレスに従って設定される [::] となっていれば PF_UNSPEC が指定される この場合は DNS の返却結果と getaddrinfo() が struct addrinfo 構造体に結果を返す実装に依存する 20

IPv6 対応汎用関数 (4) main/netsock2.c int ast_sockaddr_is_ipv4_mapped(const struct ast_sockaddr *addr) 引数のソケットアドレス構造体が IPv4 mapped address かどうかをチェックする int ast_sockaddr_is_ipv4_mapped(const struct ast_sockaddr *addr) { const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss; return addr->len && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr); } <netinet/in.h> で定義されている アドレスの種類を判定するマクロ 21

IPv6 対応汎用関数 (5) main/netsock2.c int ast_sockaddr_ipv4_mapped(const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped) IPv4 mapped address( 実体は struct sockaddr_in6) が格納されたソケットアドレス構造体を IPv4 アドレスが格納された形式 ( 実体は struct sockaddr_in) に変換する if (!ast_sockaddr_is_ipv4_mapped(addr)) { return 0; } struct sockaddr_in6 *sin6 = (const struct sockaddr_in6*)&addr->ss; struct sockaddr_in sin4; memset(&sin4, 0, sizeof(sin4)); sin4.sin_family = AF_INET; sin4.sin_port = sin6->sin6_port; sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3]; ast_sockaddr_from_sin(ast_mapped, &sin4); ast_sockaddr_from_sin() 内で ast_mapped に struct sockaddr_in 構造体がコピーされる ast_mapped->len は sizoef(struct sockaddr_in) が設定される 22

実際の通信について Asterisk 内部では これまでに説明した汎用関数を使用して名前解決を実施するが たいていの場合は getaddrinfo() の最初のエントリのみを参照する仕様となっている プロトコルファミリについては REGISTER 受信時で使用されるプロトコルファミリをもとに決定しているため Asterisk と IP 電話機間では使用するプロトコルはあらかじめ決定されている 23

まとめ アドレス操作関数は IPv4/IPv6 を意識しているものの 局所化できるように内部関数を作成して使用している getaddrinfo() の最初のエントリを使用する仕様になっているが SIP による通話の開始前の REGISTER 処理によりプロトコルファミリが解決されている前提となっている 24

参考文献 (Web サイト ) SIP IPv6 関連 SIP FORUM IPv6 task group http://www.sipforum.org/content/view/398/286/ Asterisk 関連 Asterisk wiki http://wiki.asterisk.org IPv6 普及 高度化推進協議会 IPv4/IPv6 共存 WG http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml IPv6 関連 Internet Week 2011 より事例から学ぶ IPv6 トラブルシューティング http://www.nic.ad.jp/ja/materials/iw/2011/proceedings/t2/t 2-02.pdf 25