ネットワーク

IP unnumbered の仕組みと Cisco IOS での設定・確認

ポイントツーポイントのリンクにIPアドレスを割り当てず、他のインタフェースのアドレスを借りて動かす IP unnumbered の覚え書き。仕組みと設定、確認コマンド、Ethernetで使おうとしたときの制約をまとめる。

前提/環境

Cisco IOS / IOS-XE のルータ2台を、シリアル(PPP)またはGREトンネルで直結した構成を想定している。本記事はコマンドリファレンスとRFCを元にした整理で、実機での再確認は行っていない(未検証)。出力例は形式を示すためのもので、値は環境によって変わる。

  [R1]                                     [R2]
  Loopback0 10.255.0.1/32                  Loopback0 10.255.0.2/32
  Gi0/1     192.168.10.1/24                Gi0/1     192.168.20.1/24
       |                                        |
       +---- Serial0/0/0 ==== Serial0/0/0 ------+
              (IPアドレスなし / unnumbered)

IP unnumbered とは

インタフェースに固有のIPアドレスを設定せず、同じルータ内の別インタフェースのアドレスを借用する機能。リンクに専用のサブネットを切らずに済む。

  通常の設定                        unnumbered
  ----------------------------------------------------------
  リンクごとに /30 か /31 を消費    リンクにサブネットを使わない
  インタフェース固有のIPを持つ      借用元のIPを送信元に使う
  経路表にリンクのネットワークが載る 借用元の /32 だけが載る
  ping の宛先にできる                リンク単体では宛先にできない

リンクにアドレスを持たないため、そのリンク宛の通信という概念がなくなる。パケットの送信元アドレスには借用元のアドレスが入り、経路は「このインタフェースから出す」という形(インタフェース指定のスタティックルート、またはルーティングプロトコル)で決める。

成立の条件は、リンクがポイントツーポイントであること。相手が1台に決まっているのでARPで宛先MACを引く必要がなく、出力インタフェースが決まれば届く。マルチアクセスのEthernetでそのまま使えないのはこのため。

借用元にLoopbackを使う理由

物理インタフェースのアドレスを借りることもできるが、借用元がdownすると、そのアドレスを使っている全てのunnumberedインタフェースが道連れで使えなくなる。Loopbackは物理状態に依存せず常にupなので、借用元にはLoopbackを使う。

設定手順

手順は次の3ステップ。

  1. 借用元となるLoopbackインタフェースを作る
  2. 対象インタフェースに ip unnumbered を設定する
  3. 対向へ到達するための経路を、出力インタフェース指定で入れる

Loopbackと unnumbered の設定

R1(config)# interface Loopback0
R1(config-if)# ip address 10.255.0.1 255.255.255.255
R1(config-if)# exit
R1(config)# interface Serial0/0/0
R1(config-if)# encapsulation ppp
R1(config-if)# ip unnumbered Loopback0
R1(config-if)# no shutdown
R1(config-if)# end

対向のR2は借用元のアドレスだけ変える。

R2(config)# interface Loopback0
R2(config-if)# ip address 10.255.0.2 255.255.255.255
R2(config-if)# exit
R2(config)# interface Serial0/0/0
R2(config-if)# encapsulation ppp
R2(config-if)# ip unnumbered Loopback0
R2(config-if)# no shutdown

両側で借用元のアドレスが同じサブネットに属している必要はない。ここでは /32 なので、そもそも同じサブネットにならない。

経路を入れる

スタティックで組む場合、ネクストホップのIPではなく出力インタフェースを指定する。リンクにアドレスがないためネクストホップを書けない。

R1(config)# ip route 10.255.0.2 255.255.255.255 Serial0/0/0
R1(config)# ip route 192.168.20.0 255.255.255.0 Serial0/0/0

OSPFを載せる

unnumberedのリンクでもOSPFは動く。ネットワークタイプがpoint-to-pointであることが条件で、シリアル/PPPなら既定でそうなる。GREトンネルやEthernetを使う場合は明示する。

R1(config)# interface Serial0/0/0
R1(config-if)# ip ospf network point-to-point
R1(config-if)# ip ospf 1 area 0
R1(config-if)# exit
R1(config)# interface Loopback0
R1(config-if)# ip ospf 1 area 0

旧来の network コマンドで書く場合は注意が必要。network 10.255.0.1 0.0.0.0 area 0 と書くと、Loopback0だけでなく、そのアドレスを借用しているunnumberedインタフェースも一緒に有効になる。意図せずOSPFが動き出すことがあるので、インタフェース側で ip ospf を指定するほうが把握しやすい。

GREトンネルでのunnumbered

トンネルインタフェースは典型的なポイントツーポイントなので、unnumberedと相性がよい。トンネルごとに /30 を切らずに済む。

R1(config)# interface Tunnel0
R1(config-if)# ip unnumbered Loopback0
R1(config-if)# ip ospf network point-to-point
R1(config-if)# tunnel source GigabitEthernet0/0
R1(config-if)# tunnel destination 203.0.113.20

トンネルの送信元に ip unnumbered の借用元と同じLoopbackを指定すると、経路が再帰してトンネルが上下を繰り返すことがある。tunnel source は物理インタフェースにするか、別のLoopbackを用意する。

確認方法

アドレスが表示されるので、一見すると通常のインタフェースと区別がつかない。

R1# show ip interface brief
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet0/0     203.0.113.10    YES NVRAM  up                    up
GigabitEthernet0/1     192.168.10.1    YES NVRAM  up                    up
Serial0/0/0            10.255.0.1      YES unset  up                    up
Loopback0              10.255.0.1      YES NVRAM  up                    up

Serial0/0/0 と Loopback0 に同じアドレスが出ているのが unnumbered のサイン。借用元がどれかを確定させるには show ip interface を見る。

R1# show ip interface Serial0/0/0
Serial0/0/0 is up, line protocol is up
  Interface is unnumbered. Using address of Loopback0 (10.255.0.1)
  Broadcast address is 255.255.255.255
  MTU is 1500 bytes
  Helper address is not set
  ...

経路表では、対向のLoopback宛がインタフェース直結として載る。

R1# show ip route 10.255.0.2
Routing entry for 10.255.0.2/32
  Known via "ospf 1", distance 110, metric 65, type intra area
  Routing Descriptor Blocks:
  * directly connected, via Serial0/0/0
      Route metric is 65, traffic share count is 1
R1# show ip ospf interface Serial0/0/0
Serial0/0/0 is up, line protocol is up
  Internet Address 10.255.0.1/32, Area 0, Attached via Interface Enable
  Process ID 1, Router ID 10.255.0.1, Network Type POINT_TO_POINT, Cost: 64
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 10.255.0.2

疎通確認は対向のLoopback宛に行う。送信元を指定しないと、経路表に従って別のアドレスが送信元に選ばれることがある。

R1# ping 10.255.0.2 source Loopback0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.255.0.2, timeout is 2 seconds:
Packet sent with a source address of 10.255.0.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/5/8 ms

使いどころ

  拠点数の多いWAN     リンクごとの /30 が積み上がるのを避ける
  GRE / IPsecトンネル 本数が増えてもアドレス設計が変わらない
  検証環境            アドレス設計を決めずに疎通だけ先に確認したいとき
  アドレスの節約      IPv4が逼迫している環境での延命

逆に、リンク単位で監視したい、リンクごとにACLやNATの条件を分けたい、といった要件があるなら通常のアドレス設定にしたほうがよい。

ハマりどころ

traceroute の表示が同じアドレスで並ぶ

ICMPの送信元が借用元のアドレスになるため、複数のリンクを経由しても同じアドレスが返る。どのリンクを通ったかがtracerouteから読み取れない。経路を追う場合は各ホップで show ip route を確認する。

リンク単体をpingで監視できない

リンクにアドレスがないので、監視システムから「この区間だけping」ができない。SNMPのインタフェース統計(ifIndex単位)は取れるので、死活はそちらで見る。IP SLAで対向のLoopback宛を監視する形になるが、その場合は経路が生きているかの監視であって、特定のリンクの監視にはならない。

Ethernetではそのまま使えない

マルチアクセスのセグメントではARPで宛先MACを解決する必要があるため、原則として使えない。IOS-XEの一部プラットフォームは、加入者収容などの用途でEthernet上のunnumberedに対応しているが、対向ごとのホストルート(/32)を別途持たせる前提になる。単純にEthernetインタフェースへ ip unnumbered を入れただけでは通信できない。

借用元を変更すると隣接が落ちる

ip unnumbered の借用元を差し替えると、そのインタフェースのアドレスが変わるのと同じことになり、OSPFの隣接は張り直しになる。Router IDに使っているLoopbackを触る場合はさらに影響が広がるので、変更は停止時間を取って行う。

ネットワークタイプの不一致で隣接が上がらない

片側だけ ip ospf network point-to-point を入れ忘れると、Helloのタイマ値やDR選出の有無が食い違って隣接が上がらない。show ip ospf interface の Network Type を両側で突き合わせる。

OSPFが意図しないインタフェースで有効になる

network コマンドで借用元のアドレスを指定すると、同じアドレスを使うunnumberedインタフェースがまとめて対象になる。show ip ospf interface brief で、実際に有効になっているインタフェースを確認する。

-ネットワーク
-, , ,