クラスフルルーティングと異なるサブネット

クラスフルルーティングプロトコルには不連続サブネットの問題ってのがあります。
同一メジャーネットワークのサブネットを持つ2つのルータで、ルータ間の接続を別のメジャーサブネットにした場合、ルーティングに不備が起こるとかそういうのですけど。
要はクラスフルルーティングプロトコルプリフィックス長をアドバタイズしないのが問題なわけですよ。


で、もう1つクラスフルルーティングプロトコルには、同一メジャーネットワークのサブネットのサブネットマスクは同一にしなければならないという制限があります。
この制限、守らなかったらどうなるのかな〜……というわけでやってみました。

用意したのは、Cisco2600が2台(FastEtherインタフェースが2つ)。

パターン1

routerA(config)#interface fa0/0
routerA(config-if)#ip address 10.1.1.1 255.255.255.0

routerA(config)#interface fa0/1
routerA(config-if)#ip address 10.2.1.1 255.255.255.0

routerA(config)#no ip classless
routerA(config)#router rip
routerA(config)#network 10.0.0.0
routerB(config)#interface fa0/0
routerB(config-if)#ip address 10.1.1.2 255.255.255.0

routerB(config)#interface fa0/1
routerB(config-if)#ip address 10.3.1.1 255.255.0.0

routerB(config)#no ip classless
routerB(config)#router rip
routerB(config)#network 10.0.0.0

routerAとrouterBは双方のFastEther0/0で接続。
ルータ間ネットワークは/24だが、ルータAのサブネットは/24、ルータBのサブネットは/16。見事なVLSMになってる場合は?

さて…。

routerB#sh ip route
     10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks
R       10.2.1.0/24 [120/1] via 10.1.1.1, 00:00:26, FastEthernet0/0
C       10.3.0.0/16 is directly connected, FastEthernet0/1
C       10.1.1.0/24 is directly connected, FastEthernet0/0

ふむ。やはり、アップデートを受信したインタフェースのサブネットマスクを当てはめるのかな?
ルータAは10.2.1.0で送信し、それをルータBは受信したFa0/0のサブネットを当てはめ/24でテーブルに載せたということだと思う。
まぁ、予想通り。問題ないといえばない。これだけみればVLSMしてるよなぁ。

では、ルータAは…

routerA#sh ip route
     10.0.0.0/24 is subnetted, 2 subnets
C       10.2.1.0 is directly connected, FastEthernet0/1
C       10.1.1.0 is directly connected, FastEthernet0/0

…10.3.0.0がない。
debug ip ripをやってみてわかったが、routerBはアップデートを送っていない。
つまり、「同一メジャーネットワークを異なるサブネットマスクで分割すると、アップデートを送らない」らしい。

routerB#debug ip rip
00:15:19: RIP: sending v1 update to 255.255.255.255 via FastEthernet0/1 (10.3.1.1)
00:15:19: RIP: build update entries - suppressing null update

sending v1 updateとあるが、「suppressing null update」。ルート情報なしのためsuppress。

パターン2

1つのルータで異なるサブネットマスクを適用すると、アップデートを送らないみたいだ。
これはつまらん。
よって、routerBのFa0/0を変更する。

routerB(config)#interface fa0/0
routerB(config-if)#ip address 10.1.1.2 255.255.0.0

routerB(config)#interface fa0/1
routerB(config-if)#ip address 10.3.1.1 255.255.0.0

routerB(config)#no ip classless
routerB(config)#router rip
routerB(config)#network 10.0.0.0

routerBのfa0/0を/16に変更。
さてさて。

routerB#sh ip route
     10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks
R       10.2.1.0/32 [120/1] via 10.1.1.1, 00:00:03, FastEthernet0/0
C       10.3.0.0/16 is directly connected, FastEthernet0/1
C       10.1.0.0/16 is directly connected, FastEthernet0/0

なんじゃこりゃ? 10.2.1.0はあるが、/32。ホストへのルート扱い?
…もちろん、10.2.1.1へのpingなんか通らない。
つまり、こういうことかな?
routerAは10.2.1.0を/24のつもりでアップデート送信。
routerBは受け取ったインタフェースfa0/0のサブネットで判断して、10.2.1.0/16。これってネットワークのアドレスじゃないから、ホストへのルートと判断。よって/32でテーブルに載せる。
ということかな?

routerA#sh ip route
     10.0.0.0/24 is subnetted, 3 subnets
R       10.3.0.0 [120/1] via 10.1.1.2, 00:00:13, FastEthernet0/0
C       10.2.1.0 is directly connected, FastEthernet0/1
C       10.1.1.0 is directly connected, FastEthernet0/0

routerA側は普通に10.3.0.0を/24としてテーブルに載せちゃってる。
さすがクラスフル。

パターン3

パターン2で、routerAが送ったアップデートが10.2.1.0だから、10.2.1.0/16 = ホスト とrouterBが判断してしまったのならば。
10.2.0.0というアップデートを送ったらどうなる?

routerA(config)#interface fa0/0
routerA(config-if)#ip address 10.1.1.1 255.255.255.0

routerA(config)#interface fa0/1
routerA(config-if)#ip address 10.2.0.1 255.255.255.0

routerA(config)#no ip classless
routerA(config)#router rip
routerA(config)#network 10.0.0.0

fa0/1を10.2.0.1/24に変更。
これで10.2.0.0というアップデートを送るはずだ。

routerB#sh ip route
     10.0.0.0/16 is subnetted, 3 subnets
R       10.2.0.0 [120/1] via 10.1.1.1, 00:00:25, FastEthernet0/0
C       10.3.0.0 is directly connected, FastEthernet0/1
C       10.1.0.0 is directly connected, FastEthernet0/0

なるほど。予想通り受け取った10.2.0.0を/16で判断してネットワークアドレスとみなしてるな。


確かに、クラスフルルーティングプロトコルで、同一メジャーネットワークのサブネットのサブネットマスクは同一にしないといけないなぁ。