Upload
v6app
View
759
Download
3
Embed Size (px)
DESCRIPTION
OSC広島 jus研究会広島大会での発表資料です
Citation preview
これからのアプリ開発はIPv6対応で行こう!
2014年9月20日 IPv6普及・高度化推進協議会
渡辺 露文
オープンソースカンファレンス2014 Hiroshima!jus研究会広島大会
渡辺 露文(わたなべ つゆふみ) Twitter: @tsuyu23 某SIer勤務 IPv6普及・高度化推進協議会 会員 IPv6導入に起因する問題検討SWG アプリケーションのIPv6対応検討SWG
技術評論社Software Design誌連載 (2012年12月号~ 2014年1月号) !
2
About me
3
IPv6 ?Internet Protocol version 6インターネットの通信に関する規約(RFC791)IPネットワークに接続するには1つ以上のIPアドレスが必要皆さんが馴染んでいるのはIPv4(例:10.1.2.3)
Do you know …
最近のOS Windows Vista以降 Mac OS X Linux FreeBSD
… !!
4
実はIPv6を使える環境が増えています(1)
いずれも デフォルトで 利用可能
インターネット回線 フレッツ光ネクスト au ひかり NURO 光
… !!
5
実はIPv6を使える環境が増えています(2)
利用可能 既存ユーザへの自動導入も進行中
すでに、ユーザからあなたのサービスにIPv6でアクセスされようとしている…かもしれない
6
日本におけるIPv6の普及状況
フレッツ光ネクストのIPv6普及率(2014年6月)
IPv6普及率:3.1%!
フレッツ光ネクスト契約数:13,588,000契約!
!au ひかりのIPv6普及率(2014年6月):68% !
! 今後本格的に普及する前にIPv6対応を始めたほうが良い
出典:IPv6普及・高度化推進協議会 アクセス網におけるIPv6普及状況調査! http://v6pc.jp/jp/spread/ipv6spread_03.phtml
7
余談:IPv6でインターネットにアクセスできるかの確認方法
Webブラウザで http://www.test-ipv6.jp にアクセス !!!!Webブラウザで http://www.kame.net にアクセス !!!
IPv6でアクセスすると、亀が踊ります♪
8
IPv6の背景: IPv4アドレス枯渇
IPv4アドレスの在庫状況(地域インターネットレジストリ)
通信事業者、ISP、データセンター、クラウド事業者等の在庫が残るのみ
世界的に足りなくなってきている
9
もう少しIPv6を知ろう!
10
IPv4とIPv6とでは何が違うのか?
アドレス体系が異なる (IPv6のアドレス空間は広大) 例 IPv4)192.0.2.1 IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠) !
他にも機能的にIPv4と異なることがある IPv4とIPv6は互換性がない
11
IPv4とIPv6の接続性
Internet
IPv4対応(IPv6非対応)システム
IPv4/IPv6 両対応システム
IPv6対応(IPv4非対応)システム
(1)(2)
(3)
IPv4端末
IPv4/IPv6 両対応端末
IPv6端末
IPv4
IPv6
12
IPv6に対応しない場合の影響
1. IPv6のみの環境と通信できない!ビジネス機会を損失する!
システム連携が行えず要件を満たせなくなる!2. 今後、IPv4はサービスレベルが低下していく!
通信事業者等によるCGN(Carrier Grade NAT)導入により、遅くなり、使用できるセッション数が減る可能性がある!!!
IPv6に対応しなきゃ!
13
インフラがIPv6に対応するだけでいいのでは?
ネットワークとサーバがIPv6に対応すれば、IPv6で接続可能 !接続は可能だが… !!!システム連携がうまくいかない!
想定外の挙動をする!
… !アプリケーションもIPv6に対応しなきゃ!
サービスが正常に動作しないかもしれない
14
IPv6対応の話をする前に…①
このコード、イケてない…
use IO::Socket::IP; $host = “198.51.100.1”; : : my $sock = IO::Socket::IP->new( PeerAddr => $host, PeerPort => $port, Proto => 'tcp' ) or die “Error: $!\n”; : :
IPアドレス直書きすると、アドレス変更時に修正が必要なんですよ… 再テストも必要だし…
えっ、IPアドレス直書き?
ダメよ~ダメダメ
15
IPv6対応の話をする前に…②
とある Androidプログラミング書籍におけるソケット通信のサンプルコード
public class SocketEx… … … private final static String IP=“192.168.11.12”;//★変更必須
良い子は真似しちゃダメ
16
IPv6対応の話をする前に…③
IPアドレスのハードコーディングはNG
ダメ。ゼッタイ。
$host = “www.example.com”のようにFQDNで接続先を指定する
Internet
17
ネットワークアクセスの作法=名前解決を使う
Client
Web Server www.example.jp 2001:db8:100::1192.0.2.1
DNS Server 198.51.100.53
①名前解決問合せ!www.example.jp ?
②アドレス応答!www.example.jp ⇒ 2001:db8:100::1 ! ! 192.0.2.1
③HTTP通信
FQDN
FQDNで接続先を指定し、DNSからアドレス取得
18
なぜIPアドレス直書きがダメなのか?
アプリケーションは、IPアドレスに依存すべきではない
目的 変更・改修の理由アプリケーション 機能の提供 ■ 業務要件の変更!
■ サービス内容の変更!■ ユーザビリティ向上 …,etc.
インフラ 資源の提供 ■ 資源管理(IPアドレス、サーバラック…)!■ 性能
互いに変更の影響を受けるべきではない
同一システムでも変更・改修の理由・時期は異なる
例)IPアドレスでユーザを識別すべきではない
19
さあ、アプリケーションをIPv6に対応させよう!ここからが本題
20
アプリケーションIPv6対応の基本方針
IPv6対応 =! IPv4とIPv6の両方で動作する
シングルソースコードで対応
21
アプリケーションIPv6対応の基本方針
!
!!!!IPv6とIPv4の共存期間が長く続く!
これまでIPv4で提供してきたサービスは、今後も継続してIPv4でも動作する必要あり
IPv6対応 =! IPv4とIPv6の両方で動作する
22
アプリケーションIPv6対応の基本方針
!!!!各開発言語が概ねIPv6に対応しており、プロトコルによって開発言語を分ける必要がなくなった!
アプリケーションのメンテナンス性を重視し、プロトコルによって機能差異が生じることを未然に防ぐ
シングルソースコードで対応
23
アプリケーションのIPv6対応のポイント
EthernetIP(v4/v6)TCP / UDP
アプリケーション!
OS
ミドルウェア/フレームワーク
アプリケーション!
OS
フレームワーク
HTTP/HTTPS!SMTP, SSH,ソケット通信など
クライアント サーバ
①IPv4/IPv6両対応のプログラミング言語と実行環境を使う
②通信処理をIPv4/IPv6の 両方に対応させる
③データとしてIPアドレスを 扱う箇所をIPv4/IPv6の 両方に対応させる
24
ポイント① IPv4/IPv6両対応のプログラミング言語と実行環境を使う(1)
IPv4/IPv6両対応のプログラミング言語と実行環境?
!1. 名前解決でIPv4/IPv6両方のアドレスが扱える!
2. IPv4/IPv6両方で接続できる
IPv4/IPv6の両方で通信できる
25
ポイント① IPv4/IPv6両対応のプログラミング言語と実行環境を使う(2)
Client
Web Server www.example.jp 2001:db8:100::1
example.jpの 権威DNS Server
■ AAAAレコード(IPv4のAレコードに相当)をリソースレコードに登録
www.example.jp IN AAAA 2001:db8:100::1①名前解決問合せ!www.example.jp ?
②AAAA応答!2001:db8:100::1
③HTTP通信
名前解決でIPv4/IPv6両方のアドレスが扱える FQDNからIPv6アドレスが名前解決できる 名前解決で得られるIPv6アドレスを認識、接続先アドレスに指定できる !!!!!!
26
考慮すべき要素 対応状況 備考
名前解決 ○ ■ Socket::getaddrinfo()!■ Socket::getnameinfo()!■ CPAN Net::DNS
ソケット ○ ■ コアモジュールの Socketは 5.10 から部分的に対応!
■ 5.14でフル対応!■ CPANモジュールにも対応しているも各種(L7)
プロトコルHTTPクライアント ▲
標準では非対応(コアモジュール HTTP::Tiny, LWP等のメジャーなモジュールも非対応)
SMTPクライアント ▲ 標準では非対応(コアモジュール
Net::SMTP)
その他 IPv6アドレスの処理 ○ CPANモジュール Net::IPにより対応
ポイント① プログラミング言語と実行環境 Perlの対応状況
27
考慮すべき要素 対応状況 備考
名前解決 ○ ■ dns_get_record()!■ gethostbyaddr()!■ PEAR Net_DNS2
ソケット ○ inet_pton(), inet_ptop()は 5.1.0 以降対応
各種(L7)プロトコル
HTTPクライアント ○ 各種ファイル関数
cURLなど
SMTPクライアント ○ PEAR Net_SMTP!
mail(), PEAR Mail ⇒システム環境依存
その他 IPv6アドレスの処理 ○ PEAR Net_IPv6拡張パッケージ
ポイント① プログラミング言語と実行環境 PHPの対応状況
28
ポイント① IPv4/IPv6両対応のプログラミング言語と実行環境を使う(3)
プログラミングにおける留意点 IPv4/IPv6の双方に対応するライブラリ、オブジェクト、関数、データ型を使う 従来(IPv4のみ)のものとは別に用意されている ことがある C addrinfo構造体、getaddrinfo() Java InetAddressクラス Perl IO::Socket::IP など !
アドレス検証、変換などはライブラリを有効活用
29
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(1)
接続の優先順位(標準;RFC6724):IPv6 > IPv4 !サーバプログラム IPv4/IPv6 両プロトコルでの接続を処理 !
クライアントプログラム IPv4/IPv6 両宛先アドレスに接続できるようにする 接続できない状況も想定し、接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)
IPv6 IPv6
IPv4 IPv4
Client Server
アプリケーションの作りが悪いと… ■ 切替えに時間がかかる ■ 正常に切替わらないこともある
ユーザの利便性を損なう
30
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(2)
フォールバック IPv4 ⇒ IPv6 / IPv6 ⇒ IPv4 / IPv4 ⇒ IPv4 / IPv6 ⇒ IPv6 !!!!!!!!
Client
Web Server!www.example.jp
DNS Serverwww.example.jp IN AAAA 2001:db8:100::1!www.example.jp IN A 192.0.2.1
①名前解決問合せ!www.example.jp ?
②AAAA応答 2001:db8:100::1! A応答 192.0.2.1
③HTTP通信(IPv6)2001:db8:100::1
192.0.2.1
2001:db8:ffff::1
198.51.100.1④HTTP通信(IPv4) フォールバック
31
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(3)
想定されるフォールバックの主な原因サーバ側の問題
サーバが当該のサービスを提供していない DNS誤登録、障害等
経路の問題 ネットワークの接続性が失われている ISPの不具合
クライアント側の問題
サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網
32
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(4)
フォールバックの予防策サーバ 設定の不備を修正する
サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する
ISP ネットワークの接続性を健全に保つ
クライアント IPv6インターネット接続可能なISPと契約する
33
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(5)
クライアントプログラム ホスト名の名前解決結果をリスト形式で取得し、アドレスリストの順に接続を試み、接続が確立したものと送受信を行う !更に迅速にフォールバックを行うために、Happy Eyeballs(RFC6555)も選択肢の一つ
ホスト名解決(DNS問合せ)
接続成功?Yes
No
リスト取得
リスト順次取出し
Good!
34
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(6)
クライアント サンプルコード抜粋(1/2)/* resolve address/port into sockaddr */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(argv[1], argv[2], &hints, &res0); !if (error) { fprintf(stderr, "%s %s: %s\n", argv[1], argv[2], gai_strerror(error)); exit(1); } !/* 次のページに続く */
35
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(7)
クライアント サンプルコード抜粋(2/2)/* try all the sockaddrs until connection goes successful */ for (res = res0; res; res = res->ai_next) { fprintf(stderr, "trying %s port %s\n", hbuf, sbuf); s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (s < 0) continue; if (connect(s, res->ai_addr, res->ai_addrlen) < 0) { close(s); s = -1; continue; } ! while ((l = read(s, buf, sizeof(buf))) > 0) write(STDOUT_FILENO, buf, l); close(s); exit(0); }
36
ポイント② 通信処理をIPv4/IPv6の両方に対応させる(8)
サーバプログラム 同一ソースコードでプログラムを作成 IPv4/IPv6両方の接続を同時に受付ける2種類の手法
:ソケットA B
プロセスA
IPv6
IPv4プログラム α
接続
接続
プロセスB
サーバ
プロセスC
IPv6
IPv4
接続
接続 プログラム β
サーバ
37
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(1)
!
データとしてIPアドレスを扱う箇所
入力出力
整列
検索格納
38
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(2)
アドレス体系の違い !!!!例 IPv4)192.0.2.1 IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 IPv6省略表記)2001:db8::1:0:0:1 (RFC5952準拠)
IPv4アドレス IPv6アドレスアドレス長 32bit 128bit文字列表記
表記法 8bitずつ区切り、10進数で表記
16bitずつ区切り、16進数で表記
区切り文字 . (ドット) : (コロン)文字列長 15文字以内 39文字以内
RFC5952に文書化されているIPv6アドレス推奨テキスト表記ルールに従い省略可能
39
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(3)
入力 整数ではなく文字列で入力 !!!!
入力値の検証はライブラリの関数・フィルタを利用 例)PHP Net_IPv6::checkIPv6(); (PEARにて提供されるNet_IPv6パッケージに 含まれる)
IPv4のみ 15文字以内の文字列 [VARCHAR(15)] もしくは整数×4
IPv4/IPv6両対応 39文字以内の文字列 [VARCHAR(39)]Good!
40
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(4)
格納、検索、整列、出力 IPアドレス型が定義されている場合は、IPアドレス型を使う 例) PostgreSQLのネットワークアドレス型
IPアドレス型が定義されていない場合は、文字列型で 完全表記を使う IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 見やすさを求めるときは、省略表記(RFC5952準拠)で出力
既存システムは、格納領域にIPv6アドレスが収まるかをチェック
41
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(5)
なぜ、完全表記? 省略表記のままソートしても…
2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:1::50 2001:db8:0:10::1
ソート前
2001:db8:0:10::1 2001:db8:0:1::1:1 2001:db8:0:1::50 2001:db8:0:2::1
ソート後アドレス昇順2001:db8:0:1::50 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:10::1
省略表記のソートは
アドレス昇順と一致しない
(文字列) ソート
アドレス昇順
42
ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(6)
ソートは完全表記で行う2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:1::50 2001:db8:0:10::1
ソート前
ソート後アドレス昇順2001:db8:0:1::50 2001:db8:0:1::1:1 2001:db8:0:2::1 2001:db8:0:10::1
アドレス昇順
2001:0db8:0000:0001:0000:0000:0001:0001 2001:0db8:0000:0002:0000:0000:0000:0001 2001:0db8:0000:0001:0000:0000:0000:0050 2001:0db8:0000:0010:0000:0000:0000:0001
2001:0db8:0000:0001:0000:0000:0000:0050 2001:0db8:0000:0001:0000:0000:0001:00012001:0db8:0000:0002:0000:0000:0000:00012001:0db8:0000:0010:0000:0000:0000:0001
(文字列)ソート
完全表記
完全表記のソートはアドレス昇順と一致
43
おわりに
44
まとめ(1)IPv6を使える環境が増えている IPv4とIPv6の違い:アドレス空間が異なる , etc. ⇒互換性なし IPアドレスのハードコーディングはダメ。ゼッタイ。
IPv6対応の基本方針 IPv6対応=IPv6/IPv4の両方で動作させること シングルソースコードで対応する
45
まとめ(2)IPv6対応のポイント 1. IPv4/IPv6両対応のプログラミング言語と実行環境を使う
2.通信処理をIPv4/IPv6の両方に対応させる 3.データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる
!
決して難しくない! 今日から開発するアプリケーションは
IPv6に対応させよう!
46
つづきはWebで(参考文献)
「アプリケーションのIPv6対応ガイドライン 基礎編」/IPv6普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションのIPv6対応検討SWG
http://www.v6pc.jp/jp/entry/wg/2012/12/ipv610.phtml!!「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」/IPv6普及・高度化推進協議会 IPv4/IPv6共存WG アプリケーションのIPv6対応検討SWG
http://www.v6pc.jp/jp/entry/wg/2014/06/ipv6web.phtml!!Internet Week 2013「T2 アプリケーション・サービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編!
https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-watanabe-2.pdf!!軽量プログラミング言語のIPv6対応 PHP編!
https://www.nic.ad.jp/ja/materials/iw/2013/proceedings/t2/t2-hatano-2.pdf
47
ご清聴いただき、ありがとうございました