IX2015のTunnel statisticsの表示について

IX2015を買い集めてすでに20台を突破したのですが、各拠点にばらまいたり検証用にいろいろやっていたところ変なバグにぶつかるのはよくあること。そんなこんなで今回はこんなバグに出会いました。

Router(config)# sh tun s
Total statistics
  0 packets input, 0 bytes, 0 errors
  0 packets output, 0 bytes, 0 errors
Interface Tunnel0.0
  Tunnel mode is ether-ip ip
  Tunnel is ready
  Destination address is 10.0.0.1
  Source address is 10.0.0.2
  Outgoing interface is FastEthernet0/0.0
  Interface MTU is 1500
  Path MTU is 1500
  Statistics:
    0 packets input, 0 bytes, 0 errors
    0 packets output, 0 bytes, 0 errors
  Received ICMP messages:
    0 errors
      0 network unreachable
      0 host unreachable
      0 protocol unreachable
      0 fragmentation needed
      0 TTL exceeded
      0 parameter problem
Router(config)# 

何の変哲もないトンネルインタフェースの状態を表示しただけのものなんですが、今回見つけたバグはこれの以下の部分に注目するところから始まります。

Tunnel is ready

この表記が何を意味するのかというと、最新の8.3.8のマニュアルから引用するとこんな感じ。

項目 状態
Tunnel status 状態(終端への経路がない場合はDownとなる)Ver.7.3 以降、状態の詳細が表示されます。
  Tunnel is ready運用可能な状態

by IX1-3K-FD-8.3.pdf P.643

つまり、トンネルが対向までつながっていて使える状態であるということを意味しています。当然正しくコンフィグされてトンネルの入り口から出口のルータまでIP reachableであれば当然この表示が出ます。しかし、今回のバグは、Tunnel sorce Interfaceが特定の条件のもとリンクアップしただけでトンネルの状態が「Tunnel is Ready」になってしまうのです。

再現実験

interface FastEthernet0/0.0
  ip address 10.0.0.2/24
  no shutdown
!
interface Tunnel0.0
  tunnel mode ether-ip ip
  tunnel destination 10.0.0.1
  tunnel source FastEthernet0/0.0
  no ip address
  bridge-group 1
  no shutdown

上記のようなconfigを流し込んである状態で、まずFE0/0.0がLinkDownしているときはもちろん

Interface Tunnel0.0
  Tunnel mode is ether-ip ip
  Destination is unreachable
  Destination address is 10.0.0.1

となります。次に適当なHUBにつないでFE0/0.0をリンクアップさせます。10.0.0.1というホストは同一サブネット上に存在していない状態です。すると、

Router(config)#  ETH.031: Link status up for port 0, 100M b/s, FastEthernet0/0
  IP.021: Interface FastEthernet0/0.0, link up
  IP.021: Interface FastEthernet0/0.0, line protocol up
  IP.021: Interface FastEthernet0/0.0, up
 ARP.025: Gratuitous ARP request sent, 10.0.0.2, 00:30:13:f6:ab:c9, FastEthernet0/0.0

Router(config)# sh tun s
Total statistics
  0 packets input, 0 bytes, 0 errors
  0 packets output, 0 bytes, 0 errors
Interface Tunnel0.0
  Tunnel mode is ether-ip ip
  Tunnel is ready
  Destination address is 10.0.0.1

という風に「Tunnel is Ready」になりました。この場合本来は「Destination is unreachable」となるのが正しいはずです。これではあたかも対向ルータとの接続がうまくいっているかのように見えてしまい、オペレータの判断を鈍らせてしまいます。

考察

なぜこういう風な挙動をとるのかを検証してみました。こういった表記になるまでの判断基準をよく想像するところから始めます。というわけでマニュアルに目を通してみると、ひとつ気になることが。

Destination is unreachable
宛先へ到達するための経路が無い

トンネルの宛先ホストへの経路が無い場合、到達できないと判断されるようです。これってもしかしてルーティングテーブルに経路が乗っていれば、たとえホストに到達できなくても経路があるからunreachableにならないんじゃないの?と思ったので確認してみました。

Router(config-Tunnel0.0)# tun destination 192.168.0.1

トンネルの出口を、接続元のルータが直接接続していないサブネットにします。すると、

Interface Tunnel0.0
  Tunnel mode is ether-ip ip
  Destination is unreachable
  Destination address is 192.168.0.1

ただしくunreachableになりました。ということはやはり、この表示を行うときはルーティングテーブルのみを検査し、到達できるかどうかの判断をしているようです。案の定dumpしてみたところ、接続先を宛先とするパケットは一切観察できませんでした。

じゃあ次にルータのdefault routeを書くとどうなるのか試してみます。

ip route default FastEthernet0/0.0 10.0.0.1

すると、

Interface Tunnel0.0
  Tunnel mode is ether-ip ip
  Tunnel is ready
  Destination address is 192.168.0.1

やはりreadyになりました。

まとめ

さて、今回のをバグかどうかをとらえる件についてなんですが、とりあえずマニュアルにある「経路が無い」という記述がただ単にルーティングテーブルにあるかないかの判断だけになってしまうと、それが仕様になってしまうというかなんというか。

ただ、使っている側からすると接続先まで一回パケットを送ってみて確認をするべきだと思うし、そういう実装のほうがユーザには好まれるような気がします。

とりあえずNさんにはメールで要望として伝えておこうかと思います。

附録

バージョン

IX Series IX2010 (magellan-sec) Software, Version 8.2.19, RELEASE SOFTWARE