Overlay 設定¶
Overlay の設定は、最初に「L2 VLAN-VNI を作るのか」「VNET route を作るのか」「EVPN の NVO を作るのか」を決めると整理できます。どの場合も、VTEP となる VXLAN tunnel が先に必要です。
最小構成の順番¶
- Underlay IP reachability を作る。
- 自 VTEP loopback を決め、
VXLAN_TUNNELを作る。 - L2 overlay なら
VXLAN_TUNNEL_MAPで VLAN と VNI を対応させる。 - L3 / tenant overlay なら
VNETを作り、VNI と VXLAN tunnel を対応させる。 - remote prefix は
VNET_ROUTE_TUNNELまたは controller / EVPN 経由で入れる。 - EVPN を使う場合は
VXLAN_EVPN_NVOと FRR BGP-EVPN 側の設定を揃える。
CLI 入口¶
config vxlan は VTEP、EVPN NVO、VLAN-VNI map を扱います。
config vxlan add vtep1 10.0.0.1
config vxlan map add vtep1 100 100100
config vxlan evpn_nvo add nvo1 vtep1
config vnet は VNET と VNET route を扱います。
config vnet add Vnet1000 1000 vtep1
config vnet add-route Vnet1000 192.0.2.10/32 203.0.113.10 --vni 1000
実際の引数、依存チェック、削除時の順序は config vxlan と config vnet を確認してください。
典型シナリオ 1: EVPN VXLAN を有効化する (leaf として参加)¶
「underlay BGP は既に動いている。leaf として L2VPN EVPN family を有効化し、VLAN100 を VNI 100100 で広告したい」というケース。
CLI で打つ¶
# 1. loopback を VTEP source として使う
sudo config interface ip add Loopback1 10.1.0.1/32
# 2. VTEP を作成
sudo config vxlan add vtep1 10.1.0.1
# 3. EVPN NVO を有効化
sudo config vxlan evpn_nvo add nvo1 vtep1
# 4. VLAN を作る
sudo config vlan add 100
sudo config vlan member add 100 Ethernet0 -u
# 5. VLAN-VNI map を作る
sudo config vxlan map add vtep1 100 100100
vtep1 という名前はインスタンス名で、内部的に VXLAN_TUNNEL|vtep1 になります。同一 box で複数 VTEP を持つことは想定されないため通常は単一です。
CONFIG_DB で投入する¶
config_db.json 抜粋:
{
"VXLAN_TUNNEL": {
"vtep1": {
"src_ip": "10.1.0.1"
}
},
"VXLAN_EVPN_NVO": {
"nvo1": {
"source_vtep": "vtep1"
}
},
"VXLAN_TUNNEL_MAP": {
"vtep1|map_100_Vlan100": {
"vni": "100100",
"vlan": "Vlan100"
}
},
"VLAN": {
"Vlan100": {
"vlanid": "100"
}
},
"VLAN_MEMBER": {
"Vlan100|Ethernet0": {
"tagging_mode": "untagged"
}
}
}
VXLAN_TUNNEL_MAP のキーは <tunnel>|<map_name> で、map_name の命名は慣例的に map_<vni>_<vlan> 形式が使われます。vlan フィールドは Vlan<id> 形式で書く必要があります (数字単独ではエラー)。
sonic-cfggen で部分パッチを当てる場合:
show コマンドで確認¶
show vxlan tunnel
show vxlan vlanvnimap
show vxlan name vtep1
show vxlan remotevtep
show vxlan remotemac all
show vxlan tunnel の典型出力:
vxlan tunnel name source ip destination ip tunnel map name tunnel map mapping(s)
------------------- ----------- ---------------- ----------------- --------------------
vtep1 10.1.0.1 map_100_Vlan100 Vlan100 -> 100100
destination ip 列は EVPN モードでは空欄になります (動的学習)。EVPN BGP neighbor 確認は show bgp l2vpn evpn summary で別経路です。
典型シナリオ 2: VNET (controller driven overlay) を設定する¶
DASH 系や Mellanox SmartNIC 系の controller が VNET route を流し込むケース。EVPN を使わず、controller が VNET_ROUTE_TUNNEL を直接 APPL_DB / CONFIG_DB に書きます。
sudo config vxlan add vtep1 10.1.0.1
sudo config vnet add Vnet1000 1000 vtep1
sudo config vnet add-route Vnet1000 192.0.2.10/32 203.0.113.10 --vni 1000 \
--mac 00:11:22:33:44:55
CONFIG_DB:
{
"VNET": {
"Vnet1000": {
"vxlan_tunnel": "vtep1",
"vni": "1000",
"peer_list": ""
}
},
"VNET_ROUTE_TUNNEL": {
"Vnet1000|192.0.2.10/32": {
"endpoint": "203.0.113.10",
"vni": "1000",
"mac_address": "00:11:22:33:44:55"
}
}
}
確認:
典型シナリオ 3: IPinIP decap を Dual-ToR 用に設定する¶
TUNNEL テーブルは IPinIP decap term を表現します。Dual-ToR の standby → active 折り返しに使われる構成例:
{
"TUNNEL": {
"MuxTunnel0": {
"tunnel_type": "IPINIP",
"src_ip": "10.1.0.32",
"dst_ip": "10.1.0.33",
"dscp_mode": "uniform",
"encap_ecn_mode": "standard",
"ecn_mode": "copy_from_outer",
"ttl_mode": "pipe"
}
}
}
TUNNEL_DECAP_TABLE は APPL_DB に書かれる ephemeral state で、CONFIG_DB から書く対象ではありません。orchagent が TUNNEL を見て APPL_DB に派生する流れです。
CONFIG_DB / APPL_DB の見方¶
| 目的 | 主なテーブル | 読み方 |
|---|---|---|
| VTEP 作成 | VXLAN_TUNNEL |
src_ip が自 VTEP。P2P では dst_ip も使う |
| VLAN-VNI map | VXLAN_TUNNEL_MAP |
tunnel 配下で VLAN と VNI を対応させる |
| VNET 作成 | VNET |
vxlan_tunnel と vni が必須 |
| local route | VNET_ROUTE / VNET_ROUTE_TABLE |
VNET 内の subnet / local nexthop |
| tunnel route | VNET_ROUTE_TUNNEL / VNET_ROUTE_TUNNEL_TABLE |
remote endpoint、VNI、MAC、monitoring 情報 |
| IPinIP decap | TUNNEL → TUNNEL_DECAP_TABLE |
Dual-ToR や subnet decap の tunnel term |
Reference の config-db ページは、CLI で触る table と orchagent が見る table の違いを確認する場所です。特に TUNNEL_DECAP_TABLE は CONFIG_DB ではなく APPL_DB / STATE_DB の table なので、直接設定ファイルへ書く対象ではありません。
EVPN NVO と FRR の境界¶
VXLAN_EVPN_NVO は EVPN NVO インスタンスと source VTEP を結びます。ただし、BGP neighbor、address-family l2vpn evpn、route-target、VRF などの control plane 設定は FRR 側の領域です。SONiC 側で VXLAN tunnel と map が存在していても、FRR EVPN が Type-2 / Type-5 を交換していなければ remote MAC / prefix は学習されません。
PBH inner hash¶
VXLAN / NVGRE の外側 header だけで ECMP / LAG hash すると、複数 flow が同じ tunnel endpoint へ偏ることがあります。Policy Based Hashing は ACL match した encapsulated packet に対して inner 5-tuple ベースの hash を適用する機能です。設定単位は PBH_TABLE、PBH_RULE、PBH_HASH、PBH_HASH_FIELD で、VXLAN/VNET そのものの設定とは別です。
よくある設定エラーと対処¶
sonic-utilities/config/vxlan.py の ctx.fail() から抜粋した実エラーメッセージ:
| エラーメッセージ | 原因 | 対処 |
|---|---|---|
VTEP already configured. |
既に別名で VTEP が存在 | show vxlan tunnel で確認し、不要なら削除 |
EVPN NVO already configured |
NVO は 1 box 1 個 | 既存 NVO を削除してから再作成 |
VTEP <name> not configured |
map / NVO の追加で VTEP 未作成 | 先に config vxlan add |
Please delete the EVPN NVO configuration. |
VTEP 削除で NVO 残存 | config vxlan evpn_nvo del 先行 |
Please delete all VLAN VNI mappings. |
VTEP 削除で map 残存 | config vxlan map del 先行 |
Vlan Id already mapped |
同一 VLAN を別 VNI に二重 map | 既存 map を確認して削除 |
VNI Id already mapped |
同一 VNI を別 VLAN に二重 map | 同上 |
Invalid Vlan Id , Valid Range : 1 to 4094 |
VLAN ID 範囲外 | 入力値を見直す |
Invalid VNI <vni>. Valid range [1 to 16777215]. |
VNI 範囲外 | 24bit 範囲に収める |
VNI mapped to vrf <vrf>, Please remove VRF VNI mapping |
VRF-VNI 結びつきあり | config vrf del_vrf_vni_map 先行 |
削除順序は add の逆順 が原則: (rule) → map → NVO → VTEP。途中に VLAN_MEMBER / VLAN が残っていると VTEP 削除はできますが VLAN 側の clean-up は別途必要です。