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

2026年7月19日

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

Nexus 9000シリーズでは、EVPN/VXLAN環境においてオーバレイネットワーク上のテナントに存在する各エンドポイントに対して、GPO(Group Policy Option)を利用するとファブリック内に分散ファイアウォール的な機能を提供することができます。

本記事では、Nexus 9K環境でVXLAN EVPN securityの一機能であるGPOについて座学的に学びつつ、検証を通じて導入時のポイントや注意点も整理します。

なおN9KvはGPOに対応していないようなので実機を用いた検証となっています。

参考ドキュメント:https://www.cisco.com/c/en/us/td/docs/dcn/whitepapers/securing-datacenters-with-microsegmentation-and-vxlan-gpo.html

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などのアクションを定義します。

このような、グループ間の通信条件をコントラクト、アクションをまとめた定義をポリシーなどと呼びます。

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

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

NXOS 上の VXLAN GPO の実装は、IETF RFC ドラフトEVPN グループ ポリシー( draft-lrss-bess-evpn-group-policy-00 ) に準拠した標準に基づいています。

各グループには、同一のポリシードメイン内でグループを識別するための16ビットのGroup Policy IDが割り当てられます。Ciscoの実装では、この識別子をSecurity Group Tag(SGT)と呼びます。

コントロールプレーン

Cisco NX-OSなどの実装では、SGTをBGP Extended CommunityとしてEVPNルートに付加して広告します。

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

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

データプレーン

データプレーンでは、VXLANヘッダーの拡張フィールドを使用して、送信元エンドポイントのGroup Policy ID、すなわちCisco実装では送信元SGTを伝送します。

VXLANヘッダーに格納されるのは、基本的に送信元側のSGTです。宛先側のSGTは、各リーフがローカルの分類情報やBGP EVPNで学習した情報から取得します。送信元リーフが送信元SGTと宛先SGTの両方を特定できる場合、送信元リーフでグループ間ポリシーを適用します。これをIngress Enforcementと呼びます。

送信元リーフでポリシーを適用した場合は、VXLANヘッダーのPolicy Appliedビット、すなわちAビットを1に設定します。Aビットが1のパケットを受信した宛先リーフは、同じポリシーを二重に適用せず、パケットを宛先エンドポイントへ転送します。

一方、送信元リーフが宛先エンドポイントのSGTを特定できない場合、送信元リーフではグループ間ポリシーを適用できません。この場合、送信元リーフは送信元SGTをGroup Policy IDフィールドに格納し、Aビットを0に設定してVXLANパケットを送信します。Aビットが0のパケットを受信した宛先リーフは、VXLANヘッダーに格納された送信元SGTと、ローカルで把握している宛先SGTを組み合わせてポリシーを適用します。これをEgress Enforcementと呼びます。

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

GPOの嬉しい点のまとめ

GPOの嬉しい点をまとめると以下のようになると思います。

従来ACLに比べてグループ同士の制御を設定していくことになり、コンフィグ量の可読性向上と削減に貢献

VMが移動した場合にも、他リーフで同様のポリシーを使い回すことで可読性を維持

制御ポイントはリーフスイッチとなり、かつ宛先のエンドポイント情報(MAC/IP)もEVPNを通じて学習しているので送信元のリーフスイッチで処理。ファーストホップで処理することで、不要なE-Wトラフィックの量の削減に貢献

検証内容と結果

テストはシンプルにローカルスイッチとリモートスイッチでEPG(Endpoint Group)をIPやVLANでセレクトして、それぞれをICMP通信して期待通りに動作するか試してみました。

検証構成

今回は以下のようなシングルテナント構成で実施しました。前回の流れでAll IPv6 eBGP構成がベースとなっています

それぞれのリーフスイッチに接続されたエンドポイントを異なるセレクト条件(IPv4/IPv6/VLAN)で定義します。またそれぞれのEPGを同一L2 VNIと異なるL2VNIに接続して、仮想L2ネットワークと仮想L3ネットワークを通して正しくポリシーが適用されるか確認しています。

なお冒頭に記載した通り、今回は実機を使っての検証となります。

Nexus9Kvで試してみたかったのですが、GPOを利用する際に必須の

feature security

コマンドを入力したところ、パケットフォワーディングが止まってしまいました。

N9KvのRelease Noteにも対応に関する記載がないですし、対応していないということだと思います。
https://www.cisco.com/c/en/us/td/docs/dcn/nx-os/nexus9000/106x/configuration/n9000v-9300v-9500v/cisco-nexus-9000v-9300v-9500v-guide-release-106x/m-overview.html

残念。今後のN9Kvの機能拡張を願っています。

テスト内容と結果

テストは以下の図の通り、テスト1−3のポリシーを反映させたうえで、EPG1からEPG2・EPG3・EPG4へIPv4/IPv6 Pingを送信して、Pingが成功するか失敗するかを確認するシンプルな内容です。

テスト結果

試験結果としては各テストパターンともに想定した通りのPing結果となりました。

ここではテスト1に絞ってコンフィグとステータスを確認します。

テスト1のコンフィグ:

まずGPOにフォーカスして、各スイッチに適用するコンフィグを見てみたいと思います。

各リーフのGPOの基本設定

NXOS15/16:
feature security
system routing template-security-groups
### system routing template-security-groupsでrebootが必要

次にEPGを定義します。各ローカルリーフスイッチで定義します。IPv4/IPv6/VLAN/IFなど様々な条件でグループ条件を設定することが可能です。

各リーフのEPGの設定

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

最後にポリシー(Security Contract)の定義と適用です。

各ポリシーはsecurity contractで設定します。送信元/宛先のEPGとどの通信を対象に何をするのか(Permit/Deny/Redirect)を指定してVRF配下に設定します。security enforceコマンドで設定したsecurity contractに該当しないデフォルト動作としてpermit or denyを設定します。

各リーフのポリシー設定

NXOS15/16:
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の全体コンフィグとなります。NXOS15とNXOS16の太字部分が上記で説明したGPOコンフィグ部分となります。NXOS14はSpineなので特にGPOのコンフィグはありません。

NXOS14


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

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

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 となります。実機の結果ではないので表示結果については気にしないでください。

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 topology/show l2route mac-ip topologyが有効です。

参考)
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はポリシーやポリシーへのヒット数を確認できます。

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 Option で設定しておく必要があります。実トラフィックがポリシーにマッチしているかどうか確認する時に重宝するコマンドだと思います。


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の嬉しい点を整理して、実際の動作を見てみました。グループ間のポリシー制御は、今回の機能のようにファブリック側で行うのか、VMware NSXやK8S CNIのようにホスト側で行うのか、はたまたFWで一元的に行うのか、色々手法があるので悩ましいところです。それぞれのメリット・デメリットとしては以下の感じかなと。

  • ファブリックでの制御は、接続機器はなんでも制御可能かつ安価なスイッチ(ASIC)で高速処理、ただしCAM容量に限りがある
  • ホスト側で制御すると、細やかな制御が可能、ただしホストサイドで同一環境が必要
  • FWでは、細やかな制御かつ大容量処理も可能、ただしE/W通信では無駄が多いのと装置が高価

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