IPv6 なう.NET Framework で IPv6 に追いつこう
小野 雄太郎Microsoft MVP for ASP.NET/IIS, Jan 2011-Dec 2011.
Agenda
• IPv6 なう– IPv4 枯渇しました– World IPv6 Day が行われました
• IPv4 はなくなるのか• .NET Framework で IPv6 に対応する
– クライアントサイド– サーバーサイド
• ネットワーク構築とトラブルシューティング
IPv4 アドレスは売り切れました
• 2011 年 2 月 3 日に IANA から RIR に最後の割り振り (/8)
• 2011 年 4 月 25 日に APNIC の在庫枯渇により割り振り終了
出典 : JPNIC
アドレス枯渇による影響
• 予想される影響– 大規模なデータセンタ新築が困難になる
• 既存 IP ブロックを持っている事業者以外は難しい
– ブランチオフィスとの VPN 接続用 IP の確保が課題に• 日本だけでなく APAC 地域で顕著と予想される
– キャリアグレード NAT 導入による影響• ISP から振られる IP が Private Address 化する• 多段 NAT 化したさいのアプリケーションへの影
響
アドレス枯渇による影響
• 間違った懸念– 既存のネットワークが使えなくなる
• レガシーはレガシーとして動き続ける• ただしキャリアグレード NAT 等の導入状況は注
視する必要がある– すべてのネットワークを IPv6 に移行する必要があ
る• Dual Stack (IPv4 + IPv6 ハイブリッド ) とし
て並行稼働していく
World IPv6 Day
• 世界中の Web サービスが、 2011 年 6 月 8 日の 24時間だけ IPv6 対応にして、その影響を調べようという世界規模の自主的な実験が行われました– http://www.worldipv6day.org– http://www.attn.jp/worldipv6day/ ( 日本語情報 )
World IPv6 Day の結果
• 大きな問題は現在のところ報告されていない– サイト側の設定ミスによる不具合等はあった
• さまざまな情報が徐々に集約されてきているので、今後各地で公開される情報を参考に– 6/21 に振り返りのミーティングが行われる予定
• http://www.attn.jp/worldipv6day/meeting/20110621/
– JANOG (Japan Network Operator’s Group) が主催する JANOG28 Meeting (7/14-15) でもセッションあり
• http://www.janog.gr.jp/meeting/janog28/
日本固有の問題
• NTT 東西 ( フレッツサービス ) に関する混乱– フレッツ網におけるサービス ( ビデオオンデマンド
等 ) で、 IPv6 を使っていることに起因する接続性問題• フレッツ光ネクストでは、
フレッツ網を通じた IPv6 接続サービスが始まった
IPv4 はなくなるのか
IPv4 のゆくえ
• 当面は使われ続ける– 明日 bing ることができなくなることはない– 社内向けサービスを IPv6 専用へ書き換える必要は
おそらくない• サーバーファームを作ることは難しくなる
– 新しい公開サービスに IPv6 が使われる可能性は高い• オンラインゲームのサーバへ IPv6 でつながるなど• IPv6 トンネル機能が内蔵されるかも
• パブリッククラウドへ逃げることも一時的な対策としかならない
枯渇対応アクションプラン
• IPv4 アドレス枯渇対応タスクフォースが、枯渇対応に関するアクションプランの推薦パターンを公開している– http://www.kokatsu.jp/blog/ipv4/
– 枯渇対応アクションプラン• http://www.kokatsu.jp/blog/ipv4/news/2011/04/ipv4-
201104.html
例 : ASP/CSP 向け アクションプラン
.NET Framework で IPv6 に対応する
Ready, set, go
.NET Framework で IPv6 対応するために
• Ready to go!– フレームワークはすでに対応済み– もっとも対応できていないのは UI のケースが多数– IPv6 ならではの、アドレス選択の仕組みを意識す
る必要があるケースも
UI の対応方法 (1)
• アドレスを入力できるようにする
UI の対応方法 (2)
• アドレスをルックアップする
ローカル IP アドレスをルックアップする
• ローカルホストのアドレスを解決する
string hostname = String.Empty;IPHostEntry iphost = Dns.GetHostEntry(hostname);IPAddress[] addresses = iphost.AddressList;
• AddressFamily でプロトコルを判別できるif (address.AddressFamily == AddressFamily.InterNetworkV6)
アドレスのチェック方法
• IPAddress.TryParse() を利用する
string inputAddress = this.TextBoxParsing.Text.Trim();IPAddress address;
if (!IPAddress.TryParse(inputAddress, out address)) { this.ShowResult(" アドレスが正しい形式ではありません。 ");} else { this.ShowResult(address.ToString());}
IPv6 で待ち受け
// ローカルのアドレスをルックアップするstring hostname = String.Empty;IPHostEntry iphost = Dns.GetHostEntry(hostname);IPAddress[] addresses = iphost.AddressList;
// v6 アドレスのみ選択するIPAddress[] addressV6 = addresses.Where(p => p.AddressFamily == AddressFamily.InterNetworkV6).ToArray();
// v6 アドレスがない場合if (addressV6.Count() < 1){ throw new ApplicationException();}
// v6 アドレスで待ち受けを開始するTcpListener listener = new TcpListener(addressV6.First(), tcpPort);listener.Start();
IPv6 でつなぐ
// ローカルのアドレスをルックアップするstring hostname = String.Empty;IPHostEntry iphost = Dns.GetHostEntry(hostname);IPAddress[] addresses = iphost.AddressList;
// v6 アドレスのみ選択するIPAddress[] addressV6 = addresses.Where(p => p.AddressFamily == AddressFamily.InterNetworkV6).ToArray();
// v6 アドレスがない場合if (addressV6.Count() < 1){ throw new ApplicationException();}
// サーバに接続するTcpClient client = new TcpClient(AddressFamily.InterNetworkV6);client.Connect(addressV6, tcpPort);
DNS解決
• IPv6 リンクローカルアドレスしか割り当てられていないときは、 AAAA レコードは結果からフィルタされる
IPHostEntry hostGoogle = Dns.GetHostEntry("www.google.com.");IPHostEntry hostV6pc = Dns.GetHostEntry("v6pc.jp.");IPHostEntry hostXbox = Dns.GetHostEntry("xbox.com.");
WFC の場合
• IPv6 アドレスでリスンすることももちろん可能
<?xml version="1.0" encoding="utf-8" ?><configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="WcfService_Behavior"> <serviceDebug httpHelpPageUrl="http://[::1]:4002/IPv6WCFServer/WcfService/Help" /> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://[::1]:4002/IPv6WCFServer/WcfService/mex" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="WcfService_Behavior" name="IPv6WCFServer.WcfService"> <endpoint address="http://[::1]:4002/IPv6WCFServer/WcfService" binding="basicHttpBinding" bindingConfiguration="" contract="IPv6WCFServer.WcfService" /> </service> </services> </system.serviceModel></configuration>
インターフェース指定
• IPv6 ではアドレスと同時にインターフェースを指定する場合がある– 例 : fe80::80%4
• UI 上で入力拒否しない– IPAddress.TryParse() を活用
• インターフェースの確認– ipconfig /all– netsh int ipv6 show addr
IPv6管理コマンド
• netsh interface ipv6 を主に利用するshow addresses - 現在の IP アドレスを表示します。show compartments - コンパートメント パラメーターを表示します。show destinationcache - 宛先キャッシュ エントリを表示します。show dnsservers - DNS サーバー アドレスを表示します。show dynamicportrange - 動的ポート範囲の構成パラメーターを表示します。show global - グローバル構成パラメーターを表示します。show interfaces - インターフェイス パラメーターを表示します。show ipstats - IP 統計情報を表示します。show joins - 参加したマルチキャスト グループを表示します。show neighbors - 近隣キャッシュ エントリを表示します。show offload - offload 情報を表示します。show potentialrouters - 利用可能なルーターを表示します。show prefixpolicies - プレフィックス ポリシー エントリを表示します。show privacy - プライバシー構成パラメーターを表示します。show route - ルート テーブル エントリを表示します。show siteprefixes - サイト プレフィックス テーブル エントリを表示します。show subinterfaces - サブインターフェイス パラメーターを表示します。show tcpstats - TCP 統計情報を表示します。show teredo - Teredo 状態を表示します。show udpstats - UDP 統計情報を表示します。
ネットワーク構築とトラブルシューティング
IPv6 導入時に注意すべき課題
• IPv6普及・高度化推進協議会により、” IPv6 導入時に注意すべき課題” とした文書が公開予定となっている– 現在はパブリックコメントを募集中– http://www.v6pc.jp/jp/entry/wg/2011/06/ipv6.phtml
• これまでに判明している課題を一度に把握できるドキュメントとなっている
ネットワーク構築とトラブルシューティング
• IPv6 導入時に起こり得るトラブル– フォールバック問題– DNS回答による接続問題– エセ IPv6 対応ルータ– 不適切な ICMPv6 フィルタ
• ネットワーク設計に関すること– 不正な RA による Route 汚染– 非対称フィルタによるアクセス範囲拡大– ネットワーク帯域の非対称性
フォールバック問題
• DNS で名前解決したときに IPv6 アドレスが返ってきたときに、クライアントが IPv6 で接続しようとするが、サーバやネットワークが IPv6 に対応していないとき、 IPv4 で再接続するまでに時間がかかる問題– IPv6 がタイムアウトするまで待機してしまう
• ブラウザが白いまましばらくロードされない
DNS回答による接続問題
• AAAA レコードがない場合に、 NXDOMAIN を返してしまう DNS 実装の時に発生– IPv6 でも IPv4 でも接続できないケースも– DNS サーバだけでなく、ロードバランサやキャッ
シュサーバが返してしまうことも• IPv4 専用 / IPv6 専用に FQDN を別途用意すること
も– v6.vsug.jp– v4.vsug.jp
エセ IPv6 対応ルータ
• 市販の IPv6 対応とうたうルータでは、 IPv6 のルーティングではなく “ブリッジ” に対応しているだけのケースがある– ネットワーク上を流れるパケットが思わぬ範囲まで流れてしまう危険性
– トンネル接続の IPv6 サービスなどでは利用できない
不適切な ICMPv6 フィルタ
• IPv4 では ICMP をフィルタしても問題はなかった– IPv6 では ICMP による Path MTU Discovery を
行っており、 Too-Big-Message がフィルタされると IPv6 通信ができなくなることがある
– IPv6 では ICMP のフィルタはより慎重に、通すべきパケットは必ず通す必要がある
不正な RA による Route 汚染
• RA (Router Advertisement) による Prefix および Default Route 配布が、不正な機器からの RA が流れることでハイジャックされてる危険– スイッチ等で RA をフィルタするなどの考慮が必要
非対称フィルタによるアクセス範囲拡大
• IPv4 と IPv6 で、ルータ等に設定されたアクセスフィルタに違いがあると、本来アクセスできないはずのエンドポイントにアクセスできるようになってしまう危険性– 早期に IPv4 と IPv6 でのネットワーク設計を進め
る
ネットワーク帯域の非対称性
• IPv6 では、 IPv4 とは違う経路を使う可能性がある– トンネル接続で IPv6 を使っているなど
• 帯域の非対称性により、 IPv6 で接続した場合にアプリケーションに必要な帯域が確保されないなどがありうる– 名前解決に加え、 IPv4 / IPv6 どちらのアドレスを優先するかなどを設定できる機能が役に立つ
まとめ
IPv6 なう
• IPv6 はインターネットで大規模展開され始めた• .NET Framework を使えば、すぐに IPv6 通信は可能• ネットワーク環境を並行して準備する必要はある
– データセンタはすぐに対策を
Be Action!
Questions?