20150227 ipv6 summit in fukui 2015 ipv6対応webサービスの作り方
TRANSCRIPT
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
渡辺 露文(わたなべ つゆふみ) 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
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
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
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
最近の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
インターネット回線 フレッツ光ネクスト 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
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
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
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
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
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
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
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
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
グローバルスコープ
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
アプリケーション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
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
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
アプリケーションの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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
データとして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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
おわりに
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
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
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
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
ご清聴いただきありがとうございました
98