Share Notes

chundev

View the Project on GitHub latteouka/share-notes

Q-in-Q VLAN 導致 RDS Defender POC 無警示的排查與解決

日期:2026-03-16 環境:RDS Defender POC


TL;DR

POC 期間 RDS Defender 完全沒有產生警示,原因是 mirror 過來的流量帶有 Q-in-Q(雙層 VLAN tag),導致封包解析引擎無法正確解析 L3/L4 header。原廠在後端設定解開外層 VLAN 後,警示開始正常產生。


什麼是 Q-in-Q VLAN?

Q-in-Q(IEEE 802.1ad),又稱 Double VLAN Tagging 或 VLAN Stacking,是在標準 802.1Q VLAN tag 外面再包一層 VLAN tag 的技術。

封包結構

正常 802.1Q:
┌──────────┬───────────┬─────────┬─────────┐
│ Dst MAC  │ VLAN Tag  │ Payload │   FCS   │
│          │ 0x8100    │ (IP...) │         │
└──────────┴───────────┴─────────┴─────────┘

Q-in-Q (802.1ad):
┌──────────┬───────────┬───────────┬─────────┬─────────┐
│ Dst MAC  │ Outer Tag │ Inner Tag │ Payload │   FCS   │
│          │ (S-VLAN)  │ (C-VLAN)  │ (IP...) │         │
│          │ 0x88a8    │ 0x8100    │         │         │
└──────────┴───────────┴───────────┴─────────┴─────────┘
名稱 說明
S-VLAN (Service VLAN) 外層 tag,服務商或骨幹網路使用,EtherType 0x88a8
C-VLAN (Customer VLAN) 內層 tag,客戶原本的 VLAN,EtherType 0x8100

使用場景


問題根因分析

RDS Defender 本質上是一台 被動收流量的 server,透過 switch mirror port 接收封包進行深度封包檢測(DPI)。

問題流程

Switch Mirror Port
       │
       ▼
  ┌─────────────┐
  │ 帶 Q-in-Q   │  ← 封包有兩層 VLAN tag
  │ 的封包       │
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │ RDS Defender │  ← 解析引擎預設只認單層 VLAN
  │ 封包解析器   │
  └──────┬──────┘
         ▼
  ❌ L3/L4 header 偏移錯誤
  ❌ 無法辨識 IP/TCP/UDP
  ❌ 規則比對全部失敗
  ❌ 零警示

核心原因: 封包解析器以為 EtherType 後面緊接的就是 IP header,但實際上多了 4 bytes 的外層 VLAN tag,導致所有 offset 都錯位。


原廠的調整

原廠表示是「後端設定要解開」,最可能的調整方式:

調整方式 說明 可能性
✅ 啟用 Q-in-Q 解封裝 在 ingestion pipeline 加入 strip outer VLAN tag 的步驟 🟢 最可能
設定 VLAN offset 告訴解析引擎 L3 header 要多偏移 4 bytes 🟡 可能
修改 capture filter 讓 BPF filter 辨識 EtherType 0x88a8 🟡 可能

解封裝後的流程

Switch Mirror Port
       │
       ▼
  ┌─────────────┐
  │ 帶 Q-in-Q   │
  │ 的封包       │
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │ Decap 模組   │  ← ✅ 剝掉外層 S-VLAN tag
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │ 正常單層     │  ← 現在看起來跟正常封包一樣
  │ VLAN 封包    │
  └──────┬──────┘
         ▼
  ✅ L3/L4 header 正確解析
  ✅ 規則比對正常
  ✅ 警示產生

Q-in-Q 是誰加的?— Ixia NPB E40 的 Tool Sharing 與 Port Tagging

本案的 mirror 架構中間有一台 Ixia NPB (Network Packet Broker) E40,Q-in-Q 最可能就是 NPB 自己加的。

NPB 的端口角色

在 NPB 架構中,端口分兩種角色:

角色 說明
Network Port(網路端口) 輸入端,接收 SPAN/TAP 過來的流量
Tool Port(工具端口) 輸出端,連接監控工具(RDS Defender、IDS、Wireshark 等)

Tool Sharing — Q-in-Q 的根本原因

Tool Sharing = 多個網路來源的流量彙整後,送給同一個(或多個)監控工具。 這是 NPB 最核心的功能 — 多對多的流量分配。

Network Port A (SPAN from Core Switch)    ──┐
                                             ├──→ Tool Port 1 → RDS Defender
Network Port B (SPAN from DMZ Switch)      ──┤
                                             ├──→ Tool Port 2 → Wireshark
Network Port C (TAP from WAN Link)         ──┘

當多個 Network Port 的流量彙整到同一個 Tool Port 時,下游工具需要分辨「這個封包從哪個來源進來」。NPB 的做法就是 Port Tagging — 在封包外面加一層 VLAN tag 標記來源:

Network Port A (VLAN 100 的封包)
       │
       │  NPB 加上外層 tag: S-VLAN = 10 (代表 Port A)
       ▼
  [S-VLAN:10] [C-VLAN:100] [IP] [Payload]   ← Q-in-Q 就這樣產生了

Network Port B (VLAN 200 的封包)
       │
       │  NPB 加上外層 tag: S-VLAN = 20 (代表 Port B)
       ▼
  [S-VLAN:20] [C-VLAN:200] [IP] [Payload]

        兩者彙整 ──→ Tool Port 1 ──→ RDS Defender

完整因果鏈

Tool Sharing 啟用(NPB 彙整多來源流量)
       ↓
Port Tagging 自動啟用(為了標記封包來自哪個 Network Port)
       ↓
封包被加上外層 VLAN tag
       ↓
原本單層 VLAN → 變成 Q-in-Q
       ↓
RDS Defender 解析失敗 → 零警示

🔍 所以不是有人刻意加 Q-in-Q,而是 Tool Sharing 功能本身就需要 Port Tagging 來區分來源,副作用就是產生了雙層 VLAN。

流量路徑

原始網路設備 (Switch/Router)
       │
       │ SPAN / TAP(封包已帶 1 層 C-VLAN tag)
       ▼
┌──────────────┐
│ Ixia NPB E40 │  ← ⚠️ Tool Sharing + Port Tagging 加了外層 VLAN tag
└──────┬───────┘
       │ Tool Port
       ▼
  RDS Defender     ← 收到雙層 VLAN = Q-in-Q

Q-in-Q 來源可能性排序

來源 可能性 說明
Ixia NPB Port Tagging(因 Tool Sharing) 🟢 最高 NPB 的標準功能,Tool Sharing 時預設啟用
上游 Switch 本身就是 Q-in-Q 🟡 可能 電信級環境或 VLAN trunk 串接
SPAN 設定問題 🟡 可能 某些 switch SPAN 時會保留或額外加 VLAN encapsulation

兩種解法

方式 優點 缺點
✅ NPB 端關掉 Port Tagging 根源解決,下游設備不需額外處理 失去來源 port 識別能力
✅ RDS Defender 端解封裝 不需動 NPB 設定(已由原廠完成) 每台下游設備都要各自處理

如果只有一個 SPAN 來源,在 NPB 關掉 tagging 比較乾淨(沒有需要區分的對象)。多個來源時,則建議下游工具支援 Q-in-Q 解封裝。


如何從 tcpdump / Wireshark 判斷 Q-in-Q

遇到「流量有收到但工具沒反應」的狀況時,以下是從封包 dump 中找出 Q-in-Q 蛛絲馬跡的方法。

線索一:tcpdump -e 看到雙層 vlan 標記

tcpdump -i eth0 -e -c 20

正常單層 VLAN 的輸出:

14:23:01 aa:bb:cc:dd:ee:ff > 11:22:33:44:55:66, ethertype 802.1Q (0x8100), vlan 100, ... IP 10.0.1.5.443 > 10.0.1.10.52341: ...

Q-in-Q 的輸出 — 會看到兩個 vlan 關鍵字:

14:23:01 aa:bb:cc:dd:ee:ff > 11:22:33:44:55:66, ethertype 802.1Q (0x88a8), vlan 10, ... ethertype 802.1Q (0x8100), vlan 100, ... IP 10.0.1.5.443 > 10.0.1.10.52341: ...

🔍 關鍵判斷: 同一行出現兩次 vlan,或看到 EtherType 0x88a8,就是 Q-in-Q。

線索二:EtherType 0x88a8

# 專門過濾 Q-in-Q 封包
tcpdump -i eth0 -e ether proto 0x88a8 -c 5

如果有輸出,就確認存在 Q-in-Q 封包。沒輸出代表流量都是標準 802.1Q。

線索三:tcpdump 顯示的協議解析異常

當 tcpdump 沒有加 -e 時,Q-in-Q 封包可能出現異常症狀:

tcpdump -i eth0 -c 20
異常現象 說明
大量 ethertype 或 unknown protocol 解析器被多餘的 tag 搞混
IP 位址看起來不合理(如 0.0.0.0、亂碼) offset 錯位,把 VLAN tag 的 bytes 當成 IP 解析
封包長度異常偏大或偏小 長度欄位也被錯位解讀
看得到封包數量但幾乎全是 [|ip] 截斷 表示 IP header 解析失敗

🔍 經驗法則: 如果 tcpdump 能看到封包進來,但 IP 層資訊全是亂的,八成是有額外的封裝層。

線索四:Wireshark 分析

用 Wireshark 開啟 pcap 檔案後:

# 過濾 Q-in-Q 封包
vlan.double_tag == 1

# 或直接過濾外層 EtherType
eth.type == 0x88a8

在 Wireshark 的 Packet Details 面板中,Q-in-Q 封包會顯示:

Ethernet II
  └─ Type: 802.1ad (0x88a8)        ← 外層
802.1Q Virtual LAN (S-VLAN)
  └─ ID: 10                        ← NPB Port Tag
  └─ Type: 802.1Q (0x8100)         ← 內層
802.1Q Virtual LAN (C-VLAN)
  └─ ID: 100                       ← 原始 VLAN
Internet Protocol Version 4
  └─ Src: 10.0.1.5

🔍 關鍵判斷: 看到兩層 802.1Q Virtual LAN 就是 Q-in-Q。

線索五:hex dump 直接看

tcpdump -i eth0 -XX -c 3

正常 802.1Q 的 hex(從 byte 12 開始):

0x000c:  81 00 00 64 08 00 45 00 ...
         ^^^^       ^^^^ ^^^^
         8100       0800=IPv4
         VLAN tag

Q-in-Q 的 hex:

0x000c:  88 a8 00 0a 81 00 00 64 08 00 45 00 ...
         ^^^^       ^^^^       ^^^^ ^^^^
         88a8       8100       0800=IPv4
         外層S-VLAN  內層C-VLAN

🔍 關鍵判斷: byte 12-13 如果是 88 a8 而不是 81 00 或 08 00,就是 Q-in-Q。

快速排查 SOP

# Step 1: 先確認有沒有收到封包
tcpdump -i eth0 -c 5

# Step 2: 看 Ethernet header 和 VLAN 資訊
tcpdump -i eth0 -e -c 10

# Step 3: 專門找 Q-in-Q
tcpdump -i eth0 -e ether proto 0x88a8 -c 5

# Step 4: 如果要存 pcap 給 Wireshark 分析
tcpdump -i eth0 -w /tmp/mirror-check.pcap -c 1000

# Step 5: 統計 EtherType 分佈(需要 tshark)
tshark -r /tmp/mirror-check.pcap -T fields -e eth.type | sort | uniq -c | sort -rn

經驗教訓

  1. Mirror 流量不等於乾淨流量 — mirror port 忠實複製封包,包含所有 VLAN encapsulation
  2. NPB 可能是 Q-in-Q 的來源 — Port Tagging 是 NPB 常見功能,會在封包外面多加一層 VLAN tag
  3. POC 前先 dump 確認封包格式 — 花 5 分鐘跑 tcpdump -e 可以省掉幾天的排查時間
  4. 看到封包但工具沒反應 → 先懷疑封裝層 — IP 解析異常是最明顯的蛛絲馬跡