Cisco IOS MPLS LDPの設定方法

スポンサーリンク

MPLSのタグ配布方法はIETF標準のLDPとCisco標準のTDPがあります。このページではデフォルト設定のLDPについてまとめます。

MPLS 基本動作

必須設定

MPLSをinterfaceに対して有効にするには以下のコマンドを投入します。MPLSが有効になっているinterfaceからhello packetが224.0.0.2宛てに送信されます。

Router(config-if)# mpls ip

MPLS neighborを確立するinterface(router-id)を設定します。OSPFのルータIDと同様に、以下順序でrouter-idが選出されます。なお、設定をすぐに反映させたい時はforceオプションを使用して下さい

  • router-idで明示的に指定されたinterface
  • Loopback interfaceのうちIPアドレスが最大のもの
  • up状態であるinterfaceでIPアドレスが最大のもの
Router(config)# mpls ldp router-id <interface> [ force ]

動作確認

以下の環境でMPLSの動作確認を行います。

          e0/1    e0/0      e0/0    e0/1      e0/0    e0/1      e0/0    e0/1
          .1+------+.1      .2+------+.2      .3+------+.3      .4+------+
        ----+  R1  +----------+  R2  +----------+  R3  +----------+  R4  +----
            +------+          +------+          +------+          +------+
192.168.1.0/24   192.168.12.0/24   192.168.23.0/24   192.168.34.0/24   192.168.4.0/24

          R1 Loopback0      R2 Loopback0      R3 Loopback0      R4 Loopback0
          10.1.1.1/24       10.2.2.2/24       10.3.3.3/24       10.4.4.4/24
 [R1]
interface Ethernet0/0
 mpls ip
!
mpls ldp router-id Loopback0 force

 [R2]
interface Ethernet0/0
 mpls ip
!
interface Ethernet0/1
 mpls ip
!
mpls ldp router-id Loopback0 force

 [R3]
interface Ethernet0/0
 mpls ip
!
interface Ethernet0/1
 mpls ip
!
mpls ldp router-id Loopback0 force

 [R4]
interface Ethernet0/0
 mpls ip
!
mpls ldp router-id Loopback0 force

なお、設定全文は下記ファイルです。ルーティング等の設定は省略しますので、必要に応じて下記を参照下さい。

R1
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R1
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
memory-size iomem 5
!
!
ip cef
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.1.1.1 255.255.255.0
!
interface Ethernet0/0
 ip address 192.168.12.1 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/1
 ip address 192.168.1.1 255.255.255.0
 half-duplex
 no keepalive
!
interface Ethernet0/2
 no ip address
 shutdown
 half-duplex
!
interface Ethernet0/3
 no ip address
 shutdown
 half-duplex
!
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip http server
ip forward-protocol nd
!
!
!
!
!
mpls ldp router-id Loopback0 force
!
control-plane
!
!
!
!
mgcp behavior g729-variants static-pt
!
!
!
!
!
line con 0
line aux 0
line vty 0 4
 login
!
!
end
R2
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R2
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
memory-size iomem 5
!
!
ip cef
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.2.2.2 255.255.255.0
!
interface Ethernet0/0
 ip address 192.168.12.2 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/1
 ip address 192.168.23.2 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/2
 no ip address
 shutdown
 half-duplex
!
interface Ethernet0/3
 no ip address
 shutdown
 half-duplex
!
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip http server
ip forward-protocol nd
!
!
!
!
!
mpls ldp router-id Loopback0 force
!
control-plane
!
!
!
!
mgcp behavior g729-variants static-pt
!
!
!
!
!
line con 0
line aux 0
line vty 0 4
 login
!
!
end
R3
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R3
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
memory-size iomem 5
!
!
ip cef
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.3.3.3 255.255.255.0
!
interface Ethernet0/0
 ip address 192.168.23.3 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/1
 ip address 192.168.34.3 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/2
 no ip address
 shutdown
 half-duplex
!
interface Ethernet0/3
 no ip address
 shutdown
 half-duplex
!
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip http server
ip forward-protocol nd
!
!
!
!
!
mpls ldp router-id Loopback0 force
!
control-plane
!
!
!
!
mgcp behavior g729-variants static-pt
!
!
!
!
!
line con 0
line aux 0
line vty 0 4
 login
!
!
end
R4
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R4
!
boot-start-marker
boot-end-marker
!
!
no aaa new-model
memory-size iomem 5
!
!
ip cef
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Loopback0
 ip address 10.4.4.4 255.255.255.0
!
interface Ethernet0/0
 ip address 192.168.34.4 255.255.255.0
 half-duplex
 mpls ip
!
interface Ethernet0/1
 ip address 192.168.4.4 255.255.255.0
 half-duplex
 no keepalive
!
interface Ethernet0/2
 no ip address
 shutdown
 half-duplex
!
interface Ethernet0/3
 no ip address
 shutdown
 half-duplex
!
!
router ospf 1
 log-adjacency-changes
 network 0.0.0.0 255.255.255.255 area 0
!
ip http server
ip forward-protocol nd
!
!
!
!
!
mpls ldp router-id Loopback0 force
!
control-plane
!
!
!
!
mgcp behavior g729-variants static-pt
!
!
!
!
!
line con 0
line aux 0
line vty 0 4
 login
!
!
end

MPLS neihgborが確立されると以下のようなメッセージが表示されます。

*Mar  1 00:10:56.547: %LDP-5-NBRCHG: LDP Neighbor 10.2.2.2:0 (1) is UP

また、以下のshowコマンドからもMPLS neihgborが確立されたかどうかを確認する事ができます。

R1#show mpls ldp neighbor
    Peer LDP Ident: 10.2.2.2:0; Local LDP Ident 10.1.1.1:0
        TCP connection: 10.2.2.2.55117 - 10.1.1.1.646
        State: Oper; Msgs sent/rcvd: 13/13; Downstream
        Up time: 00:01:41
        LDP discovery sources:
          Ethernet0/0, Src IP addr: 192.168.12.2
        Addresses bound to peer LDP Ident:
          10.2.2.2        192.168.12.2    192.168.23.2
R1#

MPLS neighbor

MPLSはudp 646とtcp 646を用いてneighborを確立します。

まず、MPLSルータは以下のようなhello packetを送信し、neighborの検出します。hello packetはudp 646を用いて224.0.0.2(全マルチキャストルータ)宛てに送信されます。hello pachetにはrouter-idを伝えるフィールドが設けられており、このrouter-idは後ほどneighborを確立する際に使用されます。

Ethernet II, Src: cc:01:02:9c:00:00 (cc:01:02:9c:00:00), Dst: IPv4mcast_00:00:02 (01:00:5e:00:00:02)
Internet Protocol, Src: 192.168.12.2 (192.168.12.2), Dst: 224.0.0.2 (224.0.0.2)
User Datagram Protocol, Src Port: ldp (646), Dst Port: ldp (646)
Label Distribution Protocol
    Version: 1
    PDU Length: 30
    LSR ID: 10.2.2.2 (10.2.2.2)
    Label Space ID: 0
    Hello Message
        0... .... = U bit: Unknown bit not set
        Message Type: Hello Message (0x100)
        Message Length: 20
        Message ID: 0x00000000
        Common Hello Parameters TLV
        IPv4 Transport Address TLV

hello packetによりneighborを検知した後は、tcp 646によってラベル情報を交換します。hello packetは物理interfaceからマルチキャストで送信されますが、tcp 646はLoopback Address(正確にはrouter-id)間で通信されます。neihgbor確立の仕様がやや複雑なので注意が必要です。

Ethernet II, Src: cc:01:02:9c:00:00 (cc:01:02:9c:00:00), Dst: cc:00:02:9c:00:00 (cc:00:02:9c:00:00)
Internet Protocol, Src: 10.2.2.2 (10.2.2.2), Dst: 10.1.1.1 (10.1.1.1)
Transmission Control Protocol, Src Port: 58700 (58700), Dst Port: ldp (646), Seq: 55, Ack: 45, Len: 282
Label Distribution Protocol

forwarding-table

MPLSはforwarding tableを元にラベルを付与し転送されます。forwarding tableが作成される流れをまとめると以下の通りです。なお、forwarding tableの正式名称はLFIB(label fowarding information base)ですが、単にforwarding tableと呼ばれる事もあります。

  • ルーティングテーブルからFIB(Forwarding Information Base)を作成します
  • FIBに記載されたprefixに対応するラベルを作り、そのラベルをneighborに伝えます
  • neighborから収集したラベル情報を元にLIB(Label Information Base)を作成します
  • LIBから必要な情報を抽出し、LFIB(label fowarding information base)を作成します
  • LFIBを元にパケットを転送します

LIBの読み方について把握するために具体例を挙げます。

LIBを確認するには、以下showコマンドを使用します。以下ハイライトされている部分はR2が10.1.1.1/32に対してラベル17を割り当てた事を意味します。R3は10.1.1.1/32にラベル16を割り当てたので、neighborであるR1, R3に対して”10.1.1.1/32宛てのパケットはラベル16を付与して転送して下さい”と依頼します。

R2#show mpls ldp bindings
  tib entry: 10.1.1.0/24, rev 11
        remote binding: tsr: 10.1.1.1:0, tag: imp-null
  tib entry: 10.1.1.1/32, rev 8
        local binding:  tag: 16
        remote binding: tsr: 10.3.3.3:0, tag: 17

R3のLIBを確認します。ハイライトしている部分は、10.1.1.1/32宛てのパケットをR2に転送する時は、ラベル16を付与して転送する事を意味します。確かに、neighborであるR2, R4から得た情報を元にLIBが構成されている事が読み取れると思います。

R3#show mpls ldp bindings
  tib entry: 10.1.1.1/32, rev 10
        local binding:  tag: 17
        remote binding: tsr: 10.2.2.2:0, tag: 16
        remote binding: tsr: 10.4.4.4:0, tag: 18
  tib entry: 10.2.2.0/24, rev 19
        remote binding: tsr: 10.2.2.2:0, tag: imp-null

forwarding tableを確認するには、以下showコマンドを実行します。例えば、10.1.1.1/32ならば、ラベル17をラベル16に付け替えてEt0/0から送信する事が読み取れます。

R3#show mpls forwarding-table
Local  Outgoing    Prefix            Bytes tag  Outgoing   Next Hop
tag    tag or VC   or Tunnel Id      switched   interface
16     Pop tag     192.168.12.0/24   0          Et0/0      192.168.23.2
17     16          10.1.1.1/32       0          Et0/0      192.168.23.2
18     Untagged    10.2.2.2/32       0          Et0/0      192.168.23.2
19     17          192.168.1.0/24    0          Et0/0      192.168.23.2
20     Untagged    10.4.4.4/32       0          Et0/1      192.168.34.4
21     Pop tag     192.168.4.0/24    0          Et0/1      192.168.34.4
R3#

R2, R3間で10.1.1.1/32宛てのパケットを観察すると、確かにラベル16が付与されている事が分かります。

Ethernet II, Src: cc:02:0b:08:00:00 (cc:02:0b:08:00:00), Dst: cc:01:0b:08:00:01 (cc:01:0b:08:00:01)
MultiProtocol Label Switching Header, Label: 16, Exp: 0, S: 1, TTL: 254
Internet Protocol, Src: 10.4.4.4 (10.4.4.4), Dst: 10.1.1.1 (10.1.1.1)
Internet Control Message Protocol

PHP

PHP

MPLS網におけるラストホップルータ(正確な用語はLER (Label Edge Router) )では、forwarding tableに基づく転送は行いません。ラストホップルータで、forwarding tableとルーティングテーブルを見てば充分ですので、ラベル取り外しの作業を行うのは無駄な作業です。

このような無駄を省くのがPHP (Penultimate Hop Popping) です。PHPはラストホップの1つ手前で敢えてラベルを取り外して転送する仕様の事です。

PHPはデフォルトで有効な機能です。R1がR2に送信したLDP messageを観察します。R1は192.168.1.0/24へ転送する際にタグは必要ないので、R2に”192.168.1.0/24宛てのパケットにはタグを付けないで欲しい”旨を伝えます。このmessageはimplicit nullと呼ばれラベル番号3で表されます。

Ethernet II, Src: cc:00:0b:08:00:00 (cc:00:0b:08:00:00), Dst: cc:01:0b:08:00:00 (cc:01:0b:08:00:00)
Internet Protocol, Src: 10.1.1.1 (10.1.1.1), Dst: 10.2.2.2 (10.2.2.2)
Transmission Control Protocol, Src Port: ldp (646), Dst Port: 27550 (27550), Seq: 214, Ack: 123, Len: 91
Label Distribution Protocol
    Version: 1
    PDU Length: 87
    LSR ID: 10.1.1.1 (10.1.1.1)
    Label Space ID: 0

 <omitted>

    Label Mapping Message
        0... .... = U bit: Unknown bit not set
        Message Type: Label Mapping Message (0x400)
        Message Length: 23
        Message ID: 0x00000053
        Forwarding Equivalence Classes TLV
            00.. .... = TLV Unknown bits: Known TLV, do not Forward (0x00)
            TLV Type: Forwarding Equivalence Classes TLV (0x100)
            TLV Length: 7
            FEC Elements
                FEC Element 1
                    FEC Element Type: Prefix FEC (2)
                    FEC Element Address Type: IPv4 (1)
                    FEC Element Length: 24
                    Prefix: 192.168.1.0
        Generic Label TLV
            00.. .... = TLV Unknown bits: Known TLV, do not Forward (0x00)
            TLV Type: Generic Label TLV (0x200)
            TLV Length: 4
            Generic Label: 3

R2のforwarding tableを観察すると、
192.168.1.0/24宛てのパケットはタグが取り外されている事が分かります。
Pop tagはタグを取り外すの意味です。

R2#show mpls forwarding-table
Local  Outgoing    Prefix            Bytes tag  Outgoing   Next Hop
tag    tag or VC   or Tunnel Id      switched   interface
16     Untagged    10.1.1.1/32       684        Et0/0      192.168.12.1
17     Pop tag     192.168.1.0/24    0          Et0/0      192.168.12.1
18     Untagged    10.3.3.3/32       0          Et0/1      192.168.23.3
19     Pop tag     192.168.34.0/24   0          Et0/1      192.168.23.3
20     20          10.4.4.4/32       708        Et0/1      192.168.23.3
21     21          192.168.4.0/24    0          Et0/1      192.168.23.3
R2#

上記forwading tableでは、Pop tagとUntaggedの記載があります。Pop tag, Untaggedはどちらも”タグを取り外す”の意味です。両者の意味の違いを深追いする必要はあまりないですが、違いをまとめると以下のようになります。感覚的な言い方をすれば、Pop tagはPHPにより敢えてタグを外しているのに対して、Untaggedはタグが必要ないという言い方になると思います。

仕様 具体例 説明
Pop tag 192.168.1.0/24 next hopのルータはパケットを転送する
Untagged 10.1.1.0/32 next hopのルータはパケットを転送しない

explicit-null

PHPにはメリットもデメリットもあります。メリットはラベル取り外しなどの無駄な処理を省く事ですが、デメリットはQoSの機能が制限されてしまう事です。MPLSにはexpというQoSを行うフィールドが存在しますが、ラベルを取り外してしまうとexpに基づくQoSができなくなってしまいます。

そこで登場する仕様がexplicit nullです。explicit nullはラベルを取り外す代わりに、明示的にラベル0を付与する仕様です。

仕様 ラベル番号 説明
implicit null 3 ラベルを付与しないで転送
explicit null 0 ラベル0を付与して転送

ラストホップルータにおいて以下のコマンドを入力すると、explicit nullが使用できます。

Router(config)# mpls ldp explicit-null

explicit nullを有効にすると、forwarding table上で”Pop tag”ではなく”0″と表示されます。

R2#show mpls forwarding-table
Local  Outgoing    Prefix            Bytes tag  Outgoing   Next Hop
tag    tag or VC   or Tunnel Id      switched   interface
16     Untagged    10.1.1.1/32       684        Et0/0      192.168.12.1
17     0           192.168.1.0/24    0          Et0/0      192.168.12.1
18     Untagged    10.3.3.3/32       0          Et0/1      192.168.23.3
19     Pop tag     192.168.34.0/24   0          Et0/1      192.168.23.3
20     20          10.4.4.4/32       708        Et0/1      192.168.23.3
21     21          192.168.4.0/24    0          Et0/1      192.168.23.3
R2#

MPLS 任意設定

認証設定

以下のコマンドでMPLS neighborを確立する際にpassword認証を行うようになります。

Router(config)# mpls ldp neighbor <remote_router_id> password <password>

以下のコマンドでMPLS neighborに対してpassword認証を求めるようになります。
neighborにpassword設定が施されていない場合は接続を拒否します。

Router(config)# mpls ldp password required

LDP有効化の省力化

LDP有効化の設定を全てのinterfaceに投入するのは手間です。以下のコマンドを使用する事によって、OSPFが有効になっているinterface全てでMPLSを有効化する事ができます。

Router(config)# router ospf <num>
Router(config-rtr)# mpls ldp autoconfig

直接接続

MPLSはrouter-id(殆どの場合はLoopback interface)間でneighborを確立します。もしLoopback address間で疎通できずneighborが確立できない場合は、以下のコマンドを使用します。このコマンドを使用する事で、物理interface間でMPLS neihgborを確立するようになります。

Router(config-if)# mpls ldp discovery transport-address interface

label filtering

デフォルトの挙動は、ルーティングテーブルに載っている全てのprefixに対してlabelを付与します。しかし、以下の2つのコマンドを入力する事で、一部のprefixに対してのみlabelを生成するようになります。(必ずno mpls ldp advertise-labelも入力して下さい)

Router(config)# no mpls ldp advertise-label
Router(config)# mpls ldp advertise-label for <standard_acl>
タイトルとURLをコピーしました