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