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