2010年6月23日

IPv6

Yahoo! JAPAN IPv6への挑戦 ~Traffic ServerのIPv6化とMy Yahoo!への応用~

  • このエントリーをはてなブックマークに追加
IPv6 logo

こんにちは、IPv6プロジェクトスタッフのダルビッシュこと江川卓秀です。 Yahoo! JAPANでのIPv6に関する取り組み紹介の3回目は、My Yahoo!という具体事例を通じて、どのように IPv6 配信を行ったか紹介させていただきます。

Yahoo! JAPANのサービスのIPv6対応について

第1回ではビーコンによるIPv6配信での影響調査、第2回ではネットワーク周りの調査を行いました。これまでの結果を踏まえてYahoo! JAPANのサービスのIPv6配信を検討・実施してきます。 Yahoo! JAPANの数あるサービスの中で、一定以上のアクセス数があり、なるべく地域・回線の偏りが少ないと思われるMy Yahoo!がIPv6配信の第一号として白羽の矢が立ちました。

今回のIPv6配信にあたっては次のことを大前提としています。

  • My Yahoo!を利用されているお客様にご迷惑をおかけしないこと

それを実現するために、 「お客様がIPv4とIPv6の違いを意識せず、同等のサービスを受けられること 」 を目標にプロジェクトを進めてきました。 また、「今後のIPv6配信の展開を見越して、My Yahoo!の修正等々のインパクトを少なくすること」 も目標として掲げておきます。

My Yahoo!で、IPv6対応する問題点って何?

My Yahoo!をIPv6配信するに当たって、次の問題が予想されました。

1. ネットワーク周りを含んだhttpdサーバのIPv6環境
2. アプリケーションでの src ip を用いた処理
      サービスを実現するアプリケーションにおいて、IP Address の構造に依存している実装が存在している。
      2-a.  広告掲載数の集計
            Yahoo! JAPAN では社内ネットワークからのアクセスをページビューにカウントしていません。
      2-b. その他IPアドレスによるアクセス制限など

問題点のおさらい

「ネットワーク周りを含んだhttpdサーバのIPv6環境」とアプリケーションの実装

httpd は apache 2系で対応済みであることを社内IPv6環境で確認。ネットワーク環境の構築も目処はつきました。けど、いきなりIPv6配信をするにはコストも手間も大きいのが正直なところ。

広告掲載数の集計

Yahoo! JAPAN のアクセス数集計・広告掲載数の集計のポリシーとして社内からのアクセスを除外しています。この社内・外の判定としてウェブビーコンサーバへのアクセスのあったIPアドレスを使用しています。この社内外判定ではIPアドレスがIPv4の構造であることを前提としていたため、IPv6対応させなければなりません。

その他IPアドレスによるアクセス制限など

基本的には 2-a. と同じです。大きく分けると2つのパターンに分けられます。一つはユニークIPアドレスで処理をする場合、他方は社内外が判別できればよい(IPアドレスを知らなくてもよい)。前者の場合はIPv6の構造体に対応する必要がありますが、後者の場合は下のレイヤで吸収してやればアプリケーションの修正は大きくありません。

問題点に対する対策

対策の基本方針

Yahoo! JAPANのサービスを実現するアプリケーションにおいて、IP Address の構造に依存している実装が存在し、インパクトが広く個別の対応が難しい。このため、下位レイヤの Proxy で吸収し、既存実装に可能な限りインパクトを与えないアプローチを取ることにした。これによりIPv4のネットワーク資産がほぼそのまま使えるので、IPv6導入のコストを大きく下げられる。

アプリケーション等の対策

広告掲載数の集計

Yahoo! JAPAN ではアクセス数の集計にウェブビーコンを使用しています。ウェブビーコンへのアクセスを IPv4 に留めることでこれまでの集計の仕組みをそのまま使えるようにしました。したがって、社内外のアクセス判別も従来と同じに判定可能となります

その他IPアドレスによるアクセス制限など

Proxy サーバ導入により、この問題がより顕著になりました。それは「サービス側のサーバ(以下オリジンサーバ)から、User-Agent のIPがわからない」ということです。 これを解決するため、次の機能を用意しました。

  • Proxy サーバ側
    • src ip, src port を転送する拡張HTTPヘッダの追加
  • オリジンサーバ側
    • 拡張HTTPヘッダを評価するモジュール
      • 正当性の評価
      • src IPv6アドレスを内部データに格納
      • src IPv6アドレスの社内外を判定した上で、IPv4の特定のレンジにマップし内部データに格納
        ※ IPv4でアクセスしてきたお客様のIPアドレスとは被らない
    • IPv6アドレスを内部データから取得するライブラリ
  • 共通
    IPv6アドレスの社内外を判定するライブラリとデータ

Proxy サーバ導入による問題点

Proxyサーバの導入に当たってはパフォーマンスが心配されました。Yahoo! JAPANの1日の平均アクセス数は平均15億ページビューに達します(2010年5月月次報告)。IPv6利用者が増え、このうち数%の処理が必要となったとしても数千万ページビューを軽く処理しなければなりません。またYahoo! JAPAN にはニュース等の影響で突発的に数倍のリクエストが発生するという特性があります。そのようなときに IPv6 で接続してきたお客様のみサービスを受けられないというのは許されません。そこで目をつけたのがTraffic Serverでした。Traffic Server については次章で説明します。

My Yahoo!のIPv6配信イメージ

Traffic Server の IPv6 実装

Traffic Server とは

Traffic Serverは、もともとYahoo! Incが買収したInktomiの技術をベースに開発を続けている非常にスケーラブルなCache Proxyサーバです。2009年11月にYahoo! Inc がApache Software Foundationへ寄贈し、Apache Traffic ServerTM という名のオープンソースプロジェクトで公開されています。
Yahoo! JAPAN ではこの IPv6 から IPv4 への Proxy サーバとして Traffic Server を採用し、IPv6 配信のための開発を行いました。
オープンソース公開前後に Traffic Server の IPv6 対応を行った関係でServer: ヘッダー等で若干の不一致がありますが、パッチ自体は当たるはずですので、ぜひお試しいただきレポートいただければと思います。

Traffic Server の IPv6 対応について

今回は My Yahoo! の IPv6 配信に必要な機能のみを実装しました。

  • Traffic Server のバージョン: release_1_17_23
  • Listen: IPv4, IPv6 両方で同時に Listen 可能
    Listen は IPv4, IPv6 独立して設定可能。HTTP 設定は共通。
  • Back Post: IPv4 のみ
    今回の My Yahoo! の IPv6 対応では、IPv6 で back post する必要がないため
  • HTTP Header
    • HTTP Request Header/Proxy -> Origin
      基本的に User-Agent から受け取った HTTP Request をそのまま back post する。
      HTTP Header 説明
      X-Forwarded-For: Traffic Server から見た User-Agent の IP(IPv6) を追加
      Via: HTTP/1.1 <proxy_name>[C0A8530D] (YahooTrafficServer/1.17.23_01 [uScM])
      ヤフー独自の拡張ヘッダー: ヤフーからみた src ip を追加
      その他のヘッダー 変更しない
    • HTTP Response Header/Proxy -> User-Agent
      基本的にオリジンサーバから受け取った HTTP Response をそのまま back post する。
      HTTP Header 説明
      Server: YTS/1.17.23_01
      Via: HTTP/1.1 <proxy_name> (YahooTrafficServer/1.17.23_01 [cMsSf])
  • Traffic Server ソースコード
    trafficserver.apache.org
  • IPv6 対応パッチ
    https://issues.apache.org/jira/browse/TS-18

IPv6 配信で使用する Configuration

Traffic Server の基本的な設定方法は traffic server Administrator's Guide の Configuring Traffic Server をご覧ください。以下 IPv6 用に拡張した設定について説明いたします。

Configuration Variable Data Type Default Value 説明
proxy.config.http.server_port_attr
STRING
X 2文字目を拡張。2文字目に 6 を設定することで AF_INET6 ソケットを IPV6_V6ONLY でbind する
proxy.config.http.server_other_ports
STRING
NULL 追加ポートの設定. ":" 以降でこのポートの attribute を設定できる
例えば 8080:X であれば AF_INET ソケットを 8080ポートへ bind し、 を 80:X6 であれば AF_INET6 ソケットを IPV6_V6ONLY で80ポートに bind する

My Yahoo! への導入

サービスの選定

できるだけ多くのユニークユーザ、ユニークブラウザにアクセスしていただきたい、という理由でポータルでもある My Yahoo! を選びました。Yahoo!ラボはその前の公式実験として使用しました。

導入の流れ

1. Traffic Server の構築
2. オリジンサーバの apache と拡張モジュールのバージョン統一
3. 社内テスト環境での配信
      3-1. My Yahoo! のサービス機能を提供できているか確認
      3-2. 広告掲載、集計確認
4. DNS 設定

Traffic Server の設定

My Yahoo! での事例

  • records.config
    CONFIG proxy.config.http.server_port INT 80
    CONFIG proxy.config.http.server_port_attr STRING X
    CONFIG proxy.config.http.server_other_ports STRING 80:X6
  • remap.config
    # My Yahoo!
    map     https://my.yahoo.co.jp/                   https://my.yahoo.co.jp/
    map     http://v6.my.yahoo.co.jp/               https://my.yahoo.co.jp/
    map     http://v46.my.yahoo.co.jp/             https://my.yahoo.co.jp/

    # Yahoo! Labs
    map     http://labs.yahoo.co.jp/                 http://labs.yahoo.co.jp/
    map     http://search.yahoo-labs.jp/          http://search.yahoo-labs.jp/
    map     http://visseeker.yahoo-labs.jp/       http://visseeker.yahoo-labs.jp/
    map     http://visseeker2.yahoo-labs.jp/     http://visseeker2.yahoo-labs.jp/

DNS 設定

Traffic Server の IPv6 アドレスを AAAA に設定。現在は my.yahoo.co.jp で IPv6 配信を行っていないので、v46.my.yahoo.co.jp の設定を載せておきます。

;; ANSWER SECTION:
v46.my.yahoo.co.jp.     15M IN A           114.111.79.232
v46.my.yahoo.co.jp.     15M IN A           114.111.115.234
v46.my.yahoo.co.jp.     15M IN A           114.111.115.235
v46.my.yahoo.co.jp.     15M IN A           124.83.171.174
v46.my.yahoo.co.jp.     15M IN A           124.83.171.241
v46.my.yahoo.co.jp.     15M IN A           124.83.175.156
v46.my.yahoo.co.jp.     15M IN A           124.83.175.161
v46.my.yahoo.co.jp.     15M IN A           124.83.175.197
v46.my.yahoo.co.jp.     15M IN A           124.83.175.198
v46.my.yahoo.co.jp.     15M IN AAAA     2400:7e00:1:1607:1181:5100:25:4057

まとめ

Traffic Server を Proxy サーバとして導入した結果、My Yahoo! 側の作業がほとんど必要なくIPv6配信を導入できました。機能的にも、パフォーマンス的にも問題なくサービス提供できています。既存のIPv4環境を残したまま IPv6 配信を試したいという方には Traffic Server はうってつけです。My Yahoo! でのIPv6配信は停止しましたが、同じ環境を v46.my.yahoo.co.jpとして残しましたので、Traffic Server を用いて IPv6 配信を試そうという方はご確認ください。

Yahoo!ツールバーでIPv6接続確認

また、この記事の公開にあわせてYahoo!ツールバーにIPv6ボタンを追加いたしました。このボタンを追加することでお客様の環境からYahoo! JAPANのIPv6環境へ接続できるか確認できるようになります。Yahoo!ツールバーのギャラリーよりダウンロード可能ですので、ぜひお試しください。

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加