Internet Week 2013 T2 アプリケーション サービスのIPv6 対 応 軽 量 プログラミング 言 語 のIPv6 対 応 Perl 編 2013 年 11 月 26 日 技 術 本 部 技 術 開 発 部 渡 辺 露 文
1. Perlの 概 要 - 1 -
1.1. Perlの 概 要 Perl のバージョン 最 新 版 (Perl5): 5.18.1 (2013/8/12リリース) Perl とネットワークプログラミング 標 準 ライブラリ (コアモジュール) で 基 本 的 なネットワークプログラ ミングが 可 能 (ソケット, HTTP クライアント, SMTP クライアント) その 他 の 機 能 が 欲 しい 場 合 は, CPAN*1 のモジュール 等 を 使 用 する *1 Comprehensive Perl Archive Network http://www.cpan.org/ Perl と IPv6 Perl 5.14 から 本 格 的 に IPv6 をサポート Perl and IPv6 Perl supports IPv6 http://www.perl.org/about/whitepapers/perl-ipv6.html それより 前 のバージョンでも, CPAN モジュールを 利 用 すれば IPv6 を 使 うことは 可 能 - 2 -
1.2. 各 OSでのPerlバージョン OS ディストリ ビューション バージョ ン Perl IPv6 対 応 状 況 Perlバージョン Linux CentOS 5.10 distribution, updatesとも5.8.8 6.4 distribution, updatesとも5.10.1 Fedora 18 distribution:5.16.2, updates:5.16.3 19 distribution, updatesとも5.16.3 Debian 6.0.8 5.10.1 7.2 5.14.2 Ubuntu 12.04 LTS distribution, updatesとも5.14.2 13.10 5.14.2 FreeBSD 9.2 5.18.1 Mac OS X 10.9 5.16.2 主 要 OS LinuxディストリビューションのパッケージでインストールされるPerlの バージョンから 対 応 状 況 を 判 定 (2013/11/11 現 在 ) - 3 -
2. PerlのIPv6 対 応 - 4 -
2.1. PerlのIPv6 対 応 状 況 概 略 考 慮 すべき 要 素 対 応 状 況 備 考 名 前 解 決 Socket::getaddrinfo() Socket::getnameinfo() CPAN Net::DNS ソケット コアモジュールの Socketは 5.10 か ら 部 分 的 に 対 応 5.14でフル 対 応 CPANモジュールにも 対 応 しているも のがある 各 種 (L7) プロトコル その 他 HTTP 標 準 では 非 対 応 (コアモジュール クライアント HTTP::Tiny, LWP 等 のメジャーなモ ジュールも 非 対 応 ) SMTP 標 準 では 非 対 応 (コアモジュール クライアント Net::SMTP) IPv6アドレス CPANモジュール Net::IPにより 対 応 の 処 理 - 5 -
2.2. 名 前 解 決 Net::DNS DNS リゾルバ (CPAN モジュール) http://search.cpan.org/dist/net-dns/ IPv6 関 連 RR の 検 索 に 対 応 IPv6 関 連 の RR (AAAA, IPv6 アドレスの PTR) は 問 題 なく 引 ける AAAA を 引 いた 結 果 の 文 字 列 表 現 は :: による 省 略 がされない (Net::DNS::RR の print() 等 ) IP アドレスはそのままの 形 式 で 逆 引 きできる (in-addr.arpa. / ip6.arpa. 形 式 にする 必 要 がない) IPv6 アドレスを 逆 引 きするときは :: で 省 略 したアドレスを 渡 すことも 可 能 - 6 -
2.3. ソケット(1) TMTOWTDI のフレーズ 通 り, ソケットに 関 しても 色 々 なモジュールが 存 在 し, 他 の 言 語 に 比 べて 複 雑 な 状 況 TMTOWTDI; There s more than one way to do it : 同 じことをするのに 何 通 りものやり 方 があるという Perl のモットー IPv6 非 対 応 IPv6 対 応 CPANモジュール IO::Socket::IP IO::Socket::INET6 Socket6 コアモジュール IO::Socket::INET Socket バージョンにより 対 応 状 況 が 異 なる - 7 -
2.3. ソケット(2) Socket IO::Socket::INET IO::Socket::IP コア/CPAN コアモジュール コアモジュール CPANモジュール IPv6 対 応 備 考 (Perl 5.14 付 属 の Socket 1.94 以 降 ) IPv6 関 連 のものは ほとんどが 明 示 的 にインポートする 必 要 あり 多 くのネットワーク 系 モジュールが IO::Socket::INET を 使 用 しているが, それらのモジュール も 当 然 ながら IPv6 非 対 応 となっている ( 対 応 方 法 は 後 述 ) IO::Socket::INET の 置 き 換 えとして 設 計 されており コン ストラクタやメソッ ドは 互 換 性 がある ( 一 部 例 外 あり) IO::Socket::INET でやっていたことを やりたい 場 合 には このモジュールを 使 うのが 良 い - 8 -
2.3. ソケット(3) IO::Socket::INETとIO::Socket::IPの 比 較 IO::Socket::INET と IO::Socket::IP による TCP クライアントの 例 ($host の $port に TCP で 接 続 ) IO::Socket::INET use IO::Socket::INET; : my $sock = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Proto => 'tcp' ) or die Error: $! n ; : IO::Socket::IP use IO::Socket::IP; : my $sock = IO::Socket::IP->new( PeerAddr => $host, PeerPort => $port, Proto => 'tcp' ) or die Error: $! n ; : 赤 字 の 部 分 (use およびコンストラクタ) を 変 更 するだけで IPv4 専 用 だったコードが IPv4 / IPv6 両 対 応 になる (はず) ( 変 更 後 のプロトコルの 優 先 順 位 はポリシーテーブルの 設 定 に 従 う) もちろん, IPv4 アドレスが 直 書 きしてあるような 部 分 については, 別 途 対 応 する 必 要 あり - 9 -
2.4. サービス(HTTP, SMTP) HTTPクライアントのメジャーどころ:IPv6 非 対 応 HTTP::Tiny HTTP::Lite [CPAN] LWP::UserAgent [CPAN] IO::Socket::INETを 使 用 しているため socket()にpf_inetを 渡 しているため 内 部 で 使 用 している Net::HTTP が IO::Socket::INET のサブクラスのため SMTPクライアント(Net::SMTP):IPv6 非 対 応 IO::Socket::INETのサブクラスのため IO::Socket::INETに 由 来 するものが 多 い - 10 -
2.5. アドレス 処 理 Net::IP IPv4 / IPv6 アドレス 処 理 のための 様 々な 機 能 を 提 供 する CPANモジュール http://search.cpan.org/dist/net-ip/ 次 のようなメソッドを 提 供 する version() :IP のバージョンを 返 す (4 or 6) ip() :IPv6 アドレスの 場 合, 最 も 冗 長 な 表 現 を 返 す short() :できるだけ 省 略 された 表 記 を 返 す reverse_ip() : 逆 引 き 用 の 表 記 (PTR レコードの 形 式 ) を 返 す - 11 -
2.6. Net::INET6GlueによるIPv6 対 応 (1) IO::Socket::INETを 使 用 するモジュールは 標 準 ではIPv6 非 対 応 IO::Socket::INETはIPv6 非 対 応 ( 先 述 ) IO::Socket::INETを 直 接 使 用 するコードは IO::Socket::IPを 使 用 することで 対 応 可 能 既 存 のコード 依 存 CPANモジュール 等 依 存 IO::Socket::INET IPv6 非 対 応 IO::Socket::INETを 使 用 するモジュールをIPv6に 対 応 させる には Net::INET6Glueを 使 用 する IO::Socket::INETを 使 用 するモジュールをIPv6に 対 応 させる には Net::INET6Glueを 使 用 する Net::INET6Glue IO::Socket::INET6 からシンボルテーブルを IO::Socket::INET にコピー することで, IO::Socket::INET を IO::Socket::INET6 のように 動 作 させ る CPAN モジュール 詳 細 は Net::INET6Glue::INET_is_INET6.pm を 参 照 http://search.cpan.org/dist/net-inet6glue/ LWP や Net::SMTP 等 の IO::Socket::INET 依 存 モジュールを 使 用 し たプログラムで, Net::INET6Glue により IPv6 での 通 信 ができるよう になったことが 確 認 されている - 12 -
2.6. Net::INET6GlueによるIPv6 対 応 (2) 使 い 方 : IO::Socket::INET に 依 存 した CPAN モジュール 等 を 使 用 している 既 存 のコードの 先 頭 で, use Net::INET6Glue; するだけ HTTP::Tiny (IO::Socket::INET 依 存 = IPv4 専 用 ) を 使 用 したコードを Net::INET6Glue によって IPv6 に 対 応 させる 例 use Net::INET6Glue; これを 追 加 するだけ use HTTP::Tiny; : 既 存 のコード my $http = HTTP::Tiny->new; my $response = $http->get($url); print $response->{content}; 注 意 点 Net::INET6Glue を 使 用 した 場 合 のプロトコルの 優 先 順 位 は システムのポリ シーテーブルの 設 定 に 従 う もちろん, IPv4 アドレスが 直 書 きしてあるような 部 分 については 別 途 対 応 す る 必 要 あり - 13 -
3. まとめ - 14 -
Perlまとめ Perl 本 体 (コアモジュール Socket) の IPv6 (フル) 対 応 は Perl 5.14 から IO::Socket::INET および IO::Socket::INET 依 存 モジ ュール/コードは IPv6 非 対 応 今 後 は IO::Socket::INET ではなく IO::Socket::IP を 使 うようにする IO::Socket::INET 依 存 のプログラムを 手 っ 取 り 早 く IPv6 に 対 応 させたい 場 合 は Net::INET6Glue が 便 利 - 15 -
参 考 文 献 Internet Week 2012 講 演 スクリプト 言 語 とIPv6-2012- / 関 根 佳 直 氏 https://www.nic.ad.jp/ja/materials/iw/2012/pro ceedings/t7/t7-sekine.pdf - 16 -