20150227 ipv6 summit in fukui 2015 ipv6対応webサービスの作り方

98
1 IPv6対応Webサービスの作り方 2015年2月27日 IPv6普及・高度化推進協議会 渡辺 露文   IPv6 Summit in FUKUI 2015

Upload: v6app

Post on 17-Jul-2015

1.056 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

1

IPv6対応Webサービスの作り方

2015年2月27日 IPv6普及高度化推進協議会

渡辺 露文  

IPv6 Summit in FUKUI 2015

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

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

2

About me

3

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

Do you know hellip

4

Agenda

1 IPv6対応の話をする前に

2 IPv6対応Webサービスの作り方

3 LL(軽量プログラミング言語)の対応状況

4 VPSIaaSのIPv6対応状況

1 IPv6対応の話をする前に1 Webサービスを作る上で知っておくべきIPv6の基礎 2 IPv6対応の前に気を付けるべきこと

5

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 2: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

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

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

2

About me

3

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

Do you know hellip

4

Agenda

1 IPv6対応の話をする前に

2 IPv6対応Webサービスの作り方

3 LL(軽量プログラミング言語)の対応状況

4 VPSIaaSのIPv6対応状況

1 IPv6対応の話をする前に1 Webサービスを作る上で知っておくべきIPv6の基礎 2 IPv6対応の前に気を付けるべきこと

5

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 3: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

3

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

Do you know hellip

4

Agenda

1 IPv6対応の話をする前に

2 IPv6対応Webサービスの作り方

3 LL(軽量プログラミング言語)の対応状況

4 VPSIaaSのIPv6対応状況

1 IPv6対応の話をする前に1 Webサービスを作る上で知っておくべきIPv6の基礎 2 IPv6対応の前に気を付けるべきこと

5

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 4: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

4

Agenda

1 IPv6対応の話をする前に

2 IPv6対応Webサービスの作り方

3 LL(軽量プログラミング言語)の対応状況

4 VPSIaaSのIPv6対応状況

1 IPv6対応の話をする前に1 Webサービスを作る上で知っておくべきIPv6の基礎 2 IPv6対応の前に気を付けるべきこと

5

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 5: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

1 IPv6対応の話をする前に1 Webサービスを作る上で知っておくべきIPv6の基礎 2 IPv6対応の前に気を付けるべきこと

5

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 6: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

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

 hellip

6

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

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

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 7: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

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

 hellip

7

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

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

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

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 8: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

8

日本におけるIPv6の普及 状況

フレッツ光ネクストのIPv6普及率(2014年9月)

IPv6普及率39フレッツ光ネクスト契約数15805000契約

au ひかりのIPv6普及率(2014年9月)99

今後本格的に普及する前にIPv6対応を始めたほうが良い

出典IPv6普及高度化推進協議会 アクセス網におけるIPv6普及状況調査   httpv6pcjpjpspreadipv6spread_03phtml

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 9: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

9

余談確認してみようIPv6でインターネットにアクセスできるかな

Webブラウザで httpwwwtest-ipv6jp にアクセス

Webブラウザで httpwwwkamenet にアクセス

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

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 10: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

10

IPv6の背景  IPv4アドレス枯渇

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

通信事業者ISPデータセンター

クラウド事業者等の在庫が残るのみ

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

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 11: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

11

もはやIPv6対応しないと時代遅れ(1)

先日のGHOST騒ぎhellip脚注部分に注目

「gethostbyname 関数はIPv6 の登場によりあまり 利用されなくなっている」

httpwwwipagojpsecurityannounce20150129-glibchtml

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 12: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

12

もはやIPv6対応しないと時代遅れ(2)

GHOSTネタをもう一つ

httpblogtrendmicrocojparchives10818

多くの新しいアプリケーションではこの脆弱な「gethostbyname()」関数ではなくIPv6をサポートする関数「getaddrinfo()」を使用している

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 13: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

11 Webサービスを作る上で   知っておくべきIPv6の基礎

13

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 14: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

14

IPv4とIPv6とでは何が違うのか①

アドレス体系が異なる(IPv6のアドレス空間は広大)

例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001 IPv6省略表記)2001db81001(RFC5952準拠)

IPv4アドレス IPv6アドレスアドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記

区切り文字 (ドット) (コロン)文字列長 15文字以内 39文字以内

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 15: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

15

IPv4とIPv6とでは何が違うのか②

ユニキャストアドレスの構成

アドレス利用設計 IPv4ではネットワークアドレス部の長さを調整

IPv6では原則的にサブネットプレフィックスは固定

 

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

サブネット プレフィックス 64bit インターフェイス ID 64bit

ネットワーク アドレス 29bit ホストアドレス 3bit

Global Routing Prefix

n bitsSubnet ID

64 bitsInterface ID

64-n bits

Subnet Prefix

 ネットマスク 29bit(255255255248)の場合888bit

IPv4では収容する端末の見込み台数に応じて最適な大きさの サブネットを設計していたがIPv6では64bit固定

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 16: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

グローバルスコープ

IPv4とIPv6とでは何が違うのか③

16

リンクローカルスコープリンクローカルアドレス fe8010

ユニークローカルアドレス fc007

グローバルユニキャストアドレス 20003

IPv6では1つのNICに複数のアドレスを            有効範囲に応じて割当て使い分ける

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 17: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

17

IPv4とIPv6とでは何が違うのか④

他にも機能的にIPv4と異なることがある

最も重要なこと

IPv4とIPv6は互換性がない

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 18: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

IPv4とIPv6の接続性

18

Internet

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

IPv4IPv6両対応システム

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

(1)(2)

(3)

IPv4端末

IPv4IPv6両対応端末

IPv6端末

IPv4

IPv6

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

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

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

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

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

②通信処理をIPv4IPv6の 両方に対応させる

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

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

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

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

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

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

サーバ側の問題

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

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

クライアント側の問題

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

47

フォールバックの予防策

サーバ 設定の不備を修正する

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

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

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

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

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

49

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

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

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

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

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

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

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

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

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

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

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

98

Page 19: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

19

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

1 IPv6のみの環境と通信できない ビジネス機会を損失する システム連携が行えず要件を満たせなくなる

2 今後IPv4はサービスレベルが低下していく 通信事業者等によるCGN(Carrier Grade NAT)導入により遅くなったり利用できるセッション数が少なくなったりする可能性がある

IPv6に対応しなきゃ

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

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

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

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

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

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

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

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

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

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

サービス内容の変更 ユーザビリティ向上 hellipetc

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

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

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

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

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

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

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

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

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

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

32

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

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

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

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 20: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

20

WebサービスのIPv6対応ネットワークとサーバがIPv6に対応すればIPv6で接続可能

接続は可能だがhellip

例えば システム連携がうまくいかない 想定外の挙動をする

  hellip

アプリケーションのIPv6対応が不可欠

サービスが正常に動作しないかもしれない

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

とある Androidプログラミング書籍におけるソケット通信のサンプルコード

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

IPアドレスのハードコーディングはNG

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 21: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

12 IPv6対応の前に気を付ける   べきこと

21

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

とある Androidプログラミング書籍におけるソケット通信のサンプルコード

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

IPアドレスのハードコーディングはNG

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 22: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

22

そのコードイケてないhellip(1)

とある Perl のプログラム

use IOSocketIP13$host = ldquo198511001rdquo13 13 13my $sock = IOSocketIP-gtnew(13 PeerAddr =gt $host13 PeerPort =gt $port13 Proto =gt tcp13) or die ldquoError $nrdquo13 13

23

このコードイケてないhellip(2)

とある Androidプログラミング書籍におけるソケット通信のサンプルコード

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

IPアドレスのハードコーディングはNG

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 23: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

23

このコードイケてないhellip(2)

とある Androidプログラミング書籍におけるソケット通信のサンプルコード

public class SocketExhellip hellip hellip private final static String IP=ldquo1921681112rdquo変更必須

良い子は真似しちゃダメ

24

どこがイケてない  (というかヘン)

IPアドレスのハードコーディングはNG

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 24: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

24

どこがイケてない  (というかヘン)

IPアドレスのハードコーディングはNG

$host = ldquowwwexamplecomrdquoのようにFQDNで接続先を指定する

ダメゼッタイ

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 25: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

Internet

25

ネットワークアクセスの作法=名前解決を使う

Client

Web Server wwwexamplejp 2001db81001192021

DNS Server 1985110053

①名前解決問合せwwwexamplejp

②アドレス応答wwwexamplejp rArr 2001db81001

  192021

③HTTP通信

FQDN

FQDNで接続先を指定しDNSからアドレス取得

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 26: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

26

なぜIPアドレス直書きがダメなのか

アプリケーションはIPアドレスに依存すべきではない

目的 変更改修の理由アプリケーション 機能の提供 業務要件の変更

サービス内容の変更 ユーザビリティ向上 hellipetc

インフラ 資源の提供 資源管理(IPアドレスサーバラックhellip) 性能

互いに変更の影響を受けるべきではない

同一システムでも変更改修の理由時期は異なる

例)IPアドレスでユーザを識別すべきではない

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 27: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

Cookie内の情報にも気を付ける

27

Cookie内に記載される情報の生成がIPv4アドレスを前提としている実装が散見されるこのようなアプリケーションに関しては生成ロジックを変更する必要がある

Cookie内の情報としてIPv4アドレスを直接利用している実装がしばしば見られる特に認証系システムなどでこの種の情報の取扱いがなされている場合が多いこのような実装では利用者がIPv4IPv6の両方の空間を利用しておりどちらを利用するかが一位に定まらない場合などに問題が発生するこのような実装の場合単純にIPv4IPv6両方に対応させることが困難である

出典IPv6普及高度化推進協議会 セキュリティWG IPv6対応セキュリティガイドライン(第10版)

   httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 28: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

28

1章まとめWebサービスに重要なIPv4とIPv6の違い アドレス体系が異なる アドレス利用設計が変わる 複数のアドレスを有効範囲に応じて使い分ける

IPv4とIPv6は互換性がない

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 29: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

2 IPv6対応Webサービスの  作り方21 プログラミング言語と実行環境 22 通信処理のIPv6対応 23 データとしてIPアドレスを扱う箇所の対応 24 DMZのIPv6対応方式とサーバへのアクセス

29

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 30: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

Webサービス

30

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

アプリケーションを中心に解説します

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 31: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

アプリケーションIPv6対応の基本方針①

31

 IPv6対応 =

    IPv4とIPv6の両方で動作する

シングルソースコードで対応

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 32: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

32

アプリケーションIPv6対応の基本方針②

IPv6とIPv4の共存期間が長く続く これまでIPv4で提供してきたサービスは今後も継続してIPv4でも動作する必要がある

 IPv6対応 =

    IPv4とIPv6の両方で動作する

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 33: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

33

アプリケーションIPv6対応の基本方針③

各開発言語が概ねIPv6に対応しておりプロトコルによって開発言語を分ける 必要がなくなった アプリケーションのメンテナンス性を重視しプロトコルによって機能差異が生じることを未然に防ぐ

シングルソースコードで対応

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 34: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

アプリケーションのIPv6対応のポイント

34

EthernetIP(v4v6)TCP UDP

アプリケーション

OS

ミドルウェアフレームワーク

アプリケーション

OS

フレームワーク

HTTPHTTPS SMTP SSHソケット通信など

クライアント サーバ

①IPv4IPv6両対応の プログラミング言語と実行環境を使う

②通信処理をIPv4IPv6の 両方に対応させる

③データとしてIPアドレスを 扱う箇所をIPv4IPv6の 両方に対応させる

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 35: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

21 プログラミング言語と   実行環境

35

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 36: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

36

ここでいうIPv4IPv6両対応とは

プログラミング言語と実行環境におけるIPv4IPv6両対応とは

名前解決機構がIPv4IPv6両方のアドレスを適切に扱える

IPv4IPv6両方で通信できる

これらを満たすプログラミング言語実装環境を利用する

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 37: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

37

実装上の留意点プログラミング言語実行環境の選定における留意点 実際には各プロダクトでサポート状況に差異があるため 開発するアプリケーションが提供する機能を考慮し個別に判断する必要がある

プログラミングにおける留意点 IPv4IPv6の双方に対応するライブラリオブジェクト 関数データ型を使う 従来(IPv4のみ)のものとは別に用意されていることがある C addrinfo構造体getaddrinfo() Java InetAddressクラス Perl IOSocketIP       など

アドレス検証変換などはライブラリを有効活用

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 38: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

22 通信処理のIPv6対応

38

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 39: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

IPv4とIPv6の両方で通信できることとは

クライアント IPv4およびIPv6で意図するサーバへ接続できること

サーバ IPv4およびIPv6で接続を受付けること

39

IPv6 IPv6

IPv4 IPv4

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 40: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

IPアドレスを複数持つことがある

40

IPv6 IPv6

IPv4 IPv4

複数のアドレスを持つことがある

複数のアドレスを持つことがある

クライアントがどのアドレスにアクセスするかはサーバ側では予測できない

特定のアドレスに依存したシステムを構成すべきではない

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 41: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

41

IPv6の名前解決①FQDNで接続先を指定してIPv6で通信を行うにはDNSにてFQDNからIPv6アドレスが名前解決できることが必要不可欠

FQDNからIPv6アドレスを名前解決 権威DNSサーバ上で接続先サーバのAAAAレコードにIPv6アドレスが登録されている クライアントから接続先サーバのAAAAレコードが引ける

Webアプリケーション開発においてはFQDNのIPv6アドレスが正しく名前解決できることを確認する

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 42: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

IPv6の名前解決②

42

Client

Web Server wwwexamplejp 2001db81001

examplejpの

権威DNS Server AAAAレコード(IPv4の

Aレコードに相当)をリソースレコードに登録

①名前解決問合せ

wwwexamplejp ②AAAA応答

2001db81001

③HTTP通信

wwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 43: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

43

通信の試行順序RFC6724 Default Address Selection for IPv6

優先順位が変わるケース デフォルトを変更している環境 RFC6724に準拠していない実装

IPv6 gt IPv4

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 44: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

44

クライアントプログラムIPv4IPv6 両宛先アドレスに接続できるようにする

接続できない状況も想定し接続失敗時には別の宛先アドレスに切替えて接続する(フォールバック)アプリケーションの作りが悪いとhellip 切替えに時間がかかる 正常に切替わらないこともある

ユーザの利便性を損なう

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 45: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

45

通信処理の補足フォールバック

接続できない場合に別の接続先への接続に切替える動作

Client

Web Server wwwexamplejp

DNS Serverwwwexamplejp IN AAAA 2001db81001 wwwexamplejp IN A 192021

①名前解決問合せ

wwwexamplejp

②AAAA応答 2001db81001

 A応答 192021

③HTTP通信(IPv6)2001db81001

192021

2001db8ffff1

198511001④HTTP通信(IPv4)

フォールバック

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 46: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

46

想定されるフォールバックの主な原因

サーバ側の問題

サーバが当該のサービスを提供していない DNS誤登録障害等

経路の問題 ネットワークの接続性が失われている ISPの不具合

クライアント側の問題

サーバへの到達性がないアドレスを選択して通信を行おうとしている グローバルアドレスを使用している閉域網

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 47: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

47

フォールバックの予防策

サーバ 設定の不備を修正する

サービスを提供していないIPアドレスをDNSに登録しない サービスを適切に提供する

ISP ネットワークの接続性を健全に保つ

クライアント IPv6インターネット接続可能なISPと契約する

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 48: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

48

サーバプログラムIPv4IPv6 両プロトコルでの接続を処理

主要なWebサーバプログラムは対応済み Apache HTTP Server Microsoft Internet Information Server (IIS) nginx

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 49: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

23 データとしてIPアドレスを   扱う箇所の対応

49

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 50: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

データとしてIPアドレスを扱う箇所

50

入力出力

整列

検索格納

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 51: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

51

IPv4IPv6アドレス比較IPv4アドレス IPv6アドレス

アドレス長 32bit 128bit

文字列表記

表記法 8bitずつ区切り10進数で表記

16bitずつ区切り16進数で表記 (省略表記あり)

区切り文字 (ドット) (コロン)

文字列長 15文字以内 39文字以内

サブネットマスクプレフィックス長を考慮すると上記+rdquordquo+数字3文字

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 52: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

52

IPv6アドレス表記法特段の事情がない限り RFC5952 の表記ルールに従い表記する(省略表記)

アドレス表記例 IPv4)192021 IPv6完全表記)20010db8000000000001000000000001IPv6省略表記)2001db81001

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 53: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

53

IPv6アドレスの文字列長IPv6アドレスの文字列長39文字 プレフィックスを加味すると43文字

例外(39文字を超えることがある) リンクローカルアドレスにゾーンID(スコープID)を付与してインターフェースを識別する場合 例)fe801eth1

一部の特殊アドレス IPv4射影アドレス等例)ffff19216801

IPv4射影アドレス IPv4 アドレスを IPv6 アドレスとして表現するための IPv6 アドレス上位80ビットに081~96ビット目に1下位32ビットにIPv4アドレスを埋め込む機器内部での使用に限られパケットの始点終点アドレスには使われない 出典IPv6関連用語集 IPv4-mapped(IPv6) address

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 54: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

54

IPv6アドレスを扱えないIPアドレス入力格納

15文字までの文字列(varchar(15))

1つの整数として扱う

1オクテットずつ4つの整数として扱う

そのままではIPv6アドレスを格納できずエラーとなる

IPv4IPv6両対応 39文字以内の文字列 [VARCHAR(39)] Good

Bad

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 55: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

55

Webフォームからの入力入力値の検証 IPアドレスを扱う場合入力された文字列がIPアドレスとして取りうる値であることを検証 IPv4アドレスIPv6アドレス いずれかとして取りうる値

2箇所で実施可能 ブラウザ側(HTML5のForm Validation等) サーバ側

アドレス処理ライブラリを利用すると便利 例)PHP Net_IPv6checkIPv6()   (PEARにて提供されるNet_IPv6パッケージに含まれる)

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 56: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

56

格納検索整列出力IPアドレス型が定義されている場合はIPアドレス型を使う 例) PostgreSQLのネットワークアドレス型

IPアドレス型が定義されていない場合は文字列型で完全表記を使う IPv6完全表記)20010db8000000000001000000000001 見やすさを求めるときは省略表記(RFC5952準拠)で出力 過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

既存システムは格納領域にIPv6アドレスが収まるかをチェック

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 57: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

57

PostgreSQLのネットワークアドレス型

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 58: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

58

文字列型で扱う場合なぜ完全表記か①

省略表記のまま整列してもhellip2001db80111 2001db8021 2001db80150 2001db80101

整列前

2001db80101 2001db80111 2001db80150 2001db8021

整列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

省略表記の整列は

アドレス昇順と一致しない

(文字列) 整列

アドレス昇順

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 59: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

59

文字列型で扱う場合なぜ完全表記か②

整列は完全表記で行う2001db80111 2001db8021 2001db80150 2001db80101

整列列前

整列列後アドレス昇順2001db80150 2001db80111 2001db8021 2001db80101

アドレス昇順

20010db8000000010000000000010001 20010db8000000020000000000000001 20010db8000000010000000000000050 20010db8000000100000000000000001

20010db8000000010000000000000050 20010db800000001000000000001000120010db800000002000000000000000120010db8000000100000000000000001

(文字列)整列

完全表記

完全表記の整列はアドレス昇順と

一致

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 60: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

60

サンプルコード(IPアドレス整列の例)

ltphp $tmp_arr = array(2001db80111 2001db8021 2001db80150 2001db80101) require_once NetIPv6php Net_IPv6パッケージを呼び出し foreach ($tmp_arr as $short_addr) if (Net_IPv6checkIPv6($short_addr)) IPv6アドレスであることをチェック $full_arr[] = Net_IPv6uncompress($short_addr true) 省略表記を解除 echo before print_r($tmp_arr) 整列前配列の出力 sort($full_arr) 配列を整列 foreach ($full_arr as $full_addr) if (Net_IPv6checkIPv6($full_addr)) IPv6アドレスであることをチェック $sorted_arr[] = Net_IPv6compress($full_addr) 省略表記化 echo ltBRgtafter print_r($sorted_arr) 整列後配列の出力 gt

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 61: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

61

文字列型として扱うときの注意点

省略表記 hArr 完全表記 の変換はライブラリを有効活用する

過去に開発されたシステムツールではRFC5952に準拠しない省略表記が存在しうるので要注意

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 62: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

62

ログ出力解析への影響例)Apache HTTP Server ログファイル

OSSログ解析プログラムは大抵問題なく処理できる AWStats Webalizerhellip 注アクセス元の国地域は解析できない場合がある

ログ解析を自作している人は要注意 アドレス部分の文字列長が長くなる アドレスの区切り文字が変わる

fdb65591261210100 - - [08Oct2014175230 +0900] GET HTTP11 200 144 1721610128 - - [08Oct2014180159 +0900] GET HTTP11 200 100

1

2

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 63: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

24 DMZのIPv6対応方式と   サーバへのアクセス

63

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 64: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

DMZのIPv6対応方式①

64

パラレルスタック デュアルスタック トランスレーション構成イメージ

概要 IPv4とIPv6のネットワークを分離して構築

運用

IPv4IPv6を同列に同一のネットワーク

で扱う

IPv4ネットワークを変更せずトランスレータ

を導入する

IPv4 IPv6

GW

IPv4 IPv6

GW

NW機器 NW機器 NW機器

IPv4 IPv6

GW

NW機器

GW

トランスレータ

v4

v4

v4

v4

v4

v4v4

v6

v6

v6

v4 v6 v6

v6

v4v6

v4v6

GW

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 65: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

DMZのIPv6対応方式②

65

パラレルスタック デュアルスタック トランスレーションメリット 分界点が明確

ネットワークの安定的な運用が確保しやすい

概念が単純

低コスト 変更が最小限

デメリット 高コスト 管理対象が増える

運用分析工数が増加

障害の影響範囲が広い

セキュリティ機器の実績不足

ネットワーク構造の変更が必要な場合がある

運用実績が少ない 障害発生時に対応が難しい

セキュリティ機器の通信制御が難しくなる

参考資料「IPv6対応セキュリティガイドライン(第10版)」IPv6普及高度化推進協議会セキュリティWG httpwwwv6pcjpjpuploadpdfswg-IPv6SecurityGuideline_v10pdf

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 66: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

DMZのIPv6対応方式とサーバへのアクセスの関係

66

パラレルスタック デュアルスタック トランスレーションサーバへのアクセス

IPv4またはIPv6(分離)

IPv4およびIPv6(混在)

IPv4のみ

サーバが認識する接続元アドレス

クライアントのIPアドレス

クライアントのIPアドレス

トランスレータの IPアドレス

外部のIPv6システムへの能動的な接続

可能 可能 不可能(別途対応が必要)

ldquoX-Forwarded-Forrdquo ヘッダを付与できる装置を用いアプリケーション側でこのヘッダ値を取得する等の方法

で対応可

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 67: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

67

2章まとめIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

IPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

DMZのIPv6対応方式は要件に合わせて選択  

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 68: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

3 LL(軽量プログラミング  言語)の対応状況31 Perl 32 PHP 33 その他の言語

68

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 69: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

31 Perl

69

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 70: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

70

Perlの概要Perl のバージョン 最新版(Perl5) 5202 (2015214リリース)

Perl とネットワークプログラミング 標準ライブラリ (コアモジュール) で基本的なネットワークプログラミングが可能 (ソケット HTTP クライアント SMTP クライアント) その他の機能が欲しい場合は CPAN1 のモジュール等を使用する 1 Comprehensive Perl Archive Network httpwwwcpanorg

Perl と IPv6 Perl 514 から本格的に IPv6 をサポート Perl and IPv6 ‒ Perl supports IPv6 httpwwwperlorgaboutwhitepapersperl-ipv6html

それより前のバージョンでも CPAN モジュールを利用すれば IPv6を使うことは可能

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 71: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

71

Perlの対応状況考慮すべき要素 対応状況 備考名前解決 Socketgetaddrinfo()

Socketgetnameinfo() CPAN NetDNS

ソケット コアモジュールの Socketは 510 から部分的に対応

514でフル対応 CPANモジュールにも対応しているものがある

各種(L7)プロトコル

HTTPクライアント 標準では非対応(コアモジュール

HTTPTiny LWP等のメジャーなモジュールも非対応)

SMTPクライアント 標準では非対応(コアモジュール

NetSMTP)その他 IPv6アドレス

の処理 CPANモジュール NetIPにより対応

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 72: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

72

【Perl】Socket関連の対応状況①

Socket IOSocketINET IOSocketIP

コアCPAN コアモジュール コアモジュール CPANモジュール

IPv6対応 (Perl 514付属のSocket 194以降)

times

備考 IPv6関連のものはほとんどが明示的にインポートする必要あり

多くのネットワーク系モジュールが IOSocketINET を使用しているが それらのモジュールも当然ながら IPv6 非対応となっている (対応方法は後述)

IOSocketINET の置き換えとして設計されておりコンストラクタやメソッドは互換性がある (一部例外あり)

IOSocketINETでやっていたことをやりたい場合にはこのモ

ジュールを使うのが良い

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 73: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

73

【Perl】Socket関連の対応状況②

IOSocketINETとIOSocketIPの比較 IOSocketINET と IOSocketIP による TCPクライアントの例 ($host の $port に TCP で接続)

赤字の部分 (use およびコンストラクタ) を変更するだけで IPv4専用だったコードが IPv4 IPv6 両対応になる (はず) (変更後のプロトコルの優先順位はポリシーテーブルの設定に従う) もちろん IPv4 アドレスが直書きしてあるような部分については  別途対応する必要あり

use IOSocketINET my $sock = IOSocketINET-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

use IOSocketIP my $sock = IOSocketIP-gtnew( PeerAddr =gt $host PeerPort =gt $port Proto =gt tcp ) or die ldquoError $nrdquo

IOSocketINET IOSocketIPここ

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 74: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

74

【Perl】サービス(HTTP SMTP)の対応状況

HTTPクライアントのメジャーどころIPv6非対応

SMTPクライアント(NetSMTP)IPv6非対応 IOSocketINETのサブクラスのため

HTTPTiny IOSocketINETを使用しているためHTTPLite [CPAN] socket()にPF_INETを渡しているためLWPUserAgent

[CPAN]内部で使用している NetHTTP が

IOSocketINET のサブクラスのため

IOSocketINETに由来して非対応のものが多い既存のコード

CPANモジュール等IOSocketINET

依存

依存IPv6非対応

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 75: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

75

【Perl】NetINET6GlueによるIPv6対応①

NetINET6Glueを使用することでIOSocketINET を使用するモジュールをIPv6に対応させることが可能

NetINET6Glue IOSocketINET6 からシンボルテーブルを IOSocketINET にコピーすることで IOSocketINET を IOSocketINET6 のように動作させる CPAN モジュール 詳細は NetINET6GlueINET_is_INET6pm を参照 httpsearchcpanorgdistNet-INET6Glue

LWP や NetSMTP 等の IOSocketINET 依存モジュールを使用したプログラムで NetINET6Glue により IPv6 での通信ができるようになったことが確認されている

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 76: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

76

【Perl】NetINET6GlueによるIPv6対応②

使い方IOSocketINET に依存した CPAN モジュール等を使用している既存のコードの先頭で ldquouse NetINET6Gluerdquo するだけ

HTTPTiny (IOSocketINET 依存 = IPv4 専用) を使用したコードを NetINET6Glue によって IPv6 に対応させる例

  use NetINET6Glue larr これを追加するだけ   use HTTPTiny      my $http = HTTPTiny-gtnew   my $response = $http-gtget($url)   print $response-gtcontent

既存のコード

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 77: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

77

【Perl】名前解決NetDNS DNS リゾルバ (CPAN モジュール) httpsearchcpanorgdistNet-DNS

IPv6 関連 RR の検索に対応 IPv6 関連の RR (AAAA IPv6 アドレスの PTR) は問題なく 引ける AAAA を引いた結果の文字列表現は による省略がされない(NetDNSRR の print() 等) IP アドレスはそのままの形式で逆引きできる(in-addrarpa ip6arpa 形式にする必要がない) IPv6 アドレスを逆引きするときは で省略したアドレスを 渡すことも可能

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 78: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

78

【Perl】アドレス処理NetIP IPv4 IPv6 アドレス処理のための様々な機能を提供するCPANモジュール httpsearchcpanorgdistNet-IP

次のようなメソッドを提供する version() IP のバージョンを返す (4 or 6) ip() IPv6 アドレスの場合 最も冗長な表現を        返す short() できるだけ省略された表記を返す reverse_ip() 逆引き用の表記 (PTR レコードの形式)        を返す

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 79: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

32 PHP

79

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 80: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

80

PHPの概要PHP最新バージョン 56系が最新系列になった最新は566 (2015219) 55系54系もメンテナンスされている最新は 5522 5438 (2015219)

PHPとネットワークプログラミング 標準ライブラリで非常に広範囲なネットワーク プログラミングが可能 その他の機能が欲しい場合は 拡張ライブラリ PEAR1 のパッケージ 等を使用する PHP Extension and Application Repository httppearphpnet

PHPとIPv6 PHP 5 から IPv6 に対応 httpwwwphpnetChangeLog-5php (Version 500 Beta 1 欄)

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 81: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

81

PHPの対応状況考慮すべき要素 対応状況 備考

名前解決 dns_get_record() gethostbyaddr() PEAR Net_DNS2

ソケット inet_pton() inet_ptop()は 510 以降対応

各種(L7)プロトコル

HTTPクライアント 各種ファイル関数(fopenなど)

cURLなどSMTP

クライアント PEAR Net_SMTP mail() PEAR Mail rArrシステム環境依存

その他 IPv6アドレスの処理

PEAR Net_IPv6拡張パッケージ

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 82: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

82

【PHP】名前解決正引き dns_get_record 引数で指定したRRの情報を取得して配列で返す

逆引き gethostbyaddr 引数で指定したアドレスに対応するホスト名を返す

wwwiajapanorg の IPv6 アドレス (AAAA レコード) を検索 $result = dns_get_record(wwwiajapanorg DNS_ALL)

$result = gethostbyaddr(lsquo19216801) $result = gethostbyaddr(lsquo2001db80111)

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 83: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

83

【PHP】HTTPクライアント

URLをオープンする fopen() ファイルを開くのと同様にURLを指定して開くことができる(phpini にて allow_url_fopen を有効にしている場合のみ)

$fh = fopen(ldquohttpwwwiajapanorgipv6summitFUKUI2015htmlrdquo ldquorrdquo) $fh = fopen(ldquohttp[2001db81]rdquo ldquorrdquo)

URLにIPv6アドレスを指定する場合には [ ] で括る

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 84: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

84

【PHP】アドレス処理PEARNet_IPv6 IPv6 アドレスに関する処理を行う httppearphpnetpackageNet_IPv6

下記のようなメソッドを提供する checkIPv6() IPv6のアドレスか検証 compress() IPアドレスの短縮 uncompress() IPアドレスの伸長 isInNetmask() IPが指定したアドレス空間に        あるかどうかを調べる

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 85: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

33 他のLLの対応状況

85

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 86: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

86

他のLLの対応状況以下を参照ください InternetWeek 2012「スクリプト言語とIPv6 -2012-」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2012proceedingst7t7-sekinepdf

InternetWeek 2011「Lightweight LanguageとIPv6」関根 佳直 氏 httpswwwnicadjpjamaterialsiw2011proceedingst5t5-03pdf

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 87: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

87

3章まとめPerl514以降は概ねIPv6対応 IOSocketINETに起因して非対応のモジュールはNetINET6Glue を利用することでIPv6対応可

PHPPHP5以降はIPv6対応

Python Rubyも概ねIPv6対応

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 88: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

4 VPSIaaSのIPv6対応状況

88

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 89: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

89

VPSIaaSに見られるIPv6対応方法構成イメージ 備考

IPv6ネイティブ 先述の「DMZのIPv6対応方式」における「パラレルスタック」もしくは「デュアルスタック」

トランスレーション 先述の「DMZのIPv6対応方式」における「トランスレーション」と同じ

IPv6トンネリング トンネルルータhArrWebサーバ間においてIPv6を

IPv4でトンネル

ルータ Webサーバ

IPv6 IPv6internet

トンネルルータ

Webサーバ

IPv6

IPv6 トンネル

internet

ロードバランサ等

Webサーバ

IPv6 IPv4internet

IPv4

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 90: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

90

VPSIaaSのIPv6対応状況の注意事項

サービス提供企業がWebサイトで公開している 情報を元にまとめたものです

2015年2月20日現在の情報です

ここに記載されている特定のサービスの利用を 薦めるものではありません

情報に誤りがありましたらご指摘ください

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 91: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

91

VPSIaaSの対応状況①企業名 サービス名 対応状況 対応方式 URL

Amazon AWS トランスレーション

httpdocsawsamazoncomja_jpElasticLoadBalancing

latestDeveloperGuideusing-elb-ipv6html (Note欄)

Google Google Compute Engine

times - httpscloudgooglecomcomputedocsnetworking

IBM SoftLayer ネイティブ httpwwwsoftlayercomnetwork

Microsoft Azure times - httpazuremicrosoftcomja-jppricingfaq

AWSの対応状況については現状VPC環境で利用できない

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 92: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

92

VPSIaaSの対応状況②企業名 サービス名 対応状況 対応方式 URL

ABLENET ABLENET httpwwwablenetjpvpsspecindexhtml

GMOインターネット

ConoHa httpswwwconohajpfeatures (スペックシート)

さくらインターネット

さくらのVPS httpvpssakuraadjp

specificationhtml

さくらインターネット

さくらのクラウド

トライアル提供(2015年3月末まで)

トンネル(6rd)

httpresearchsakuraadjp6rd-trial

DTI ServerManVPS httpdreamjpvpsservicehtml

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 93: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

93

VPSIaaSの対応状況③企業名 サービス名 対応状況 対応方式 URL

BIGLOBE BIGLOBEクラウドホスティング

httpcloudbiglobenejphostingspec

IIJ IIJ GIO ホスティングパッケージサービス

httpwwwiijadjpbizhostingspechtml

NIFTY NIFTY Cloud times - httpcloudniftycomcs

catalogcloud_faqcatalog_121217001082_1htm

NTTコミュニケーションズ

Bizホスティング

Enterprise Cloud

times(今後対応予定)

- httpwwwnttcombhecdataroadmaphtml

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 94: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

おわりに

94

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 95: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

95

まとめ①IPv6を使える環境が増えている

IPv4とIPv6は互換性なし

WebサービスのIPv6対応にはアプリケーションの対応が不可欠

IPアドレスのハードコーディングはダメゼッタイ

 

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 96: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

96

まとめ②アプリケーションのIPv6対応の基本方針 IPv6対応=IPv6IPv4の両方で動作させること シングルソースコードで対応する

アプリケーションのIPv6対応のポイント 1 IPv4IPv6両対応のプログラミング言語と実行環境を使う 2 通信処理をIPv4IPv6の両方に対応させる 3 データとしてIPアドレスを扱う箇所をIPv4IPv6の両方に対応させる

  LLは概ねIPv6に対応済み

 決して難しくない

今日から開発するWebサービスはIPv6に対応させよう

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 97: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

97

つづきはWebで(参考文献)

「アプリケーションのIPv6対応ガイドライン 基礎編」IPv6 普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201212ipv610phtml

「アプリケーションのIPv6対応ガイドライン Webアプリ編 (案)」IPv6普及高度化推進協議会 IPv4IPv6共存WG アプリケーションのIPv6対応検討SWG httpwwwv6pcjpjpentrywg201406ipv6webphtml

Internet Week 2013 「T2 アプリケーションサービスのIPv6対応」 軽量プログラミング言語のIPv6対応 Perl編渡辺 露文 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-watanabe-2pdf

軽量プログラミング言語のIPv6対応 PHP編波田野 裕一 httpswwwnicadjpjamaterialsiw2013proceedingst2t2-hatano-2pdf

ご清聴いただきありがとうございました

98

Page 98: 20150227 IPv6 Summit in FUKUI 2015 IPv6対応webサービスの作り方

ご清聴いただきありがとうございました

98