[Nexus9K] VXLAN EVPN セキュリティ – GPO(Group Policy Option)を試してみた
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で学習しているため、送信元リーフ(ファーストホップ)で制御でき、不要なトラフィックをファブリックに流さずに済む

検証内容と結果
検証はシンプルに、ローカルリーフとリモートリーフでIPやVLANを条件にEPGを定義し、EPG間のICMP通信が期待どおりに許可・拒否されるかを確認しました。
検証構成
今回はシングルテナント構成です。前回の流れで、All IPv6 eBGP構成をベースにしています。

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

| EPG | SGT | リーフ | 分類条件 |
|---|---|---|---|
| EPG1 | 100 | NXOS15 | IPv4 20.20.20.1/32、IPv6 2001:20:20:20::1/128 |
| EPG2 | 200 | NXOS15 | IPv4 21.21.21.0/24、IPv6 2001:21:21:21::1/128 |
| EPG3 | 300 | NXOS16 | VLAN 200 |
| EPG4 | 400 | NXOS16 | VLAN 220 |
N9KvでGPOが使えなかった件
冒頭に書いたとおり、今回は実機での検証です。本当はNexus 9000vで試したかったのですが、GPOを使う際に必須の feature security を投入したところ、パケットフォワーディングが止まってしまいました。
N9Kvのガイド(Release 10.6(x))にも対応に関する記載がないため、未対応ということだと思います。残念ですが、今後のN9Kvの機能拡張に期待です。
テスト内容と結果
下図のテスト1〜3のポリシーをそれぞれ適用したうえで、EPG1からEPG2・EPG3・EPG4へIPv4/IPv6のPingを送り、成功・失敗が想定どおりかを確認しました。

結果は、すべてのテストパターンで想定どおりの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)に付いたSGT | show 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通信では経路に無駄が多く、装置も高価 |
コストや管理手法、全体のアーキテクチャを見ながら、最適解を探っていきたいところです。










ディスカッション
コメント一覧
まだ、コメントがありません