47
これからのアプリ開発は IPv6対応で行こう! 2014年9月20日 IPv6普及・高度化推進協議会 渡辺 露文   オープンソースカンファレンス2014 Hiroshima jus研究会広島大会

これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

  • Upload
    v6app

  • View
    759

  • Download
    3

Embed Size (px)

DESCRIPTION

OSC広島 jus研究会広島大会での発表資料です

Citation preview

Page 1: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

これからのアプリ開発はIPv6対応で行こう!

2014年9月20日 IPv6普及・高度化推進協議会

渡辺 露文  

オープンソースカンファレンス2014 Hiroshima!jus研究会広島大会

Page 2: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

渡辺 露文(わたなべ つゆふみ) Twitter: @tsuyu23 某SIer勤務 IPv6普及・高度化推進協議会 会員 IPv6導入に起因する問題検討SWG アプリケーションのIPv6対応検討SWG

技術評論社Software Design誌連載 (2012年12月号~    2014年1月号) !

2

About me

Page 3: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

3

IPv6 ?Internet Protocol version 6インターネットの通信に関する規約(RFC791)IPネットワークに接続するには1つ以上のIPアドレスが必要皆さんが馴染んでいるのはIPv4(例:10.1.2.3)

Do you know …

Page 4: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

最近のOS Windows Vista以降 Mac OS X Linux FreeBSD

 … !!

4

実はIPv6を使える環境が増えています(1)

いずれも デフォルトで 利用可能

Page 5: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

インターネット回線 フレッツ光ネクスト au ひかり NURO 光

 … !!

5

実はIPv6を使える環境が増えています(2)

利用可能 既存ユーザへの自動導入も進行中

すでに、ユーザからあなたのサービスにIPv6でアクセスされようとしている…かもしれない

Page 6: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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

Page 7: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

7

余談:IPv6でインターネットにアクセスできるかの確認方法

Webブラウザで http://www.test-ipv6.jp にアクセス !!!!Webブラウザで http://www.kame.net にアクセス !!!

IPv6でアクセスすると、亀が踊ります♪

Page 8: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

8

IPv6の背景:  IPv4アドレス枯渇

IPv4アドレスの在庫状況(地域インターネットレジストリ)

通信事業者、ISP、データセンター、クラウド事業者等の在庫が残るのみ

世界的に足りなくなってきている

Page 9: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

9

もう少しIPv6を知ろう!

Page 10: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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は互換性がない

Page 11: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

11

IPv4とIPv6の接続性

Internet

IPv4対応(IPv6非対応)システム

IPv4/IPv6 両対応システム

IPv6対応(IPv4非対応)システム

(1)(2)

(3)

IPv4端末

IPv4/IPv6 両対応端末

IPv6端末

IPv4

IPv6

Page 12: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

12

IPv6に対応しない場合の影響

1. IPv6のみの環境と通信できない!ビジネス機会を損失する!

システム連携が行えず要件を満たせなくなる!2. 今後、IPv4はサービスレベルが低下していく!

通信事業者等によるCGN(Carrier Grade NAT)導入により、遅くなり、使用できるセッション数が減る可能性がある!!!

IPv6に対応しなきゃ!

Page 13: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

13

インフラがIPv6に対応するだけでいいのでは?

ネットワークとサーバがIPv6に対応すれば、IPv6で接続可能 !接続は可能だが… !!!システム連携がうまくいかない!

想定外の挙動をする!

  … !アプリケーションもIPv6に対応しなきゃ!

サービスが正常に動作しないかもしれない

Page 14: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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アドレス直書き?

ダメよ~ダメダメ

Page 15: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

15

IPv6対応の話をする前に…②

とある Androidプログラミング書籍におけるソケット通信のサンプルコード

public class SocketEx… … … private final static String IP=“192.168.11.12”;//★変更必須

良い子は真似しちゃダメ

Page 16: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

16

IPv6対応の話をする前に…③

IPアドレスのハードコーディングはNG

ダメ。ゼッタイ。

$host = “www.example.com”のようにFQDNで接続先を指定する

Page 17: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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からアドレス取得

Page 18: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

18

なぜIPアドレス直書きがダメなのか?

アプリケーションは、IPアドレスに依存すべきではない

目的 変更・改修の理由アプリケーション 機能の提供 ■ 業務要件の変更!

■ サービス内容の変更!■ ユーザビリティ向上 …,etc.

インフラ 資源の提供 ■ 資源管理(IPアドレス、サーバラック…)!■ 性能

互いに変更の影響を受けるべきではない

同一システムでも変更・改修の理由・時期は異なる

例)IPアドレスでユーザを識別すべきではない

Page 19: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

19

さあ、アプリケーションをIPv6に対応させよう!ここからが本題

Page 20: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

20

アプリケーションIPv6対応の基本方針

 IPv6対応 =!    IPv4とIPv6の両方で動作する

シングルソースコードで対応

Page 21: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

21

アプリケーションIPv6対応の基本方針

!

!!!!IPv6とIPv4の共存期間が長く続く!

これまでIPv4で提供してきたサービスは、今後も継続してIPv4でも動作する必要あり

 IPv6対応 =!    IPv4とIPv6の両方で動作する

Page 22: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

22

アプリケーションIPv6対応の基本方針

!!!!各開発言語が概ねIPv6に対応しており、プロトコルによって開発言語を分ける必要がなくなった!

アプリケーションのメンテナンス性を重視し、プロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

Page 23: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

23

アプリケーションのIPv6対応のポイント

EthernetIP(v4/v6)TCP / UDP

アプリケーション!

OS

ミドルウェア/フレームワーク

アプリケーション!

OS

フレームワーク

HTTP/HTTPS!SMTP, SSH,ソケット通信など

クライアント サーバ

①IPv4/IPv6両対応のプログラミング言語と実行環境を使う

②通信処理をIPv4/IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4/IPv6の 両方に対応させる

Page 24: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

24

ポイント① IPv4/IPv6両対応のプログラミング言語と実行環境を使う(1)

IPv4/IPv6両対応のプログラミング言語と実行環境?

!1. 名前解決でIPv4/IPv6両方のアドレスが扱える!

2. IPv4/IPv6両方で接続できる

IPv4/IPv6の両方で通信できる

Page 25: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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アドレスを認識、接続先アドレスに指定できる !!!!!!

Page 26: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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の対応状況

Page 27: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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の対応状況

Page 28: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

28

ポイント① IPv4/IPv6両対応のプログラミング言語と実行環境を使う(3)

プログラミングにおける留意点 IPv4/IPv6の双方に対応するライブラリ、オブジェクト、関数、データ型を使う 従来(IPv4のみ)のものとは別に用意されている ことがある C addrinfo構造体、getaddrinfo() Java InetAddressクラス Perl IO::Socket::IP       など !

アドレス検証、変換などはライブラリを有効活用

Page 29: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

29

ポイント② 通信処理をIPv4/IPv6の両方に対応させる(1)

接続の優先順位(標準;RFC6724):IPv6 > IPv4 !サーバプログラム IPv4/IPv6 両プロトコルでの接続を処理 !

クライアントプログラム IPv4/IPv6 両宛先アドレスに接続できるようにする 接続できない状況も想定し、接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)

 

IPv6 IPv6

IPv4 IPv4

Client Server

アプリケーションの作りが悪いと… ■ 切替えに時間がかかる ■ 正常に切替わらないこともある

ユーザの利便性を損なう

Page 30: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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) フォールバック

Page 31: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

31

ポイント② 通信処理をIPv4/IPv6の両方に対応させる(3)

想定されるフォールバックの主な原因サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録、障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

Page 32: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

32

ポイント② 通信処理をIPv4/IPv6の両方に対応させる(4)

フォールバックの予防策サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

Page 33: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

33

ポイント② 通信処理をIPv4/IPv6の両方に対応させる(5)

クライアントプログラム ホスト名の名前解決結果をリスト形式で取得し、アドレスリストの順に接続を試み、接続が確立したものと送受信を行う !更に迅速にフォールバックを行うために、Happy Eyeballs(RFC6555)も選択肢の一つ 

ホスト名解決(DNS問合せ)

接続成功?Yes

No

リスト取得

リスト順次取出し

Good!

Page 34: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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); } !/* 次のページに続く */

Page 35: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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); }

Page 36: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

36

ポイント② 通信処理をIPv4/IPv6の両方に対応させる(8)

サーバプログラム 同一ソースコードでプログラムを作成 IPv4/IPv6両方の接続を同時に受付ける2種類の手法

:ソケットA B

プロセスA

IPv6

IPv4プログラム α

接続

接続

プロセスB

サーバ

プロセスC

IPv6

IPv4

接続

接続 プログラム β

サーバ

Page 37: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

37

ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(1)

!

データとしてIPアドレスを扱う箇所

入力出力

整列

検索格納

Page 38: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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アドレス推奨テキスト表記ルールに従い省略可能

Page 39: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

39

ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(3)

入力 整数ではなく文字列で入力 !!!!

入力値の検証はライブラリの関数・フィルタを利用 例)PHP Net_IPv6::checkIPv6();  (PEARにて提供されるNet_IPv6パッケージに   含まれる)

IPv4のみ 15文字以内の文字列 [VARCHAR(15)] もしくは整数×4

IPv4/IPv6両対応 39文字以内の文字列 [VARCHAR(39)]Good!

Page 40: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

40

ポイント③ データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる(4)

格納、検索、整列、出力 IPアドレス型が定義されている場合は、IPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は、文字列型で 完全表記を使う IPv6完全表記)2001:0db8:0000:0000:0001:0000:0000:0001 見やすさを求めるときは、省略表記(RFC5952準拠)で出力

既存システムは、格納領域にIPv6アドレスが収まるかをチェック

Page 41: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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

省略表記のソートは

アドレス昇順と一致しない

(文字列) ソート

アドレス昇順

Page 42: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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

(文字列)ソート

完全表記

完全表記のソートはアドレス昇順と一致

Page 43: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

43

おわりに

Page 44: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

44

まとめ(1)IPv6を使える環境が増えている IPv4とIPv6の違い:アドレス空間が異なる , etc.                  ⇒互換性なし IPアドレスのハードコーディングはダメ。ゼッタイ。

IPv6対応の基本方針 IPv6対応=IPv6/IPv4の両方で動作させること シングルソースコードで対応する

Page 45: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

45

まとめ(2)IPv6対応のポイント 1. IPv4/IPv6両対応のプログラミング言語と実行環境を使う

2.通信処理をIPv4/IPv6の両方に対応させる 3.データとしてIPアドレスを扱う箇所をIPv4/IPv6の両方に対応させる

! 

決して難しくない! 今日から開発するアプリケーションは

IPv6に対応させよう!

Page 46: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

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

Page 47: これからのアプリ開発はIPv6対応で行こう!(2014/09/20 OSC Hiroshima版)

47

ご清聴いただき、ありがとうございました