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 さんに指摘していただきました.検証までしていただいて大変お世話になりました.改めてお礼申し上げます.