メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. MPLS記事一覧/

LDPのセッション認証(TCP MD5)

目次

LDPのセッション認証(TCP MD5)

LDPのセッションはTCPの646番の上に載ります。そこへ偽のセグメントを差し込まれないよう、RFC 5036TCP MD5 Signature OptionRFC 2385)による保護を定めています。守られるのはセッションだけで、隣接の発見にもラベルの中身にも認証はかかりません。この非対称と、片側だけ設定したときに起きる紛らわしい状態を、IOS XR(XRd)のラボで確かめます。LDPの基本はLDPとはで解説しています。

何を守り、何を守らないのか

RFC 5036の2.9.1節が参照するRFC 2385は、接続の両端だけが知る情報からMD5ダイジェストを計算し、TCPセグメントに付ける仕組みです。パスワードそのものは接続のストリームに現れません。攻撃者はシーケンス番号を当てるだけでなくパスワードも入手する必要があります。

2.9.2節が、LDPでの使い方を定めています。

項目 規定
設定の単位 ピアごとにパスワード(共有秘密)を設定する
照合に失敗したとき 送信元に何も返さずセグメントを捨てる
パスワードを設定していない相手 その相手からのHelloを無視する

守られない範囲も明記されています。5.2節 Privacy のとおり、LDPはラベル配布の情報を暗号化しません。経路上でラベルの対応関係を読むことは防げず、防げるのは偽のセグメントを差し込まれることです。

Hello(UDP 646)には認証がありません。 2.9.2節の「Helloを無視する」はパスワードを設定していない相手に対する動作なので、設定済みの相手から届くHelloは無視されません。つまり片側だけにパスワードを入れると、隣接は見えたままセッションだけが張れなくなります

IOS XRの設定

mpls ldpの直下で指定します。ピアはLDP識別子3.3.3.3:0のようにラベルスペース番号まで含む形)で指定します。

範囲 コマンド
全ネイバー共通 neighbor password clear <パスワード>
ピアごと neighbor <LDP識別子> password clear <パスワード>
共通パスワードをこのピアだけ無効化 neighbor <LDP識別子> password disable

clearは「これから平文を入力する」という意味で、保存されるときは暗号化されます

片側だけ入れると何が起きるか

パスワードを入れた側は、届くセグメントにダイジェストが付いていることを期待します。入れていない側は付けずに送るので、照合に失敗し、応答を返さずに捨てられます。送る側からは相手が沈黙しているようにしか見えず、TCPのSYNを再送し続けます。

Helloは流れ続けるので、show mpls ldp discoveryでは隣接が見えたままです。一方show mpls ldp neighborは空になります。

セッションが落ちるとラベルの交換も止まります。IGPは無関係なのでIPの経路は残り、コア内のIP疎通は通ったまま、MPLSで運ぶVPNの通信だけが落ちます。経路表が正常に見えるため、原因の見当をつけにくい状態になります。

検証構成

冗長性のない直列構成です。コア(PE1 - P1 - P2 - PE2)でOSPFとLDPを動かし、CE1とCE2はVRF CUST-AでPEに接続してVPNv4で疎通させます。認証を入れるのはPE1 - P1の1区間だけです。

MPLS-FILTERラボ
  CE1 ------ PE1 ------ P1 ------ P2 ------ PE2 ------ CE2
(AS 65101)    |          ↑ここに認証を入れる    |   (AS 65102)
           vrf CUST-A                     vrf CUST-A
              └────── iBGP vpnv4(Lo0間)──────┘
ルータ Lo0 役割
CE1 1.1.1.1 AS 65101、192.168.1.0/24
PE1 2.2.2.2 入口/出口LSR、vrf CUST-A
P1 3.3.3.3 中継LSR
P2 4.4.4.4 中継LSR
PE2 5.5.5.5 入口/出口LSR、vrf CUST-A
CE2 6.6.6.6 AS 65102、192.168.2.0/24

検証の全体像

STEP 操作 確かめること
0 認証なし セッションが確立し、ping / tracerouteが通ること
1 PE1だけneighbor 3.3.3.3:0 password セッションが落ち、隣接は残ること。IPは通るのにVPNが落ちること
2 P1にも同じパスワード 復旧し、TCPにMD5オプションが載ること
3 両側から撤去(最終状態) STEP 0と同じに戻ること

疎通はCE1からping 192.168.2.1 source 192.168.1.1 count 50 timeout 1で、コア内はPE1からping 5.5.5.5 source 2.2.2.2で測っています。

STEP 0:認証なしの状態

PE1とP1のセッションが確立し、7本のラベルを受け取っています。

STEP 0 PE1 show mpls ldp neighbor brief
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:23:25.251 UTC

Peer               GR  NSR  Up Time     Discovery   Addresses     Labels    
                                        ipv4  ipv6  ipv4  ipv6  ipv4   ipv6 
-----------------  --  ---  ----------  ----------  ----------  ------------
3.3.3.3:0          N   N    00:25:25    1     0     3     0     7      0    

STEP 1:PE1だけにパスワードを入れる

PE1にだけ設定します。投入した内容はpassword clearですが、保存された時点でencryptedになっています

STEP 1 PE1にcommitした設定
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sat Sep 12 03:27:29.095 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
mpls ldp
 neighbor
  3.3.3.3:0 password encrypted 09676F332C2938354620201A
 !
!
end

隣接は残り、セッションだけが落ちる

show mpls ldp neighbor briefは何も返しません。

STEP 1 PE1 show mpls ldp neighbor brief
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:29:49.148 UTC

RP/0/RP0/CPU0:PE1#show mpls ldp neighbor

ところがshow mpls ldp discoveryでは隣接が生きています。xmit/recvのままで、Establishedの時刻は設定を変える前のまま途切れていません

STEP 1 PE1 show mpls ldp discovery
RP/0/RP0/CPU0:PE1#show mpls ldp discovery
Sat Sep 12 03:29:49.492 UTC

Local LDP Identifier: 2.2.2.2:0
Discovery Sources:
  Interfaces:
    GigabitEthernet0/0/0/1 : xmit/recv
      VRF: 'default' (0x60000000)
      LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
          Hold time: 15 sec (local:15 sec, peer:15 sec)
          Established: Sep 12 01:59:48.900 (01:30:00 ago)

Helloは認証されないので、隣接だけが無傷で残ります。show mpls ldp neighborだけを見ると「相手がいない」ように見えますが、実際には相手は見えています。

IPは通るのにVPNだけが落ちる

CE1からCE2への疎通は完全に断です。

STEP 1 CE1 ping(VPNの通信)
RP/0/RP0/CPU0:CE1#ping 192.168.2.1 source 192.168.1.1 count 50 timeout 1
Sat Sep 12 03:31:52.547 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.2.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)

同じ時刻に、PE1からPE2のLoopback宛のIP疎通は無損失です。

STEP 1 PE1 ping(コア内のIP疎通)
RP/0/RP0/CPU0:PE1#ping 5.5.5.5 source 2.2.2.2 count 50 timeout 1
Sat Sep 12 03:30:09.450 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 5.5.5.5 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 9/11/27 ms

OSPFは動いているのでIPの経路は残り、トランスポートLSPだけが消えます。経路表を見ても異常は出ません。

TCPは応答が返らない

P1はセッションを張り直そうとしてSYNを送り続けます。03:27:31から03:36:10までの約9分間に60回、すべてP1からで、PE1からの応答は1つもありません。添付のキャプチャーのNo.900が最初の1回です。

STEP 1 No.900 SYN(P1 → PE1、tshark -V 抜粋)
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 2.2.2.2
Transmission Control Protocol, Src Port: 15439, Dst Port: 646, Seq: 0, Len: 0
    Source Port: 15439
    Destination Port: 646
    Flags: 0x002 (SYN)
        TCP Option - Maximum segment size: 1240 bytes
            Kind: Maximum Segment Size (2)
        TCP Option - Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
        TCP Option - End of Option List (EOL)
            Kind: End of Option List (0)
上のtshark出力のパケット(No.900 SYN)のpcapをダウンロード

オプションはMSSとWindow scaleだけで、MD5 signatureがありません。PE1はこれを照合できないので、RFC 2385のとおり応答を返さずに捨てます。

切り分けに使うもの

syslogの出方が両側で違います。原因が分かるのはパスワードを入れた側だけです。

STEP 1 PE1のsyslog(パスワードを入れた側)
RP/0/RP0/CPU0:Sep 12 03:27:28.434 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-NBR_CHANGE : VRF 'default' (0x60000000), Neighbor 3.3.3.3:0 is DOWN (Session MD5 password changed) 
STEP 1 P1のsyslog(入れていない側)
RP/0/RP0/CPU0:Sep 12 03:27:28.440 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-NBR_CHANGE : VRF 'default' (0x60000000), Neighbor 2.2.2.2:0 is DOWN (TCP connection closed) 

入れていない側にはTCP connection closedとしか出ません。相手が認証を入れたことは分からないので、片側だけ設定が変わった状況では、変更を知らない側は原因にたどり着けません。見るべきものをまとめます。

見るもの 片側だけ認証を入れたとき
show mpls ldp neighbor 空。 相手がいないように見える
show mpls ldp discovery Helloは届いている。 原因はセッション層にある
show ospf neighbor / show route 正常。IGPは無関係
syslog(設定した側) DOWN (Session MD5 password changed)
syslog(していない側) DOWN (TCP connection closed)

STEP 2:両側に同じパスワードを入れる

P1にも同じパスワードを入れると復旧します。ラベルも7本に戻りました。

STEP 2 PE1 show mpls ldp neighbor brief
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:39:54.731 UTC

Peer               GR  NSR  Up Time     Discovery   Addresses     Labels    
                                        ipv4  ipv6  ipv4  ipv6  ipv4   ipv6 
-----------------  --  ---  ----------  ----------  ----------  ------------
3.3.3.3:0          N   N    00:03:21    1     0     3     0     7      0    

ハンドシェイクのSYNにはMD5 signature(Kind 19)が載っています。添付のキャプチャーのNo.1693です。

STEP 2 No.1693 SYN(P1 → PE1、tshark -V 抜粋)
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 2.2.2.2
Transmission Control Protocol, Src Port: 46215, Dst Port: 646, Seq: 0, Len: 0
    Source Port: 46215
    Destination Port: 646
    Flags: 0x002 (SYN)
        TCP Option - Maximum segment size: 1216 bytes
            Kind: Maximum Segment Size (2)
        TCP Option - Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - TCP MD5 signature
            Kind: MD5 Signature Option (19)
            MD5 digest: 094c51db8fb8adb70061c6cbd3df7e02
上のtshark出力のパケット(No.1693 SYN)のpcapをダウンロード

返ってきたSYN/ACKにも同じようにMD5 signatureが載っています(ダイジェストの値は方向ごとに違います)。

STEP 2 No.1694 SYN/ACK(PE1 → P1、tshark -V 抜粋)
Internet Protocol Version 4, Src: 2.2.2.2, Dst: 3.3.3.3
Transmission Control Protocol, Src Port: 646, Dst Port: 46215, Seq: 0, Ack: 1, Len: 0
    Source Port: 646
    Destination Port: 46215
    Flags: 0x012 (SYN, ACK)
        TCP Option - Maximum segment size: 1216 bytes
            Kind: Maximum Segment Size (2)
        TCP Option - Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
        TCP Option - No-Operation (NOP)
            Kind: No-Operation (1)
        TCP Option - TCP MD5 signature
            Kind: MD5 Signature Option (19)
            MD5 digest: b7b7fb4175fcb691ff73dfa05ab16bc2
上のtshark出力のパケット(No.1694 SYN/ACK)のpcapをダウンロード

MSSが認証なしの1240バイトから1216バイトに減っています。MD5 signatureは18バイトのオプションで、詰め物を含めて24バイトぶんのオプション領域を使うためです。

STEP CE1 → CE2のping
0 100%(50/50)
1 0%(0/50)
2 100%(50/50)
3 100%(50/50)

STEP 3:撤去

両側からパスワードを外すと、MD5オプションの無いハンドシェイクでセッションが張り直されます。最終STEPのrunning-configは、ラボの起動時Configと1行も違いません。

設計上の注意

  • 両端に同時に入れられないなら、入れる順番を決めておきます。 片側だけの状態は必ずセッション断になります。運用中のコアに後から入れるときは、区間ごとに保守時間を取ります
  • 相手側には理由が出ません。 他組織との境界(インターAS)で認証を変えるときは、相手に事前に伝えないと相手側は原因を特定できません
  • パスワードを変えるときも一度切れます。 Session MD5 password changedで落ちてから張り直しになるため、変更も投入と同じ扱いで計画します
  • 暗号化は行われません。 ラベルの対応関係を隠したい場合、この仕組みでは足りません

検証Configおよびshow結果

各STEPで6台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。

ファイル 内容
..._show.txt show version / show mpls ldp neighbor detail / show mpls ldp discovery detail / show mpls ldp parameters など
..._log.txt そのSTEPの範囲だけに絞ったshow logging
..._run.txt そのSTEP時点のshow running-config(=そのSTEPの検証Config)
..._ping.txt そのSTEPのping(50発、timeout 1秒)とtraceroute
..._trace.txt show mpls ldp trace peer / discovery など(コア4台のみ)
..._commit.cfg そのSTEPで実際にcommitした設定だけ。 設定を変えたルータの分のみ

STEP 0:認証なし

ルータ show出力 syslog running-config ping trace commit
CE1 show log run ping - -
PE1 show log run ping trace -
P1 show log run ping trace -
P2 show log run ping trace -
PE2 show log run ping trace -
CE2 show log run ping - -

STEP 1:PE1だけにneighbor 3.3.3.3:0 password

ルータ show出力 syslog running-config ping trace commit
CE1 show log run ping - -
PE1 show log run ping trace cfg
P1 show log run ping trace -
P2 show log run ping trace -
PE2 show log run ping trace -
CE2 show log run ping - -

STEP 2:P1にも同じパスワード

ルータ show出力 syslog running-config ping trace commit
CE1 show log run ping - -
PE1 show log run ping trace -
P1 show log run ping trace cfg
P2 show log run ping trace -
PE2 show log run ping trace -
CE2 show log run ping - -

STEP 3:両側から撤去(最終状態)

ルータ show出力 syslog running-config ping trace commit
CE1 show log run ping - -
PE1 show log run ping trace cfg
P1 show log run ping trace cfg
P2 show log run ping trace -
PE2 show log run ping trace -
CE2 show log run ping - -

PE1 - P1間のキャプチャー全体です。STEP 1のSYN再送から、STEP 2のMD5付きハンドシェイク、STEP 3の撤去までが1本に入っています。

PE1 - P1間のキャプチャー全体をダウンロード

参考

出典 参照した箇所
RFC 5036 LDP Specification 2.9.1節(TCP MD5 Signature Option)、2.9.2節(ピアごとのパスワード、照合失敗時は応答せず破棄、パスワード未設定の相手のHelloを無視)、5.2節(暗号化されないこと)
RFC 2385 Protection of BGP Sessions via the TCP MD5 Signature Option MD5 signatureのTCPオプション(Kind 19)

検証はXRd 26.1.1(Cisco Modeling Labs)で実施しました。