IPv4/IPv6プロトコルと、DNSの股裂き関係について 。
あるドメイン名を持つホストとの通信は、特定のIPv4/IPv6ルータを
使いたい、と思ったとき、「それはレイヤが違うので標準にない」
という状況がある。ほんとに、たいしたことではないのだが、
省庁の縦割り行政がどうの、というのと同じくらい縦割りの股裂き。
かろうじて、あるドメイン名を持つホストの名前解決については、
特定のDNSサーバに問い合わせる、という実装がDNSリゾルバと
フレッツ対応ルータなどにある。
しかし、あるホスト www.example.com についてのみ、デフォルト
ゲートウェイではなく、ある特定の
ルータ 1.1.1.1 を使おうとするとき、経路制御とドメイン名(ゾーン名)
による制御の連携がないため、簡単にできない。
そのため、ある特定の接続をMACレイヤで切断したり、遮断または
横取り・介入・インターセプトする、という野蛮なことをしなければ
ならない。なぜIPv4/IPv6には経路制御があるのか? それを
「マルチホーミング」などと特別扱いしなければならないほど
特別扱い、あるいは壁として扱っているところが、現在のIPを
利用したソフトウェアの「ガラパゴス」。
「ガラパゴスとは、何かの壁を作ってまわりを囲んでしまうこと」。
Google App EngineがGoogleのIPv6ホワイトリストになくても
IPv6を利用できるオプションをCNAMEで提供 。
独自止め引用のghs.google.comへのCNAMEを、ghs46.google.comにすれば、
端末のIPv4アドレスがGoogle over IPv6のホワイトリストになくても
AAAAレコードを応答するようになる。
IPv6で問い合わせると? google.comのaddtional sectionにAレコードしか
ないので、IPv6でのDNS名前解決手順は中段され、IPv4で名前解決を
継続しなければならない。gtld-servers.netではGoogle over IPv6ホワイト
リストは適用されていないと思われるが。
JPIXがISP向けにIPv6とIPv4アドレスの変換をする実験サービスを開始 。
セーブルネットワークスのトランスレータをJPIX側設備、ユーザ宅内に
ホームゲートウェイを置いて変換する、とのこと。
Google IPv6 Implementors Conferenceより 。
読もうと思って時間がとれなかった。たいへん充実した内容。
日本の動向もわかりやすい。コンテンツ事業者の対応方法も複数出ている。
そのわりに日本語のニュースが少ない気がする。
それにしてもGoogleが報告する不具合は深くてこわい。
ちゃんと原因を発見しているところがえらいのだが、
もっとライトに運用したい人にはIPv6はまだ熟成されていない、
という印象を強くする。
DNSルートサーバのiがIPv6対応になった 。IPv6対応していないのは、
aからmの14のルートサーバ名のうち、
b,c,d,e,gの5つだけとなった。互換性や移行のため、IPv6には対応しない
ネームサーバも残される、という話を聞いたこともあるが、
対応しないほうが問題になる事例のほうが多ければ、すべて
対応するのだろう。
Google社内のIPv6ネットワーク 。
- 社内の利用者は19,000人、36ヶ国の70ヶ所のオフィス。
- ホストから接続していたGREトンネルを、ルータ経由のデュアルスタック接続へ。
- その後WANとMPLS VPN上でデュアルスタック接続
- アドレス計画 - /64 を各VLANかPtP接続へ割当
- アドレス計画 - /56を各建物へ割当
- アドレス計画 - /48を各キャンパスかオフィスへ割当する
- アドレス計画 - /42を地域レジストラからGoogleに割当してもらう
- 経路制御 - HSRPv2 末端のホストから見て最初のルータの冗長化
- 経路制御 - OSPFv3 IGPとして
- 経路制御 - MP-BGP (Multi Protocol BGP) EGPとして
- 経路制御 - SLAAC
- 経路制御方針 - オフィス集約経路をプロバイダに広報する
- 経路制御方針 - トランジット事業者からのみ、デフォルト経路を受け入れる
課題 - IPv6対応機器は一部機種、一部機能のみ。通信事業者もIPv6対応は一部のみ。
Google IPv6導入者会議 議題 。
Facebook が IPv6を採用、実験中などの発表資料がある。
IPv4アドレスとIPv6アドレスをロードバランサで変換し、
サーバには一切変更を加えないアプローチと、
IPネットワークのLISPを使ってロケーションとIDの役割分担をさせる方法が紹介されている。
XTRのコマンドにipv6 lisp ... がある。
しかし、発表資料内にあるアドレスがにくい。
2610:d0:face::9
IPv6アドレスの16進数表記に"face"が使われている。そうだよなぁ。
face:b00cとかface:b009(日本語のみ)もあるが、あまり長いシャレはよくない。
www.v6.facebook.comは、
2620:0:1cfe:face:b00c::3だった。
Apple iOS (旧名称 iPhone OS) 4はWi-FiでIPv6をサポート 。
3G接続については対応しているのか、キャリアが対応していないだけか、
よくわからず。
サイバー攻撃ではネットワークへのIPv6トンネルが積極的に使用される
との指摘 。IPv6 over IPv4のことを言っているらしい。
「IPv6のトラバースは現在の機器では検知不能」とも指摘している。
確かに攻撃も時間がかかるだろうが、ランダムに広域のIPv6アドレスを
スキャンすると、範囲が広すぎて検出するのもむずかしくなる。
ロッキーマウンテンIPv6サミットという、ぱっと見たかんじ
のどかな名前の会議で、「IPv6のセキュリティポリシと
運用、ツールを今準備するように」、との指摘。
そのためにはAssure6という商品を買うように、とのこと。
NANOG 49 - 2日目のセッションにIPv6関連が複数あった 。1日目には「JUNOSe
プラットフォームでのIPv6アクセスサービス」など。
he.net の tunnel broker用の
起動時設定 。Fedora 12用。
- SITトンネルのデバイス名はhe-ipv6になる
- he.netの routed /64アドレスはeth0につける
$ cat /etc/sysconfig/network-scripts/ifcfg-he-ipv6
# Config Script for ifup-sit
### he.net tunnel broker
### http://tunnelbroker.net/
# Uses following information from /etc/sysconfig/network:
# IPV6_DEFAULTDEV=: controls default route (optional)
# IPV6_DEFAULTGW=<address>: controls default route (optional)
TYPE=sit
DEVICE=he-ipv6
ONBOOT=yes
IPV6INIT=yes
IPV6FORWARDING=yes
IPV6_ROUTER=yes
IPV6TUNNELIPV4=72.52.104.74
IPV6TUNNELIPV4LOCAL=222.228.173.205
IPV6ADDR=2001:470:1f04:bc2::2/64
# IPV6_MTU=: controls IPv6 MTU for this link (optional)
# IPV6ADDR_SECONDARIES="[/] ..."
このトンネル用の経路を追加する。table 200に設定する。
この設定ファイルには ip -6 route add 以降のコマンドラインを
羅列できる。
$ cat /etc/sysconfig/network-scripts/route6-he-ipv6
# See /etc/iproute2/rt_table
dev he-ipv6 table 200
he.net の routed /64アドレスはeth0に追加する。
/etc/sysconfig/network-scripts/ifcfg-eth0に
以下の1行を追加する。Fedora 12で挟まれた部分はさわらないようにする。
IPV6ADDR=2001:470:1f05:bc2::1/64
別途、/etc/rc.d/rc.localの末尾などに追加:
### Source Address Selection ###
### RFC3484 Rule 6 Lables ###
ip -6 addrlabel add prefix 2001:0470::/32 label 10
### DELETE tunnel entry ###
ip -6 addrlabel del prefix 2002::/16 label 2
### Policy Routing ###
ip -6 rule add to 2001:470::/32 table 200
以下のコマンドで確認する。
$ sudo ifdown he-ipv6
$ sudo ifup he-ipv6
$ ping6 he.net
$ ping6 a.dns.jp
IPv6 ソースアドレスセレクションには要件と問題点の
RFCが出ていた 。
Fedora 12 の Linux kernel 2.6.31.12で
IPv6のポリシールーティングがようやく効いた 。
Policy Routingというと、ソースアドレスやTCPなどの
ポート番号を条件にして、特定のルータを指定して経路制御を
行うもの、と思う。
昨日まで試した設定がどうもうまくいかなかった。やったのは、
- IPv6 over IPv4トンネルを本張る (1つはOCNv6/PPP, 1つはHE.NET/SIT)
- 自分のサイトのIPv6アドレスはeth0に割り当てる
- HE.NET: 2001:470:1f05:bc2::1/64
- OCNv6: 2001:380:e07:10:200:f4ff:fe58:44f/64
- ポリシールーティングの設定は:
HE.NETの2001:470:1f05:bc2::/64を
ソースアドレスに持つパケットはHE.NETのトンネルに向ける
しかし、ソースアドレスにHE.NETの2001:470:1f05:bc2::1が
選択されても、HE.NETではなくOCNv6のトンネルに向かってしまう。
type unicastを指定してみたり、HE.NETのrouted /64アドレスと
トンネルの終端アドレスの両方で ip -6 rule を書いてみたが、
やはり同じだった。
そこで、ソースアドレスの判定をやめることにして、宛先だけを
指定してみることにした。
Linux でのソースアドレス選択にも、「IPv6でポリシー
ルーティングすればよい」とあるが、ソースアドレスでの
振り分けはしていない。IPv4のソースアドレスによる振り分けなら、
ほかにたくさん紹介例があるのだが。
ということで、上のnabekenさんの例と同じように、
ソースアドレスではなく宛先アドレスでポリシー設定をした
ところうまくいった。
- IPv6 over IPv4トンネルを本張る (1つはOCNv6/PPP, 1つはHE.NET/SIT)
- 自分のサイトのIPv6アドレスはeth0に割り当てる
- HE.NET: 2001:470:1f05:bc2::1/64
- OCNv6: 2001:380:e07:10:200:f4ff:fe58:44f/64
- ポリシールーティングの設定は:
WHOISに掲載されているHE.NETの割当IPv6アドレス2001:470::/32を
宛先ドレスに持つパケットはHE.NETのトンネルに向ける
- それ以外はOCNv6のトンネルに向ける
- どちらかのトンネルが切れたときは、別のトンネルを使う
Fedora 12の場合、iproute2パッケージのipコマンドは
もともと入っている。カーネルのAdvanced Routingも
onになっているようだ。
### addrlabelはソースアドレス選択時のRFC3484 Rule 6のラベル判定表。
### HE.NETあてのIPv6ネットワークアドレスをラベル10番に設定する
### HE.NET以外の宛先はだいたいラベル1になり、
### HE.NETのソースアドレスはラベル10に判定されるので、
### HE.NET以外の宛先の場合はHE.NETのソースアドレスが
### 選択されることはない。
### 2002::/16のトンネルあてprefixもlabel 1にすれば
### よく使う経路に向けることができるので、label 2は削除しておく
$ sudo ip -6 addrlabel add prefix 2001:0470::/32 label 10
$ sudo ip -6 addrlabel del prefix 2002::/16 label 2
$ ip -6 addrlabel
prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001:470::/32 label 10 ### HE.NETのアドレスはここにマッチ
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix fc00::/7 label 5
prefix ::/0 label 1 ### HE.NET以外はだいたいここにマッチ
### ソースと宛先がどちらもラベル1にマッチすれば、
### そのソースアドレスが利用される
### HE.NETあてのパケットは、HE.NET用経路テーブルで処理する
$ sudo ip -6 rule add to 2001:470::/32 table 200
$ ip -6 rule
0: from all lookup local
16383: from all to 2001:470::/32 lookup ipv6_he_net
32766: from all lookup main
### HE.NET用経路テーブルは、すべてHE.NETトンネルに送り出す
$ sudo ip -6 route add default dev he-ipv6 table 200
$ ip -6 route list table 200
default dev he-ipv6 metric 1024 mtu 1480 advmss 1420 hoplimit 0
### その他のパケットはすべてOCNv6のトンネルを使う
$ ip -6 route list table main | grep default
default dev he-ipv6 metric 1024 mtu 1480 advmss 1420 hoplimit 0
### 以前はHE.NETのソースアドレスが選択されていたが、
### OCNv6のソースアドレスが選択された [OK]
$ ip route get 2001:dc4::1
2001:dc4::1 from :: via 2001:dc4::1 dev ppp0 \
src 2001:380:e07:10:200:f4ff:fe58:44f metric 0
cache mtu 1390 advmss 1330 hoplimit 0
### HE.NETあてはHE.NETのソースアドレスと
### HE.NETのトンネルI/Fが選択された [OK]
$ ip route get 2001:470::1
2001:470::1 from :: via 2001:470::1 dev he-ipv6 \
src 2001:470:1f04:bc2::2 metric 0
cache mtu 1480 advmss 1420 hoplimit 0
### もともとOCNv6のソースアドレスが選択されていた宛先。
### OCNv6のソースアドレスとトンネルI/Fが選択された [OK]
$ ip route get 2001:200::1
2001:200::1 from :: via 2001:200::1 dev ppp0 \
src 2001:380:e07:10:200:f4ff:fe58:44f metric 0
cache mtu 1390 advmss 1330 hoplimit 0
Linuxで
IPv6ソースアドレスセレクションの状況を示すコマンドは
ip route get "宛先アドレス" 。特にLinux kernelの
Advanced Routingをonにしなくても使えた(Linux kernel 2.6.31, Fedora 12)。
LinuxでIPv6トンネルを2本、OCNv6とHE.NET tunnelbrokerの両方を
コマンドラインから使おうとして失敗。
ipv6.google.comやa.dns.jpからはping6が返り問題がない。
しかしa.root-servers.netにping6を打つと
source address selectionが動いていて、HE.NETのソースアドレスが選択される。
しかし送出されるインターフェースにOCNv6のトンネルが選択されてしまい、
ping6の応答がない。
| 宛先 | 宛先 | ソースアドレス | 出力I/F
|
|---|
| a.dns.jp | 2001:dc4::1 | OCNv6(eth0) | OCNv6へのトンネルI/F
|
|---|
| a.root-servers.net | 2001:503:ba3e::2:30 | HE.NET(he-ipv6) | OCNv6へのトンネルI/F
|
|---|
ip route コマンドの scope linkオプションはわかりやすそうな気がするが、
ip -6 route | grep ^feとしてIPv6リンクローカルアドレスを見ると、
IPv6にはscopeオプションはない。
しかし、ip -6 route show の表示が読みにくい。2008年当時の情報だからだろうか。
iproute2, ipコマンドの注意:
- /etc/iproute2/に、ルール、経路テーブルの設定ファイルがある。
- ip ruleはIPv4とIPv6でルールが別だがルール名が同じなので間違いやすい
- ip tunnelはPPPトンネルについては表示しない (SIT, GRE, IP-in-IPのみ)
現状確認
- ip -6 rule # 経路テーブル名の一覧
- ip -6 route list table main # テーブル main の経路
- ip -6 route list table local # テーブル local の経路
経路を追加
- /etc/iproute2/rt_tables に "200 ipv6_ocn", "201 ipv6_he_net"を追加
$ sudo ip -6 rule add from 2001:470:1f05:bc2::/64 table ipv6_he_net
$ ip -6 rule # IPv6の経路テーブルが追加された
0: from all lookup local
16383: from 2001:470:1f05:bc2::/64 lookup ipv6_he_net
32766: from all lookup main
$ ip rule # IPv4の経路テーブルは追加されていない
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
$ sudo ip -6 route add unicast default dev he-ipv6 table ipv6_he_net
$ sudo ip -6 route flush cache
$ ip -6 rule
0: from all lookup local
200: from 2001:470:1f05:bc2::/64 lookup ipv6_he_net
32766: from all lookup main
$ ip -6 route list table ipv6_he_net
default via 2001:470:1f04:bc2::1 \
dev he-ipv6 metric 1024 mtu 1480 advmss 1420 hoplimit 0
... しかし ...
$ ip route get 2001:503:ba3e::2:30
2001:503:ba3e::2:30 from :: via 2001:503:ba3e::2:30 \
dev ppp0 src 2001:470:1f05:bc2::1 metric 0
cache mtu 1390 advmss 1330 hoplimit 0
# HE.NETのトンネルI/FではなくOCNv6のppp0 I/Fが選択された。うー
$ ip -6 route get from 2001:470:1f05:bc2::1 2001:503:ba3e::2:30
2001:503:ba3e::2:30 from 2001:470:1f05:bc2::1 via 2001:503:ba3e::2:30 \
dev he-ipv6 src 2001:470:1f05:bc2::1 metric 0
cache mtu 1480 advmss 1420 hoplimit 0
... from を指定すると、期待どおりのvia と dev が表示された ...
### HE.NETのトンネルI/Fではなくeth0にrouted /64のアドレスをつけてみた
### しかし、やはりHE.NETのソースアドレスをつけながらも、出力デバイスが違う
$ ip route get 2404:6800:8007::63
2404:6800:8007::63 from :: via 2404:6800:8007::63 \
dev ppp0 src 2001:470:1f05:bc2::1 metric 0
cache mtu 1390 advmss 1330 hoplimit 0
... こうしても、OCNv6から出て行って、HE.NETトンネルから返ってくる ...
$ ping6 -I 2001:470:1f05:bc2::1 2404:6800:8007::63
... ping6 コマンドで -I でHET.NETのrouted /64のアドレスを指定すれば、
HE.NETのトンネルから出て行き、HE.NETのトンネルから戻ってくる ...
... あ゛ー ...
... よく見たら、どこにping6を打っても、HE.NETのソースアドレスをつけて
OCNv6のトンネルに出て行き、HE.NETのトンネルから戻ってきていた ...
... 一部、2001:240::53、2001:200:c000::35は OCNv6経由だった ...
... ソースアドレスセレクションはOKだが、出力I/Fの選択がおかしい ...
... ポリシールーティングを設定したから? ...
$ sudo ip -6 rule del from 2001:470:1f05:bc2::/64 table ipv6_he_net
... やはりHE.NETのソースアドレスでOCnv6に出て行く ...
$ sudo ip -6 rule add from 2001:470:1f05:bc2::/64 table ipv6_he_net
$ sudo ip -6 route add ::/0 via 2001:470:1f04:bc2::1 \
dev he-ipv6 mtu 1300 table ipv6_he_net
... やはり同じ ...
しかし、ping6 -I he_net_ipv6_tunnel_server_addr 2001:503:ba3e::2:30
としたあと、ping6 2001:503:ba3e::2:30 が通るようになってしまった。
tcpdumpしてみると、行きはOCNv6のppp0から出て行き、帰りはHE.NETの
SIT tunnel I/Fから応答が届いた。いやはや。
参考資料:
HE.netで勝手にやっている無料の
「IPv6資格テスト」が、それなりにおもしろい 。
DNSの逆引きも設定するところがある。
|
2010年05月07日(金)|
くもりのちあめ☁/☂ |
2/3 |
カテゴリ: IPv6
|