ローカルの環境にIPv6を導入する2013年08月21日 07:02

ネットワーク技術者の登竜門は、CiscoのCCNA試験である。しばらくの間、有効期限切れであったのを、2月に更新したのだが、受験勉強をしていてIPv6の扱いが増えていることが気になった。IPv6は、1990年代から耳にはしていたが、仕様は固まっても普及せず、が長らく続く。2011年4月にIPv4の国内の在庫切れが管理団体から広報され( https://www.nic.ad.jp/ja/ip/ipv4pool/ )、これでIPv6への流れが加速するかと思いきや、身の回りはそうでもない。

とはいえ、いつまでも知らぬ存ぜぬとはいっていられないので、自宅のローカルの環境に導入を試みる。インターネット接続も、といいたいが、asahi-netの対応がまだなので、ここは保留。2010年に頑張る宣言をしているが、しばらく音沙汰がない。http://asahi-net.jp/support/news/101210.html
調べてみると、自宅のフレッツ光はBフレッツなので、IPv6対応するには、フレッツ光NEXTにする必要があり、工事費がかかるという。https://flets.com/next/fm/const_fee.html
そんな中、NTTから、移行のプレスリリースがでた。少し時間はかかるが、NTTの方で工事を進めてくれるようだ。この工事が終わるころには、asahi-netでも対応してくれるだろうか。
http://www.ntt-east.co.jp/release/detail/20130725_01.html

まず、構想を練る。巷に、IPv6導入記はいくつもあり、Ciscoの文書も出ている。まずは、それらに目を通す。およその技術要素と何ができるかを把握する。このときに問題となるのは、何を選択し、どう組み合わせるのが、自身の目的に合致するかを判断すること。このための判断基準や判断過程の情報は不足している。この点が、巷で導入が進まない理由の一つ。ネットワークベンダやITサービス事業者には、導入側の視点でじっくりシナリオを練り、積極的に開示してもらいたいもの。営業がよく口にする、「各社事情は異なるので、一緒に考えましょう」、は、行き当たりばったりになりやすい。勢い、重要な判断を素人の導入側が迫られ、中途半端な結果を招きやすい。ベンダ側は責任を回避しやすいのだろうが、導入側は次の新技術の導入がますます慎重になる。これが悪い循環を生み、、、。愚痴はこのくらいで。

こんな感じで進める。

・Router(Cisco)にRA(Router Advertisement)の役割を担ってもらう。Linuxサーバにradvdを設定する方法もあるが、将来、インターネットにつないだとき、上位とスムーズに連携させるには、ネットワーク機器にやらせた方がよさそう。
・IPv6アドレスの割り当ては、DHCPv6に担ってもらう。IPv6アドレスは、覚えるには長すぎて、DNSとの連携が不可避。DDNSは、手元のCiscoのRouterではできないので、IPv4のときと同じく、LinuxサーバのDNSとDHCPに連携してもらう。

この先、長くなるので、手順を示す。無事に完了すれば、IPv4で実施したローカルのDNSとDHCPの環境がIPV6でも実現する。

1)ULAのグローバルIDを決める
2)RouterとSwitchの設定
3)DNSの設定
4)DHCPの設定

今回参考にした文献を挙げる。製品や技術の変化が激しいので執筆時期には注意して適用を考える。

@ITの記事:他にもいろいろ参考となる文書がある。
http://www.atmarkit.co.jp/ait/articles/1306/21/news008.html
IPv6勉強会:勉強会の資料が参考になる。過去の資料は、facebookのページの方。
http://www.vwnet.jp/IPv6SG/
CiscoのIPv6への移行の総合サイト:Cisco技術者にはいつもの調子で取っつきやすい?
Blueprintsのシナリオはよくできているし、IOSのコマンドも正確
http://www.cisco.com/web/strategy/education/us_education/transition_to_IPv6_for_education.html

つづく。

ULAのグローバルIDを決める2013年08月21日 08:28

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によるツール:http://www.02.246.ne.jp/~torutk/ipv6/uniquelocal.html
RFC4193の参考訳がある。
CGIによるツール:http://www.kame.net/~suz/gen-ula.html
@ITの記事(http://www.atmarkit.co.jp/ait/articles/1306/21/news008.html)ではこちらを使う。

使うのは、機器の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は完成。

実行してみる。

ULAのGlobal IDの生成
NTPが返したTransmit Timestampの値を年に換算すると、43~44年。2013年から減ずると1970年。RFC1305の記述と異なり、1970年からの累積秒数になっているようだ。perlのtime関数の仕様に合わせているか。Reference Timestampを換算すると、約-70年。2つを合わせると目的の数値が得られる。
http://www.ietf.org/rfc/rfc1305.txt ;Data Formatsの段落

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

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

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

最後は、適当に書いたプログラム。
ULAのGlobal IDを作成するプログラム例

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

ローカルIPv6のためのルータとスイッチの設定2013年08月21日 11:50

ローカル環境にIPv6を導入するためのネットワーク機器の設定を行う。まず、CiscoのRouterから。@ITやCiscoの文書から、およその手順はわかるが、差異もあるので、いったん項目を書き下し、整理する。

1)global-prefixの登録; どこでも使えるわけではないが、登録しておくと、長いアドレスを書くのが少し楽になる。
2)unicast-routingの有効化
3)loopback インタフェースの設定
4)VLANインタフェースの設定
5)管理用のACLの作成とloopbackへの適用
6)PACL(Port based ACL)の作成とインターネットの出口への適用

だいたいこんなところ。

ipv6 general-prefix
general-prefixは、前回作成したIPv6アドレスのネットワークアドレスの部分に別名をつけるもの。このあとの作業で別名が使えるので少し楽。残念ながら、全ての局面で使えるわけでない。
ipv6 unicast-routingでIPv6のパケットがルーティングされるようになる。cefはCiscoの手順に従い、有効にする。

int loopback
loopbackは管理用の位置づけ。OSPFの実験用の設定は無視。Ciscoの手順書で要求しているのは、下の2つの設定。IPv6アドレスの設定では、先のglobal-prefixを活用。管理用に使うので、容易に推察されないアドレスにせよ、とのこと。/128はCiscoの推奨。
ipv6 redirectsは、ICMPv6メッセージの送信を制御するが、loopbackなので抑止。
FE80::11のlink-localの設定は、結局使っていない。
なお、このあとも出てくる、IPv4関連の設定は、今回の作業には関係ない。

ipv6 access-list
loopbackに管理目的で入ってくるためのACL。Ciscoの手順書のまま。ローカルのネットワークから、loopbackへのログインのみを認める。残念だが、ここでは、global-prefixは使えない。

line vty
TELNETとSSHセッションに適用。別のネットワークからは、SSHもTELNETもできなくなる。

int vlan
LANの各ポートを収容しているVLANの設定。ここでも、global-prefixを利用して、アドレスを設定。IPv4のアドレスとそれとなく対応をとる。この辺りは、いくつかある流儀のうちの一つ。
※VLANを使っていない場合は、通常のIFへの設定になるはず。

ipv6 enable でこのVLANでIPv6が有効になる。

ipv6 nd managed-config-flag / other-config-flag は、RAとDHCPの関係を制御する。前者はMフラグ、後者はOフラグをONにする。フラグの働きについては、IPv6勉強会の資料がわかりやすい。この設定は、アドレスも、DNS等の情報も、いずれもDHCPにゆだねることを指示。RAは、寡黙になる。

PACL
インターネットへの出口に適用するPort based ACL。DHCPリクエストの抑止、クライアントからのRAの抑止。ここも、Ciscoの手順書のまま。IPv6のインターネット接続はしていないので、将来への備え。

sh ipv6 int brief
ひととおり、Routerの設定は終了。sh ipv6 int brief で状況を確認。設定したloopbackとvlanのインタフェースに所定のIPv6アドレスが付与された。vlanには、自動で生成されたlink-localのアドレスが付いている。

次は、ルータにぶら下がっているスイッチ。ここで誤算発生。Ciscoの手順書によると、スイッチには、SDM(Switch Database Management)のテンプレートがあり、標準のものから、IPv6とIPv4を併用するためのものに切り替える。まず、現在の状態を確認する。

show sdm prefer
desktop defaultである。切替には、sdm prefer dual-ipv4-and-ipv6 default を用いるが、コマンドを認識しない。手元のSwitchは型が古く非対応と判明。調べるとお手頃なところでは、Catalyst2960が必要(IOSは LAN BASE)。残念。

ping ipv6
気を取り直して、Switchに接続したPCからRouterにpingを実行すると、返事が来る。IPv6が使えないわけではないらしい。本格的に使うには役不足ということか。

仕方ない。ここはよしとして先に進む。次は、再びのDNS。

ローカルIPv6のためのDNSサーバの設定2013年08月21日 17:18

DNSサーバの前に、DNSが稼働するサーバ自身のIPv6対応を行う。

yast Network Settings IPv6
yastのNetwork Settings。中程のEnable IPv6にチェックを入れる。初めての場合は、カーネルの再起動が必要。

yast Default IPv6 Gateway
右端のタブに移って、IPv6用のDefault Gatewayを設定。前回設定したRouterのVLANのアドレスを設定。ULAの方を設定したが、Link Localの方が良いのかも。IPv6勉強会の資料では、ミスを防ぐため、FE80::1がよいとも。ここは、そのまま進む。


ifconfig
ifconfig -a を実行して、状況を確認する。eth0、loopbackインタフェースとも、IPv6を有効にしたので、自動でアドレスが割り当てられている。

DNS Basic Options
yastでDNS Serverの構成を選択。Basic Optionsを設定。ここでは、listen-on-v6をanyに設定。選択肢は、anyかnoneとある。巷の設定例では、ネットワークを設定するものもあり、やや情報は錯綜。もうひとつ、allow-queryにIPv6形式でローカルのネットワークを登録。

正引きのZone設定
正引きのZone設定。IPv4で作成したものと同じもの。ここに、Routerとサーバ自身のIPv6アドレスを登録。TypeはAAAAとする。サーバには、eui-64形式のアドレスを登録。もう少しわかりやすい方が良かったか。単純でない方が、攻撃に強いともあり、悩む。

逆引きのZone作成
逆引きは新たにZoneを作る。問題なのは、その名称。ネットワーク部分のアドレスを一文字ずつにばらして、逆に並び替え、最後にip6.arpaを付ける。誰もが言うが、これはわかりにくい、読みにくい。

Rev Zone Basics
編集を選び、Basicsのタブを設定。DHCPと連携させるので、TSIG Keyを設定。正引きと連動させるので、一番下のチェックを入れる。

Rev Zone NS Records
もう一カ所、NS Recordsのタブも設定が必要。Name Serverを名前で登録する。
設定はここまで。yastを終了すると、DNSが再起動して、新しい設定が有効になる。

nslookup
nslookupやdigで登録した設定が引けることを確認する。Windows8での実施例。IPv6とIPv4の両方のアドレスが返される。ここまで、IPv6と言っても特別なことはない。逆引きのZone名がややこしいくらい。

最後は、難関のDHCP6。

ローカルIPv6のためのDHCPv6の設定2013年08月21日 18:20

最後は難関。yastは対応していないので、手作業で頑張る。

Runlevel
yastのSystem Services(Runlevel)を起動する。dhcpdとdhcpd6は別々のエントリ。バイナリは同じでも、プログラムは別々に動くのか。dhcpd6の構成ファイルは、/etc/dhcpd6.conf 。

dhcpd.conf header
ヘッダに、/etc/sysconfig/dhcpdにLANインタフェースを追加せよ、とある。先にこちらを確認。

sysconfig dhcpd
DHCPDのインタフェース定義に続き、DHCPD6のインタフェース定義がある。空欄に"eth0"を設定。

dhcpd6.conf
試行錯誤したあとの、dhcpd6.conf。IPv4用のdhcpd.confと見比べ、いくつか例を見て回り、設定する。

参考にしたサイト:差異があるので、必須項目はTry & Error
http://davenjudy.org/davesBlog/node/80
http://sophiedogg.com/radvd-and-dhcpd6-server-configuration-for-dynamic-dns/
http://www.mmacleod.ca/blog/2011/08/ipv6-part-8-configuring-dns-and-dhcpv6-on-an-ipv6-network/

試行錯誤の結果、余計な設定が増えたが本質的なところは多くないはず。

ddns-update-style interim;
ddns-updates on;
この設定により、DHCPDからDNSへの動的更新が動く。

leasetime, lifetimeの値は、dhcpd6.confの注釈に従う。
name-servers,domain-searchの値は、IPv6専用の設定がある。

include "/etc/named.d/athome.key"
DNSと連携するためのkeyの在処を指定する。ここが一番重要。SuSEのdhcpdはchrootで起動するため、chroot後の/etc/named.dにファイルをコピーする。IPv4は、yastがやってくれていたらしい。
当方の環境では: /var/lib/dhcp6/etc/named.d
正引きのzoneの設定は、dhcpd.confと同じ。逆引きは、また長いzone名称を記述して設定。primaryでDNSサーバを指定するが、FQDNか、IPv4アドレスでないとうまくいかない。IPv6アドレスはエラーになった。

最後に、アドレスを払い出すrangeの設定。IPv6は広大なアドレス空間で悩む。今回は、末尾のアドレスがdd00~ddffを設定。16進だとa~fまでのアルファベットが使えるので、英字の意味を使う例が多い。ここは、dynamicのdとしておく。

dhcpd restart
ファイルを保存したら、/var/log/messages をtail -f で眺めつつ、yastのSystem Servicesから、dhcpd6を有効化すると、サービスが起動。

windows8 ipv6 ddns
Windows8 PCの起動を掛けると、IPv4とIPv6の双方のアドレスが払い出される。何度もやっているので余計なメッセージも出るが。

IPv6 Zone Records
正引きのZoneのレコードを見ると、起動したWindows8(ariel8)のアドレスが登録されている。

IPv6 Rev Zone Records
逆引きのZoneのレコードにも登録されているが、ずいぶんと長いレコード。

IPv6 ddns nslookup
別のPCから、nslookupで確認する。正引きも逆引きも引けている。

構成変更後、キャッシュが残るようで、慌てず確認作業を進める必要がある。途中、dhcpdumpのお世話にもなった。初めてで勘所がつかめず難儀したが、まあ、一段落。最後に、一連の作業の総括をしたい。

ローカルの環境にIPv6を導入して~総括2013年08月21日 22:04


ipconfig ipv6
作業を終え、Windows8でipconfigを実行する。IPv6のアドレスが、4つ。将来、インターネットに接続するようになれば、もうひとつ増える。一つのアドレスをいろいろ変換してやりくりしているのとは、切替が要る。

ローカル環境にIPv6を入れて、何ができるか。teratermは、IPv6でつなぐことができる。X端末エミュレータ(Astec-X)は、IPv6でつなぎにいく。NAS(QNAP)も無事認識した。DHCPにアドレスを取りに行かず、eui-64から自動生成したので、DDNSに登録されず、名前解決しない。手でDNSに登録することになる。プリンタは対応していない。

何か、不都合は出ているか。思いの外、普通に使えている。Windowsが優先するインタフェースでいろいろつながらないと心配したが杞憂だった。一つ、X端末エミュレータは、IPv6のネットワークを優先して認識したので、設定を一部変更した。これから使うアプリケーションにも何かあるかもしれない。インターネットにIPv6につなぐまでは、判断は保留しておく。

組織への導入はどうか。
・概念が新しくなるので、一人だけわかっていても心許ない。チーム内のレベルアップが必要。
・古い機材が現役のときのリプレースも懸念。ネットワーク機器は、長持ちする。
・OSやツールなど対応が途上のものもある。どう乗り切るか。
・一つのPCがたくさんのアドレスを持つのはどうか。接続できないトラブルの解決が難しくならないか。
・プロバイダへの接続方式に2つあるのは悩ましい(IPoE, PPPoE)。
・セキュリティはどうか。内部のアドレスが隠れないのに抵抗はないか。固有の注意点もいくつかある。
最大の問題は、意思決定か。導入しない理由づけの方が簡単そうだ。

新しい技術を、まず、触れてみる、というのはいい学びになる。これだけのことだが、各社の技術文書、ネットワークの標準化文書、先駆者の格闘記、ずいぶん目を通すことになった。技術だけでなく、ビジネスの駆け引きなども面白い。