Cisco ルータで OCN IPv6 トンネリング接続サービス
OCN の IPv6 トンネリング接続サービスに Cisco 1812J で接続する方法.
トンネルインターフェイスの設定
OCN への接続に Dialer 2 を使っているので tunnel source は Dialer2 に.tunnel destination は通知書に「OCNルータWAN側アドレス」と記載されているもの.tunnel mode は ipv6ip.point-to-point っぽいので ipv6 enable にしておいて ipv6 address はつけなくても通信できる.
interface Tunnel0 description OCN IPv6 no ip address ip virtual-reassembly ipv6 enable tunnel source Dialer2 tunnel destination XXX.XXX.XXX.XXX tunnel mode ipv6ip tunnel path-mtu-discovery
interface FastEthernet0 description WAN no ip address ip virtual-reassembly duplex auto speed auto pppoe enable group global pppoe-client dial-pool-number 2 pppoe-client dial-pool-number 1 interface Dialer2 description OCN ip address negotiated ip mtu 1454 ip nat outside ip virtual-reassembly encapsulation ppp ip tcp adjust-mss 1414 dialer pool 2 dialer idle-timeout 0 dialer-group 2 ppp authentication chap pap callin no cdp enable
Vlan インターフェイスの設定
Vlan インターフェイスにルータのアドレスと広告するプレフィックスを設定する.
interface Vlan100 ipv6 address 2001:380:XXXX::1/64 ipv6 enable ipv6 nd prefix 2001:380:XXXX::/64
ルーティングの設定
自分のネットワークへの経路は Null 0 に突っ込んでおく.そうしないと自分のプレフィックスへのパケットがデフォルトへルーティングされて OCN に戻されて,ping-pong してしまうからである.
デフォルト経路を Tunnel 0 へ向けて,最後にIPv6 ルーティングを有効にする.
ipv6 route 2001:380:XXXX::/48 Null0 ipv6 route ::/0 Tunnel0 ipv6 unicast-routing
NATの設定
NAT をしている場合注意が必要である.Dialer インターフェイスにかける access-list は正確に設定する必要がある.permit ip any any にしてしまうと Tunnel から出て行くグローバルの IPv4 パケットが NAT にひっかかり,変換に失敗して疎通できなくなる.これで数週間ハマった.
ip nat inside source list 100 interface Dialer1 overload ip nat inside source list 110 interface Dialer2 overload access-list 100 permit ip 192.168.0.0 0.0.0.255 any access-list 110 permit ip 192.168.0.0 0.0.0.255 any
経路の確認
c1812j#show ipv6 route IPv6 Routing Table - Default - 5 entries Codes: C - Connected, L - Local, S - Static, U - Per-user Static route B - BGP, M - MIPv6, R - RIP, D - EIGRP EX - EIGRP external O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2 ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2 S ::/0 [1/0] via Tunnel0, directly connected S 2001:380:XXXX::/48 [1/0] via Null0, directly connected C 2001:380:XXXX::/64 [0/0] via Vlan100, directly connected L 2001:380:XXXX::1/128 [0/0] via Vlan100, receive L FF00::/8 [0/0] via Null0, receive
トラブル
Vlan 100 配下のクライアントからは問題なく通信できるのだが,ルータからだと通信できなくなる.
具体的にはルータが生成した IPv6 パケットが外に出ていかない.ルータから送られるパケットは int Vlan 100 の ipv6 address をソースにして出て行くのだが,キャプチャしたところ int Tunnel 0 まではパケットはみえているのだけど,int Dialer 2 ではパケットが無くなっている...
こちらの日記ではうまく動作しているようだが,なぜ...
int Dialer 2 の ip nat outside を無効にするとパケットが出ていくようになるのだが,IPv6 パケットのスイッチング挙動が IPv4 の nat の設定に依存しているのはおかしい.バグだろうか.IOS は 12.4(24)T を使っているが,12.4(15)T1 以降だと治っているかもしれないとのこと.
@shtsuchi さんに教えていただいたところ int Dialer 2 の固定アドレスを int loopback 0 につけ,int Dialer 2 は ip unnumbered loopback 0 にし,int Tunnel0 の tunnel source を loopback 0 にするとIPv6 パケットが外に出ていくようになった.ありがとうございます!
追記:結局 int Dialer 2 で ip nat outside を無効にしたときと同じ挙動であった.解決策を模索中.
ルータ内部のパケットスイッチングの挙動もちゃんと勉強しないといけないなぁ...
とりあえず NAT は爆発してほしい.
解決(2010/12/17):int Tunnel0 から出て行くグローバルな IPv4 パケットが Dialer2 の NAT の access-list にひっかかり NAT しようとして変換に失敗し,パケットがドロップされていたのが原因だった.
Dec 17 08:46:55.246: mapping pointer available mapping:0 Dec 17 08:46:55.246: NAT: translation failed (A), dropping packet s=221.189.XXX.XXX d=61.207.XXX.XXX
@shtsuchi さんに指摘していただきました.検証までしていただいて大変お世話になりました.改めてお礼申し上げます.