[Nexus9K] VXLAN EVPN セキュリティ – GPO(Group Policy Option)を試してみた

2026年10月9日

VXLAN EVPN環境におけるセキュリティ制御は、マルチテナント化や東西(E-W)トラフィックの増加に伴い、ますます重要になっています。

Nexus 9000シリーズでは、GPO(Group Policy Option)を利用することで、EVPN/VXLANのオーバーレイ上にいる各エンドポイントに対して、ファブリック内で分散ファイアウォールのような制御を行えます。

本記事では、VXLAN EVPN Securityの一機能であるGPOの仕組みを座学で整理したうえで、実機検証を通じて導入時のポイントや注意点をまとめます。

なお、Nexus 9000v(N9Kv)はGPOに対応していないようなので、今回は実機での検証となっています。

参考ドキュメント:Securing Data Centers with Microsegmentation and VXLAN GPO(Cisco White Paper)

GPO(Group Policy Option)は何がうれしい?

従来のデータセンターでは、サーバー間通信のセキュリティ制御を、コアスイッチやアグリゲーションスイッチに設定したIPアドレスベースのACLで実現するのが一般的でした。

一方、VXLAN EVPNファブリックでは、テナントごとの論理的なL2/L3ネットワークが複数のリーフスイッチにまたがって構成されます。さらに、VMなどのワークロードが別のリーフ配下へ移動することもあります。

このような環境の通信制御を従来型のACLだけで表現しようとすると、ACLのエントリ数や組み合わせ、適用箇所が増えていきます。ワークロードの追加や移動のたびにACLを変更する必要もあり、運用が複雑になりがちです。

この課題に対する解決策の一つが、VXLAN GPOを利用したグループベースのポリシー制御です。GPOでは、個々のIPアドレスではなく、エンドポイントが所属するグループを基準に通信ポリシーを定義します。そのため、物理的な接続位置が変わっても、エンドポイントの役割に基づいて一貫したポリシーを適用できます。

なお、GPOそのものは、厳密には「送信元エンドポイントのグループ識別子をVXLANヘッダーで運ぶための拡張」です。グループの分類やポリシー定義、制御プレーンでの情報配布、通信の許可・拒否などは、GPOと各製品のポリシー機能を組み合わせて実現します。

グループとポリシー

エンドポイントのグループは、製品によってEndpoint Group(EPG)、Security Group(SG)、Endpoint Security Group(ESG)などと呼ばれます。一般的には、Webサーバー、アプリケーションサーバー、データベースサーバーのように、ワークロードの役割やセキュリティ要件に基づいてグループを作成します。

グループへの所属条件には、実装によってIPv4/IPv6アドレス、MACアドレス、VLAN、接続ポート、VM属性などを使用できます。

そのうえで、送信元グループと宛先グループの組み合わせ、およびTCP/UDPやポート番号などの通信条件に対して、permit / deny / redirectなどのアクションを定義します。このグループ間の通信条件をコントラクト、アクションをまとめた定義をポリシーと呼びます。

コントロールプレーンとデータプレーンの動作

続いて、このポリシーを適用するためのコントロールプレーンとデータプレーンの動作を見ていきます。

NX-OSのVXLAN GPOの実装は、IETFのドラフト「EVPN Group Policy(draft-lrss-bess-evpn-group-policy-00)」に準拠しています。各グループには、同一ポリシードメイン内でグループを識別するための16ビットのGroup Policy IDが割り当てられます。Ciscoの実装では、この識別子をSGT(Security Group Tag)と呼びます。

コントロールプレーン

NX-OSでは、SGTをBGP Extended CommunityとしてEVPN経路に付加して広告します。

たとえば、エンドポイントのMAC/IPアドレスを広告するEVPN Type-2経路にSGTを付加することで、各リーフは、リモートエンドポイントのMAC/IPとSGTの対応関係を学習できます。外部ネットワークのプレフィックスについては、Type-5経路にSGTを付加する場合もあります。

この情報を使うことで、送信元リーフは送信元と宛先の両方のSGTを特定し、パケットをファブリックへ送り出す前にポリシーを適用できます。

データプレーン

データプレーンでは、VXLANヘッダーの拡張フィールドを使って、送信元エンドポイントのGroup Policy ID(Cisco実装では送信元SGT)を運びます。VXLANヘッダーに入るのは基本的に送信元側のSGTだけで、宛先側のSGTは、各リーフがローカルの分類情報やBGP EVPNで学習した情報から求めます。

ポリシーをどこで適用するかは、送信元リーフが宛先SGTを知っているかどうかで変わります。

方式条件動作
Ingress Enforcement送信元リーフが送信元SGTと宛先SGTの両方を特定できる送信元リーフでポリシーを適用し、VXLANヘッダーのPolicy Appliedビット(Aビット)を1にして送信。宛先リーフは二重に適用せずそのまま転送する
Egress Enforcement送信元リーフが宛先SGTを特定できない送信元リーフは送信元SGTを入れ、Aビットを0にして送信。宛先リーフが、ヘッダー内の送信元SGTとローカルの宛先SGTを組み合わせてポリシーを適用する

この仕組みにより、可能な場合は送信元リーフで不要なトラフィックを早期に遮断しつつ、送信元リーフが宛先SGTを把握できない場合でも宛先リーフで確実にポリシーを適用できます。

GPOのうれしい点まとめ

  • コンフィグ量の削減と可読性の向上:IPアドレスの組み合わせではなく、グループ同士の制御として設定できる
  • ワークロード移動への追従:VMが別のリーフへ移動しても、同じグループ定義とポリシーをそのまま使い回せる
  • E-Wトラフィックの削減:宛先のエンドポイント情報(MAC/IPとSGT)もEVPNで学習しているため、送信元リーフ(ファーストホップ)で制御でき、不要なトラフィックをファブリックに流さずに済む
GPOの動作概要

検証内容と結果

検証はシンプルに、ローカルリーフとリモートリーフでIPやVLANを条件にEPGを定義し、EPG間のICMP通信が期待どおりに許可・拒否されるかを確認しました。

検証構成

今回はシングルテナント構成です。前回の流れで、All IPv6 eBGP構成をベースにしています。

検証構成

各リーフに接続したエンドポイントを、異なる条件(IPv4/IPv6/VLAN)でEPGとして定義しています。また、EPGを同一のL2VNIと異なるL2VNIに配置し、L2(同一セグメント)とL3(セグメント間ルーティング)の両方でポリシーが正しく適用されるかを確認しました。

EPGの定義と配置
EPGSGTリーフ分類条件
EPG1100NXOS15IPv4 20.20.20.1/32、IPv6 2001:20:20:20::1/128
EPG2200NXOS15IPv4 21.21.21.0/24、IPv6 2001:21:21:21::1/128
EPG3300NXOS16VLAN 200
EPG4400NXOS16VLAN 220

N9KvでGPOが使えなかった件

冒頭に書いたとおり、今回は実機での検証です。本当はNexus 9000vで試したかったのですが、GPOを使う際に必須の feature security を投入したところ、パケットフォワーディングが止まってしまいました。

N9Kvのガイド(Release 10.6(x))にも対応に関する記載がないため、未対応ということだと思います。残念ですが、今後のN9Kvの機能拡張に期待です。

テスト内容と結果

下図のテスト1〜3のポリシーをそれぞれ適用したうえで、EPG1からEPG2・EPG3・EPG4へIPv4/IPv6のPingを送り、成功・失敗が想定どおりかを確認しました。

テスト1〜3のポリシーと期待結果

結果は、すべてのテストパターンで想定どおりのPing結果になりました。ここからは、テスト1に絞ってコンフィグとステータスを確認します。

テスト1のコンフィグ

GPOの設定は、大きく「機能の有効化」「EPGの定義」「ポリシーの定義と適用」の3ステップです。

ステップ1:GPOの有効化(NXOS15/16)

feature security
system routing template-security-groups

system routing template-security-groups の反映には再起動が必要です。

ステップ2:EPGの定義

EPGは、エンドポイントが接続されている各リーフで定義します。IPv4/IPv6アドレス、VLAN、インタフェースなど、さまざまな条件でグループを指定できます。

! NXOS15
security-group 100 name EPG1
  match connected-endpoints vrf vrf-3000 ipv4 20.20.20.1/32
  match connected-endpoints vrf vrf-3000 ipv6 2001:20:20:20::1/128
security-group 200 name EPG2
  match connected-endpoints vrf vrf-3000 ipv4 21.21.21.0/24
  match connected-endpoints vrf vrf-3000 ipv6 2001:21:21:21::1/128

! NXOS16
security-group 300 name EPG3
  match vlan 200
security-group 400 name EPG4
  match vlan 220

ステップ3:ポリシーの定義と適用(NXOS15/16)

通信条件をclass-map、アクションをpolicy-mapで定義し、VRF配下の security contract で「送信元EPG・宛先EPG・ポリシー」を紐づけます。どのコントラクトにも該当しない通信のデフォルト動作は、security enforce で permit / deny を指定します。

class-map type security match-any icmp
  match ip icmp
  match ipv6 icmpv6
policy-map type security permit_icmp
  class icmp
    log

vrf context vrf-3000
  vni 3000
  security contract source 100 destination 200 policy permit_icmp
  security contract source 100 destination 400 policy permit_icmp
  security enforce tag 999 default deny

テスト1では、EPG1からEPG2・EPG4へのICMPだけを許可し、それ以外(EPG1→EPG3など)はデフォルトでdenyしています。

全体コンフィグ

テスト1の全体コンフィグです(機器名をクリックすると展開されます)。NXOS15とNXOS16の太字部分が、上で説明したGPOの設定です。NXOS14はSpineのため、GPOの設定はありません。

NXOS14(Spine)
NXOS14# show run
<snip>
version 10.6(2) Bios:version 05.53
hostname NXOS14

<snip>

feature nxapi
nv overlay evpn
feature ospf
feature bgp
feature pim
feature grpc
feature netflow
feature analytics
feature lldp
clock timezone JST 9 0
clock protocol ptp vdc 1
feature nv overlay
feature ngoam
feature telemetry
feature nxsecure

<snip>

route-map NEXT-HOP-UNCH permit 10
  set ip next-hop unchanged
  set ipv6 next-hop unchanged

<snip>

interface Ethernet1/32
  description to NXOS16 Ethernet1/1
  ipv6 address use-link-local-only
  ipv6 nd ra-interval 4 min 3
  ipv6 nd ra-lifetime 10
  no shutdown

<snip>

interface Ethernet1/34
  description to NXOS15 Ethernet1/1
  ipv6 address use-link-local-only
  ipv6 nd ra-interval 4 min 3
  ipv6 nd ra-lifetime 10
  no shutdown

<snip>

interface loopback0
  description SPINE_LOOPBACK
  ipv6 address 2001:db8:100::14/128
icam monitor scale

line console
line vty
boot nxos bootflash:/nxos64-cs.10.6.2.F.bin
router bgp 65000
  router-id 14.14.14.14
  bestpath as-path multipath-relax
  address-family ipv6 unicast
    network 2001:db8:100::14/128
  address-family l2vpn evpn
    retain route-target all
  neighbor Ethernet1/32
    remote-as 65016
    description BGP_UNNUMBERED_TO_NXOS16
    address-family ipv6 unicast
    address-family l2vpn evpn
      send-community
      send-community extended
      route-map NEXT-HOP-UNCH out
  neighbor Ethernet1/34
    remote-as 65015
    description BGP_UNNUMBERED_TO_NXOS15
    address-family ipv6 unicast
    address-family l2vpn evpn
      send-community
      send-community extended
      route-map NEXT-HOP-UNCH out
NXOS15(Leaf1)
NXOS15# show run
<snip>
version 10.6(3) Bios:version 01.12
hostname NXOS15

<snip>

feature nxapi
cfs eth distribute
nv overlay evpn
feature ospf
feature bgp
feature pim
feature grpc
feature interface-vlan
feature vn-segment-vlan-based
feature netflow
feature analytics
feature lacp
feature dhcp
feature lldp
clock timezone JST 9 0
clock protocol ptp vdc 1
feature nv overlay
feature security-group
feature ngoam
feature telemetry
feature nxsecure

security-group 100 name EPG1
  match connected-endpoints vrf vrf-3000 ipv4 20.20.20.1/32
  match connected-endpoints vrf vrf-3000 ipv6 2001:20:20:20::1/128

security-group 200 name EPG2
  match connected-endpoints vrf vrf-3000 ipv4 21.21.21.0/24
  match connected-endpoints vrf vrf-3000 ipv6 2001:21:21:21::1/128

class-map type security match-any icmp
  match ip icmp
  match ipv6 icmpv6
policy-map type security permit_icmp
  class icmp
    log

vrf context vrf-3000
  vni 3000
  security contract source 100 destination 200 policy permit_icmp
  security contract source 100 destination 400 policy permit_icmp
  security enforce tag 999 default deny
  rd auto
  address-family ipv4 unicast
    route-target import 3000:3000
    route-target import 3000:3000 evpn
    route-target export 3000:3000
    route-target export 3000:3000 evpn
  address-family ipv6 unicast
    route-target import 3000:3000
    route-target import 3000:3000 evpn
    route-target export 3000:3000
    route-target export 3000:3000 evpn
system routing template-security-groups

<snip>

interface Vlan200
  no shutdown
  vrf member vrf-3000
  ip address 20.20.20.254/24
  ipv6 address 2001:20:20:20::254/64
  fabric forwarding mode anycast-gateway

interface Vlan210
  no shutdown
  vrf member vrf-3000
  ip address 21.21.21.254/24
  ipv6 address 2001:21:21:21::254/64
  fabric forwarding mode anycast-gateway

interface Vlan300
  no shutdown
  vrf member vrf-3000
  ip forward
  ipv6 forward

interface nve1
  no shutdown
  host-reachability protocol bgp
  source-interface loopback0
  member vni 2000
    ingress-replication protocol bgp
  member vni 2100
    ingress-replication protocol bgp
  member vni 3000 associate-vrf

<snip>

interface Ethernet1/51
  description to VPC9
  switchport
  switchport mode trunk
  switchport trunk allowed vlan 200,210
  no shutdown

interface Ethernet1/52
  description to NXOS14 Ethernet1/1
  ipv6 address use-link-local-only
  ipv6 nd ra-interval 4 min 3
  ipv6 nd ra-lifetime 10
  no shutdown

<snip>

interface loopback0
  description VTEP_LOOPBACK_IPV6
  ipv6 address 2001:db8:100::15/128
icam monitor scale

line console
line vty
boot nxos bootflash:/nxos64-cs.10.6.3.F.bin
router bgp 65015
  router-id 15.15.15.15
  bestpath as-path multipath-relax
  address-family ipv6 unicast
    network 2001:db8:100::15/128
  address-family l2vpn evpn
  neighbor Ethernet1/52
    remote-as 65000
    description BGP_UNNUMBERED_TO_NXOS14
    address-family ipv6 unicast
    address-family l2vpn evpn
      send-community
      send-community extended
      route-map RM_EVPN_NH out
evpn
  vni 2000 l2
    rd auto
    route-target import 2000:2000
    route-target export 2000:2000
  vni 2100 l2
    rd auto
    route-target import 2100:2100
    route-target export 2100:2100
NXOS16(Leaf2)
NXOS16# show run
<snip>
version 10.6(3) Bios:version 01.12
hostname NXOS16
<snip>

feature nxapi
cfs eth distribute
nv overlay evpn
feature ospf
feature bgp
feature pim
feature grpc
feature interface-vlan
feature vn-segment-vlan-based
feature netflow
feature analytics
feature lacp
feature dhcp
feature lldp
clock timezone JST 9 0
clock protocol ptp vdc 1
feature nv overlay
feature security-group
feature ngoam
feature telemetry

<snip>

security-group 300 name EPG3
  match vlan 200
security-group 400 name EPG4
  match vlan 220
class-map type security match-any icmp
  match ip icmp
  match ipv6 icmpv6
policy-map type security permit_icmp
  class icmp
    log

fabric forwarding anycast-gateway-mac 2020.0000.00aa
ipv6 switch-packets lla
vlan 1,200,220,300
vlan 200
  vn-segment 2000
vlan 220
  vn-segment 2200
vlan 300
  vn-segment 3000

route-map RM_EVPN_NH permit 10
  set ipv6 next-hop 2001:db8:100::16

<snip>

vrf context vrf-3000
  vni 3000
  security contract source 100 destination 200 policy permit_icmp
  security contract source 100 destination 400 policy permit_icmp
  security enforce tag 999 default deny
  rd auto
  address-family ipv4 unicast
    route-target import 3000:3000
    route-target import 3000:3000 evpn
    route-target export 3000:3000
    route-target export 3000:3000 evpn
  address-family ipv6 unicast
    route-target import 3000:3000
    route-target import 3000:3000 evpn
    route-target export 3000:3000
    route-target export 3000:3000 evpn
system routing template-security-groups

<snip>

interface Vlan200
  no shutdown
  vrf member vrf-3000
  ip address 20.20.20.254/24
  ipv6 address 2001:20:20:20::254/64
  fabric forwarding mode anycast-gateway

interface Vlan220
  no shutdown
  vrf member vrf-3000
  ip address 22.22.22.254/24
  ipv6 address 2001:22:22:22::254/64
  fabric forwarding mode anycast-gateway

interface Vlan300
  no shutdown
  vrf member vrf-3000
  ip forward
  ipv6 forward

interface nve1
  no shutdown
  host-reachability protocol bgp
  source-interface loopback0
  member vni 2000
    ingress-replication protocol bgp
  member vni 2200
    ingress-replication protocol bgp
  member vni 3000 associate-vrf

<snip>

interface Ethernet1/51
  switchport
  switchport mode trunk
  switchport trunk allowed vlan 200,220
  no shutdown

interface Ethernet1/52
  speed 40000
  no negotiate auto
  ipv6 address use-link-local-only
  ipv6 nd ra-interval 4 min 3
  ipv6 nd ra-lifetime 10
  no shutdown

<snip>

interface loopback0
  description VTEP_LOOPBACK_IPV6
  ipv6 address 2001:db8:100::16/128
icam monitor scale

line console
line vty
boot nxos bootflash:/nxos64-cs.10.6.3.F.bin
router bgp 65016
  router-id 16.16.16.16
  bestpath as-path multipath-relax
  address-family ipv6 unicast
    network 2001:db8:100::16/128
  address-family l2vpn evpn
  neighbor Ethernet1/52
    remote-as 65000
    description BGP_UNNUMBERED_TO_NXOS14
    address-family ipv6 unicast
    address-family l2vpn evpn
      send-community
      send-community extended
      route-map RM_EVPN_NH out
evpn
  vni 2000 l2
    rd auto
    route-target import 2000:2000
    route-target export 2000:2000
  vni 2200 l2
    rd auto
    route-target import 2200:2200
    route-target export 2200:2200

ステータス確認コマンド

本来はテスト実施後のステータスを載せたかったのですが、取り忘れたコマンドが多かったため、今回は確認コマンドの紹介にとどめます。

確認したいことコマンド
EPGの定義と所属エンドポイントshow security-group id all
各エンドポイント(MAC / MAC-IP)に付いたSGTshow l2route mac topology <id>
show l2route mac-ip topology <id>
コントラクトとヒット数show contract
ポリシーにマッチした実フローshow logging ip access-list cache

EPGの確認:show security-group

EPGの定義と、所属しているエンドポイントを確認できます。以下は表示イメージ(今回の実機の結果ではありません)です。

Leaf1# show security-group id all

Security Group ID 200 , Name DB_Prod
  Selector Type : Connected IPv4 Endpoints
    VRF-Name                        IPv4-Address/mask-len
    VRF_App                         192.168.10.11/32
    VRF_App                         192.168.10.12/32
Leaf1#

SGTの確認:show l2route mac / mac-ip topology

各エンドポイントにどのSGTが付いているかを確認できます。Next-Hopsの列に「SGT – MAC:110」「SGT – IP:110」のように表示されます(こちらも表示イメージです)。

Leaf1# show l2route mac topology 2300
<snip>
Topology    Mac Address    Prod   Flags              Seq No     Next-Hops
----------- -------------- ------ ------------------ ---------- ---------------------------
2300        0050.7216.1011 Local  L,                 0          Eth1/1 (SGT - MAC:110)

Leaf1# show l2route mac-ip topology 2300
<snip>
Topology    Mac Address    Host IP         Prod   Flags   Seq No     Next-Hops
----------- -------------- --------------- ------ ------- ---------- --------------------------
2300        0050.7216.1011 172.16.10.11    HMM    L,      0          Vlan2300 (SGT - IP:110)

コントラクトの確認:show contract

設定したコントラクトと、それぞれへのヒット数(Stats)を確認できます。テスト1のコントラクトが有効になっていることが分かります。

NXOS15# show contract

VRF              SGT   DGT   Policy           Dir    Stats        Class            Action       OperSt
--------------------------------------------------------------------------------------------------------
vrf-3000         100   200   permit_icmp      bidir  20           icmp             permit,log   enabled
                 100   400   permit_icmp      bidir  10           icmp             permit,log   enabled
NXOS15#

実フローの確認:show logging ip access-list cache

ポリシーにマッチした通信のフローキャッシュを表示します。policy-mapで log オプションを設定しておく必要があります。実際のトラフィックが想定どおりポリシーにマッチしているかを確認するときに重宝するコマンドです。

NXOS15# show logging ip access-list cache
Src IP            Dst IP            S-Port  D-Port  Src Intf             Protocol      Hits
---------------------------------------------------------------------------------------------
20.20.20.1        20.20.20.2        0       0       Ethernet1/51         (1)ICMP       5
2001:20:20:20::1  2001:22:22:22::1  0       0       Ethernet1/51         (58)IPv6-ICMP 2
21.21.21.1        20.20.20.1        0       0       Ethernet1/51         (1)ICMP       2
2001:21:21:21::1  2001:20:20:20::1  0       0       Ethernet1/51         (58)IPv6-ICMP 3
2001:20:20:20::1  2001:21:21:21::1  0       0       Ethernet1/51         (58)IPv6-ICMP 3
2001:20:20:20::1  2001:20:20:20::2  0       0       Ethernet1/51         (58)IPv6-ICMP 5
20.20.20.1        22.22.22.1        0       0       Ethernet1/51         (1)ICMP       2
20.20.20.1        21.21.21.1        0       0       Ethernet1/51         (1)ICMP       0
NXOS15#

まとめ

今回はGPOのうれしい点を整理し、実機で動作を確認しました。設定は「機能の有効化」「EPGの定義」「コントラクトの適用」の3ステップとシンプルで、IPv4/IPv6・L2/L3のいずれでも想定どおりにポリシーが適用されました。

一方で、グループ間のポリシー制御には、今回のようにファブリック側で行う方法のほか、VMware NSXやKubernetesのCNIのようにホスト側で行う方法、FWで一元的に行う方法などがあり、どれを選ぶかは悩ましいところです。それぞれの特徴をざっくり比べると、次のようになると思います。

制御する場所メリットデメリット
ファブリック(GPOなど)接続機器を問わず制御でき、比較的安価なスイッチのASICで高速に処理できるTCAM容量に限りがある
ホスト(NSX、K8s CNIなど)きめ細かな制御が可能ホスト側に同じ仕組みを揃える必要がある
ファイアウォールきめ細かな制御と大容量処理を両立できるE-W通信では経路に無駄が多く、装置も高価

コストや管理手法、全体のアーキテクチャを見ながら、最適解を探っていきたいところです。