Juniper MX240 × Proxmox SDN で作る EVPN/VXLAN ファブリック — 詳細設定編 | 技術ブログ

Juniper MX240 × Proxmox SDN で作る EVPN/VXLAN ファブリック — 詳細設定編

Proxmox SDN と MX240 の具体的な設定内容を解説します。

Juniper MX240 × Proxmox SDN で作る EVPN/VXLAN ファブリック — 詳細設定編

概要編 では全体のアーキテクチャと設計思想を紹介しました。本記事では、実際の設定内容を解説します。

前提

本記事で扱う構成の概要です。

役割 ホスト名 Loopback 備考
スパイン1 rt-core01 202.222.160.1 Juniper MX240
スパイン2 rt-core02 202.222.160.2 Juniper MX240
BGP ルータ1 bgp01 202.222.160.3 VyOS
BGP ルータ2 bgp02 202.222.160.4 VyOS
Proxmox ノード1 pve01 202.222.160.21 DL360 GEN10
Proxmox ノード2 pve02 202.222.160.22 DL360 GEN10
Proxmox ノード3 pve03 202.222.160.23 DL380 GEN10

VM 用サブネット:

  • IPv4: 202.222.170.0/24(GW: 202.222.170.1
  • IPv6: 2001:df0:68:170::/64(GW: 2001:df0:68:170::1

VNI:

  • L2 VNI: 10170(ブリッジドメイン、RT: 45689:10170
  • L3 VNI: 20170(VRF、RT: 45689:20170

全体の AS は 45689 で、iBGP を使用しています。アンダーレイは OSPF area 0.0.0.0 で構成されています。

1. Proxmox SDN の設定

Proxmox 側の設定は全て SDN の GUI で完結します。

Controller の作成

Datacenter → SDN → Controllers → Add → EVPN

項目 説明
ID evpn-ct 任意の識別子
ASN 45689
Peers 202.222.160.1,202.222.160.2 MX240 2台の loopback アドレス

Zone の作成

Datacenter → SDN → Zones → Add → EVPN

項目 説明
ID evpn 任意の識別子
Controller evpn-ct 上で作成したコントローラ
VRF VXLAN Tag 20170 L3 VNI
Advertise Subnets チェック ON VM サブネットを Type-5 で広告
RT Import 45689:20170,45689:10170 L3 VNI + L2 VNI の Route Target

RT Import が重要です。MX240 からの Type-5 デフォルトルートを受信するには、L3 VNI の RT(45689:20170)を明示的に追加する必要があります。

VNet の作成

Datacenter → SDN → VNets → Create

項目 説明
ID vnet170 任意の識別子
Zone evpn 上で作成した Zone
Tag 10170 L2 VNI

Subnet の作成

VNets → vnet170 → Subnets → Create

項目 説明
Subnet 202.222.170.0/24 VM 用 IPv4 サブネット
Gateway 202.222.170.1 anycast ゲートウェイ

IPv6 サブネットも同様に追加します(2001:df0:68:170::/64、GW: 2001:df0:68:170::1)。

Apply

全ての設定を入れたら Datacenter → SDN → Apply を実行します。全ノードに同一の FRR 設定が自動展開され、MX240 との BGP セッションが確立されます。VM 用サブネットの Type-5 広告、MX240 からのデフォルトルート受信、Type-2 MAC+IP の学習が全て自動で動作します。

2. MX240 の設定(core01)

core02 も同じ構造で、RD と loopback アドレスのみが異なります。

2.1 chassis 設定

VXLAN を使用するために enhanced-ip モードと、lt- インタフェースを使用するために tunnel-services が必要です。

set chassis fpc 0 pic 2 tunnel-services bandwidth 10g
set chassis network-services enhanced-ip

network-services enhanced-ip の変更にはルータの再起動が必要な場合があります。

2.2 lt-(論理トンネル)インタフェース

VRF と inet.0 の間でルートをリークするための仮想リンクです。

Junos には VRF 間のルートリーク機能として instance-import がありますが、VPN タイプのインスタンス(instance-type vrf)を参照することが許可されていません(commit checkpolicy references a vpn instance エラーになります)。rib-group でコピーした経路は Secondary route になり iBGP で再広告されないため、こちらも使えません。lt- 上の eBGP セッションを使うことで、VRF のルートを inet.0 に Primary の BGP learned route として注入でき、iBGP Route Reflector が自動的に再広告します。

set interfaces lt-0/2/0 unit 0 encapsulation ethernet
set interfaces lt-0/2/0 unit 0 peer-unit 1
set interfaces lt-0/2/0 unit 0 family inet address 169.254.255.0/31
set interfaces lt-0/2/0 unit 0 family inet6 address fd00::0/127

set interfaces lt-0/2/0 unit 1 encapsulation ethernet
set interfaces lt-0/2/0 unit 1 peer-unit 0
set interfaces lt-0/2/0 unit 1 family inet address 169.254.255.1/31
set interfaces lt-0/2/0 unit 1 family inet6 address fd00::1/127

lt-0/2/00/2/0 は FPC 0、PIC 2 を指しています。tunnel-services を有効にした PIC のスロットに合わせてください。

unit 0 は EVPN-VRF に所属し、unit 1 は inet.0 に残ります。IPv4 にはリンクローカルアドレス(169.254.255.0/31)を、IPv6 には ULA(fd00::/127)を使用しています。

2.3 EVPN-VXLAN インスタンス(L2 virtual-switch)

L2 の EVPN/VXLAN ブリッジドメインを提供するインスタンスです。

set routing-instances EVPN-VXLAN instance-type virtual-switch
set routing-instances EVPN-VXLAN vtep-source-interface lo0.0
set routing-instances EVPN-VXLAN route-distinguisher 202.222.170.1:1
set routing-instances EVPN-VXLAN vrf-target target:45689:10170

set routing-instances EVPN-VXLAN protocols evpn encapsulation vxlan
set routing-instances EVPN-VXLAN protocols evpn default-gateway advertise
set routing-instances EVPN-VXLAN protocols evpn extended-vni-list 10170

set routing-instances EVPN-VXLAN bridge-domains BD170 vlan-id 170
set routing-instances EVPN-VXLAN bridge-domains BD170 vxlan vni 10170
set routing-instances EVPN-VXLAN bridge-domains BD170 vxlan ingress-node-replication

IRB インタフェースは使用しません。MX240 は L2 ドメインには直接参加せず、EVPN の制御プレーン(Type-2 MAC+IP、Type-3 IM の中継)のみを担当します。

2.4 EVPN-VRF インスタンス(L3 Type-5)

デフォルトルートを EVPN Type-5 で Proxmox ノードに配信し、lt- 経由のルートリークを行うインスタンスです。

set routing-instances EVPN-VRF instance-type vrf
set routing-instances EVPN-VRF interface lt-0/2/0.0
set routing-instances EVPN-VRF route-distinguisher 202.222.160.1:2
set routing-instances EVPN-VRF vrf-target target:45689:20170
set routing-instances EVPN-VRF vrf-table-label

デフォルトルートの設定next-table で inet.0 / inet6.0 のフルルートを参照):

set routing-instances EVPN-VRF routing-options static route 0.0.0.0/0 next-table inet.0
set routing-instances EVPN-VRF routing-options rib EVPN-VRF.inet6.0 static route ::/0 next-table inet6.0

EVPN Type-5 広告の設定:

set routing-instances EVPN-VRF protocols evpn ip-prefix-routes advertise direct-nexthop
set routing-instances EVPN-VRF protocols evpn ip-prefix-routes encapsulation vxlan
set routing-instances EVPN-VRF protocols evpn ip-prefix-routes vni 20170
set routing-instances EVPN-VRF protocols evpn ip-prefix-routes export EVPN-TYPE5-EXPORT

VRF 内 BGP(lt- 経由で inet.0 にルートをリーク):

# IPv4
set routing-instances EVPN-VRF protocols bgp group LEAK type external
set routing-instances EVPN-VRF protocols bgp group LEAK local-address 169.254.255.0
set routing-instances EVPN-VRF protocols bgp group LEAK local-as 64999 private no-prepend-global-as
set routing-instances EVPN-VRF protocols bgp group LEAK export LEAK-TO-INET
set routing-instances EVPN-VRF protocols bgp group LEAK import REJECT-ALL
set routing-instances EVPN-VRF protocols bgp group LEAK keep none
set routing-instances EVPN-VRF protocols bgp group LEAK peer-as 64998
set routing-instances EVPN-VRF protocols bgp group LEAK neighbor 169.254.255.1

# IPv6
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 type external
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 local-address fd00::
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 family inet6 unicast
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 local-as 64999 private no-prepend-global-as
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 export LEAK-TO-INET
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 import REJECT-ALL
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 keep none
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 peer-as 64998
set routing-instances EVPN-VRF protocols bgp group LEAK-V6 neighbor fd00::1

import REJECT-ALLkeep none を設定しています。このセッションの目的は VRF から inet.0 へルートを「押し出す」ことだけなので、逆方向(inet.0 のフルルートを VRF に引き込む)は不要です。VRF 内のデフォルトルートは next-table で参照しているため、BGP でフルルートを受信する必要はありません。keep none でメモリも節約できます。

IPv4 と IPv6 で別々の BGP セッションを張っているのには理由があります。IPv4 アドレスのセッションで family inet6 unicast をネゴすると、受信した IPv6 プレフィックスの next-hop が ::ffff:169.254.255.0(IPv4-mapped IPv6 アドレス)になり、Junos がこの next-hop を解決できず経路が hidden になります。IPv6 プレフィックスは IPv6 アドレスの BGP セッション(fd00::/127)で運ぶ必要があります。

2.5 inet.0 側の BGP(lt- からルートを受信)

# IPv4
set protocols bgp group VRF-LEAK type external
set protocols bgp group VRF-LEAK local-address 169.254.255.1
set protocols bgp group VRF-LEAK import LEAK-FROM-VRF
set protocols bgp group VRF-LEAK export REJECT-ALL
set protocols bgp group VRF-LEAK family inet unicast loops 2
set protocols bgp group VRF-LEAK peer-as 64999
set protocols bgp group VRF-LEAK local-as 64998 private no-prepend-global-as
set protocols bgp group VRF-LEAK neighbor 169.254.255.0

# IPv6
set protocols bgp group VRF-LEAK-V6 type external
set protocols bgp group VRF-LEAK-V6 local-address fd00::1
set protocols bgp group VRF-LEAK-V6 import LEAK-FROM-VRF
set protocols bgp group VRF-LEAK-V6 export REJECT-ALL
set protocols bgp group VRF-LEAK-V6 family inet6 unicast loops 2
set protocols bgp group VRF-LEAK-V6 peer-as 64999
set protocols bgp group VRF-LEAK-V6 local-as 64998 private no-prepend-global-as
set protocols bgp group VRF-LEAK-V6 neighbor fd00::

loops 2 は重要です。PVE が Type-5 で広告した経路が EVPN-VRF を通過する際に AS 45689 が付くため、inet.0(AS 45689)側で受信するとデフォルトの AS ループ検出で拒否されます。loops 2 で自 AS が1回まで AS path に出現することを許可します。

local-as ... private no-prepend-global-as は、lt- セッションで使う private AS(64998/64999)だけを AS path に付与し、グローバル AS(45689)を付けないための設定です。これがないと、bgp01/02 に iBGP で広告する際に AS 45689 が AS path に含まれ、bgp01/02 がループ検出で拒否します。

2.6 PVE グループ(iBGP Route Reflector)

set protocols bgp group PVE type internal
set protocols bgp group PVE family inet unicast
set protocols bgp group PVE family evpn signaling
set protocols bgp group PVE cluster 202.222.160.1
set protocols bgp group PVE peer-as 45689
set protocols bgp group PVE neighbor 202.222.160.21
set protocols bgp group PVE neighbor 202.222.160.22
set protocols bgp group PVE neighbor 202.222.160.23

MX240 が Route Reflector として動作し、PVE ノードは RR クライアントです。family evpn signaling で EVPN ルートを、family inet unicast で IPv4 ルートを運びます。

2.7 ibgp グループ(bgp01/02 への広告)

set protocols bgp group ibgp type internal
set protocols bgp group ibgp export to-iBGP
set protocols bgp group ibgp cluster 202.222.160.1
set protocols bgp group ibgp peer-as 45689
set protocols bgp group ibgp neighbor 202.222.160.3
set protocols bgp group ibgp neighbor 202.222.160.4
set protocols bgp group ibgp neighbor 202.222.160.2

set protocols bgp group ibgp-v6 type internal
set protocols bgp group ibgp-v6 local-address 2001:df0:68::202:222:160:1
set protocols bgp group ibgp-v6 family inet6 unicast
set protocols bgp group ibgp-v6 export to-iBGP
set protocols bgp group ibgp-v6 cluster 202.222.160.1

export to-iBGP は、lt- 経由の eBGP learned route の next-hop を self に書き換えるポリシーです。これがないと bgp01/02 への広告で next-hop が 169.254.255.0(lt- のアドレス)のまま送られ、bgp01/02 がその next-hop に到達できず経路が使えなくなります。

2.8 ポリシー

EVPN-TYPE5-EXPORT(VRF から EVPN Type-5 として広告するルートのフィルタ):

policy-statement EVPN-TYPE5-EXPORT {
    term BLOCK-LT {
        from {
            route-filter 169.254.0.0/16 orlonger;
        }
        then reject;
    }
    term BLOCK-LT-V6 {
        from {
            family inet6;
            route-filter fe80::/10 orlonger;
            route-filter fd00::/16 orlonger;
        }
        then reject;
    }
    term DEFAULT {
        from {
            protocol static;
            route-filter 0.0.0.0/0 exact;
        }
        then accept;
    }
    term DEFAULT-V6 {
        from {
            protocol static;
            route-filter ::/0 exact;
        }
        then accept;
    }
    term CONNECTED {
        from protocol direct;
        then accept;
    }
    term REJECT {
        then reject;
    }
}

BLOCK-LTBLOCK-LT-V6 で lt- のリンクローカルアドレスと ULA をフィルタしています。Junos は同一 term 内で IPv4 と IPv6 の route-filter を混在できないため、別 term に分離しています。

LEAK-TO-INET(VRF → inet.0 方向のリーク用フィルタ):

policy-statement LEAK-TO-INET {
    term BLOCK-DEFAULT {
        from {
            route-filter 0.0.0.0/0 exact;
        }
        then reject;
    }
    term BLOCK-DEFAULT-V6 {
        from {
            route-filter ::/0 exact;
        }
        then reject;
    }
    term BLOCK-LL-V6 {
        from {
            route-filter fe80::/10 orlonger;
            route-filter fd00::/16 orlonger;
        }
        then reject;
    }
    term EVPN-ROUTES {
        from protocol evpn;
        then accept;
    }
    term REJECT {
        then reject;
    }
}

デフォルトルート(0.0.0.0/0::/0)は inet.0 に漏らしません。inet.0 には既にフルルートが存在するため、VRF のデフォルトルートが入ると競合します。protocol evpn にマッチする経路(PVE が Type-5 で広告した VM サブネット)だけを通します。

to-iBGP(eBGP 学習ルートの next-hop を self に書き換え):

policy-statement to-iBGP {
    term 1 {
        from {
            protocol bgp;
            route-type external;
        }
        then {
            next-hop self;
        }
    }
}

LEAK-FROM-VRF / REJECT-ALL:

policy-statement LEAK-FROM-VRF {
    term ACCEPT {
        then accept;
    }
}

policy-statement REJECT-ALL {
    then reject;
}

3. core01 と core02 の差分

項目 core01 core02
loopback 202.222.160.1 202.222.160.2
EVPN-VRF RD 202.222.160.1:2 202.222.160.2:2
EVPN-VXLAN RD 202.222.170.1:1 202.222.170.2:1
RR cluster ID 202.222.160.1 202.222.160.2
lt- アドレス 同一(169.254.255.0/31, fd00::/127) 同一
ポリシー 同一 同一

lt- のアドレスが同じでも問題ありません。lt- はルータ内部のローカルリンクなので、外部には露出しません(EVPN-TYPE5-EXPORT の BLOCK-LT で Type-5 広告からも除外済み)。

4. トラフィックフロー

行き(VM → 外部)

1. VM が 202.222.170.1(anycast GW)にパケット送信
2. ローカル Proxmox ノードの VRF で受信
3. VRF のデフォルトルート(Type-5 で MX240 から受信)にマッチ
4. VXLAN でカプセル化し、L3 VNI 20170 で MX240 の VTEP へ
5. MX240 の EVPN-VRF でデカプセル
6. EVPN-VRF の static route 0.0.0.0/0 next-table inet.0 で inet.0 に転送
7. inet.0 のフルルートで最適な経路へ転送

帰り(外部 → VM)

1. 上流から bgp01/02 にパケット到着
2. bgp01/02 の inet.0 で 202.222.170.0/24 にマッチ
   (MX240 が lt- BGP リーク → iBGP で広告済み、next-hop は MX240 の loopback)
3. OSPF 経由で MX240 に到着
4. MX240 の inet.0 で 202.222.170.0/24 にマッチ
   (lt- BGP リーク経由で、next-hop は lt- 0/2/0.1)
5. lt- 経由で EVPN-VRF に入る
6. EVPN-VRF で EVPN Type-2(MAC+IP)ルートを参照し、正しい VTEP を特定
7. VXLAN でカプセル化し、正しい Proxmox ノードへ
8. Proxmox ノードでデカプセル → VM に到着

5. 確認コマンド

MX240 側

# EVPN Type-5 ルートの確認
show route table EVPN-VRF.evpn.0 match-prefix "5:*"

# VRF のルーティングテーブル
show route table EVPN-VRF.inet.0
show route table EVPN-VRF.inet6.0

# lt- BGP セッション
show bgp summary group VRF-LEAK
show bgp summary group VRF-LEAK-V6
show bgp summary instance EVPN-VRF

# inet.0 に VM サブネットが入っているか
show route table inet.0 202.222.170.0/24
show route table inet6.0 2001:df0:68:170::/64

# bgp01/02 への広告
show route advertising-protocol bgp 202.222.160.3 202.222.170.0/24 detail

Proxmox 側

SDN の状態は Datacenter → SDN の各 Zone / VNet のステータスで確認できます。各ノードで Zone が「available」になっていれば正常です。

VM 側

# 疎通確認
ping 202.222.170.1       # anycast GW
ping 150.42.6.53         # 外部 IPv4
ping6 2606:4700:4700::1111  # 外部 IPv6
traceroute -n 150.42.6.53   # 経路確認

6. サブネット追加時の手順

EVPN/VXLAN ファブリックに新しい VM サブネットを追加する場合、MX240 の設定変更は不要です。

  1. Proxmox SDN で新しい VNet と Subnet を作成
  2. SDN Apply

以上で完了です。SDN Apply により新しいサブネットが自動的に EVPN Type-5 として MX240 に広告され、MX240 の lt- BGP リークを経由して bgp01/02 から上流にも自動再広告されます。

この記事の著者

ゆっぷりん