ULAのグローバルIDを決める
2013-08-21


IPv6にはいろいろなアドレスがある。インターネットに出て行くならば、GUA(Global Unicast Address)が必要。プロバイダに払い出してもらうものであり、ローカルで構築するときは使えない。IPv4のプライベートアドレスに相当するのが、ULA(Unique Local Address)。今回はこれを設定する。
IPv6で感じた一番の違和感がNATが無いこと。IPv4では、ローカルのネットワークは、プライベートアドレスを用い、外と出入りするときにNATでアドレス変換する。多くの場合、変換は、1:1ではなく、N:1だったり、N:Mだったり。その常識をいったん頭から追い出す。ULAを設定しても、将来、インターネットと出入りするときにGUAとアドレス変換するわけではない。ネットワークインターフェースが、ULAとGUAと複数のアドレスを同時に持つ。実際にやってみると、3つも4つも設定される。
閑話休題。ULAも外に出て行くわけではないが、できるだけ一意にすることが求められる。そのためのアドレス生成の手順がRFC4193に示されている。世の中にいくつかツールがあるが、勉強がてら作ってみる。

Javaによるツール:[URL]
RFC4193の参考訳がある。
CGIによるツール:[URL]
@ITの記事([URL])ではこちらを使う。

使うのは、機器のMACアドレスと、NTPから取得した時刻情報。perlを使う。モジュールを活用すれば、手順を並べるだけ。大きな数字を扱うのも得意。

1)NTPから時刻情報を取得。1900年からの累積の秒数を用いる。perlのtime関数では、1970年からの情報になるので、Net::NTPのget_ntp_responseを用いる。時刻情報の構造を読み取るのに、YAML::XSのDumpを用いる。
2)MACアドレスから、eui-64の値を求める。6バイトのMACアドレス(16進表記)の間に、0xfffeを埋め込む。
3)1900年からの累積秒数の16進表記の後ろに、eui-64をくっつける。
4)SHA-1のハッシュキーを求める。160bit(20バイト)の値。Digest::SHAのsha1_hexを用いる。
5)20バイトのキーの後ろ40bit(5バイト)をグローバルIDとして用いる。
6)接頭辞0xfd(8bit)、グローバルID(40bit)、Subnet(16bit)、インターフェースID(64bit)、の都合128bitで、ULAは完成。

実行してみる。

禺画像]
NTPが返したTransmit Timestampの値を年に換算すると、43〜44年。2013年から減ずると1970年。RFC1305の記述と異なり、1970年からの累積秒数になっているようだ。perlのtime関数の仕様に合わせているか。Reference Timestampを換算すると、約-70年。2つを合わせると目的の数値が得られる。
[URL] ;Data Formatsの段落

MACアドレスは、CiscoのRouterの値を用い、間に0xfffeを埋め込み、eui-64にする。

2つをくっつけると32バイト。ハッシュ値を求めると、40バイトになる。後ろ5バイトをとってきて、ULAの前半部分は完成。最終結果は、タイムスタンプを用いているので、毎回変わるが、途中経過は、巷のツールと似たような値を示す。大丈夫か。

次は、このアドレスを用いて、ネットワーク機器の設定に進む。
fde3:4c30:cae5::/48
しかし、この表記に慣れねばならぬ。

最後は、適当に書いたプログラム。
禺画像]

cygwinで動かす。久しぶりに見ると、64bit版が出ていたので、早速セットアップ。以前のFAQでは、作らない、と言っていたのに、これも時代の趨勢。代わりにActive Perlはアンインストール。両方あるといろいろ競合する。
[URL]
[システムまわり]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット