homelab-vlan-segmentation

homelab-vlan-segmentation

熱門

使用 UniFi、pfSense/OPNsense 和 MikroTik 將家用網路劃分成不同 VLAN,以隔離 IoT、訪客、信任裝置及伺服器流量——包含交換器 Trunk 埠設定、防火牆規則與無線 SSID 對應。

24萬星標
3.6萬分支
更新於 2026/8/4
SKILL.md
唯讀
名稱
homelab-vlan-segmentation
描述

使用 UniFi、pfSense/OPNsense 和 MikroTik 將家用網路劃分成不同 VLAN,以隔離 IoT、訪客、信任裝置及伺服器流量——包含交換器 Trunk 埠設定、防火牆規則與無線 SSID 對應。

Homelab VLAN Segmentation

如何將家用網路劃分成相互隔離的 VLAN,避免 IoT 裝置、訪客與主要電腦互相通訊。這是家用網路效益最高的資安升級做法。

本文展示的所有防火牆規則皆旨在加強網段間的隔離,不會移除現有的防護機制。請在維護時段進行變更,並在每完成一步後驗證網段間的連線能力,再繼續進行下一步。

使用時機

  • 首次在家用網路設定 VLAN 時
  • 將 IoT 裝置(智慧燈泡、網路攝影機、電視)與信任裝置隔離
  • 建立無法存取家中的訪客 Wi-Fi 網路
  • 向不熟悉 VLAN 概念的人解釋其運作方式
  • 設定 Trunk 埠、Access 埠以及 SSID 與 VLAN 的映射對應
  • 在 pfSense/OPNsense/UniFi 上排除 VLAN 間路由或防火牆規則的故障

運作原理

未劃分 VLAN — 扁平化網路:
  所有裝置皆在 192.168.1.0/24
  智慧電視(可能含有惡意軟體)→ 可存取您的 NAS、電腦及所有裝置

劃分 VLAN 後:
  VLAN 10 — Trusted    192.168.10.0/24  (電腦、手機、筆電)
  VLAN 20 — IoT        192.168.20.0/24  (智慧電視、燈泡、攝影機)
  VLAN 30 — Servers    192.168.30.0/24  (NAS、樹莓派、虛擬機器)
  VLAN 40 — Guest      192.168.40.0/24  (訪客 Wi-Fi)
  VLAN 99 — Management 192.168.99.0/24  (交換器/AP 的 Web UI)

  智慧電視 → 被封鎖,無法存取 192.168.10.0/24 與 192.168.30.0/24
  訪客 → 僅能存取網際網路,無法看見任何家用裝置

VLAN 設計範本

VLAN  名稱        子網路              閘道器          用途
10    trusted     192.168.10.0/24     192.168.10.1    電腦、手機、筆電
20    iot         192.168.20.0/24     192.168.20.1    智慧家居裝置
30    servers     192.168.30.0/24     192.168.30.1    NAS、樹莓派、自架服務
40    guest       192.168.40.0/24     192.168.40.1    訪客 Wi-Fi
99    management  192.168.99.0/24     192.168.99.1    網路設備 Web 管理介面

範例

搭配 UniFi AP 與網管型交換器的典型 Homelab 範例:

情境:三房住宅,UniFi Dream Machine + UniFi 8 埠交換器 + 2 台 AP

VLAN 10 — Trusted    192.168.10.0/24   MacBook、iPhone、iPad
VLAN 20 — IoT        192.168.20.0/24   Nest 溫控器、Philips Hue、Ring 門鈴、智慧電視
VLAN 30 — Servers    192.168.30.0/24   Synology NAS (192.168.30.10)、Pi-hole (192.168.30.2)
VLAN 40 — Guest      192.168.40.0/24   訪客 Wi-Fi — 僅限網際網路

SSID → VLAN 對應:
  "Home"      → VLAN 10 (WPA2,強密碼,僅限信任裝置)
  "IoT"       → VLAN 20 (WPA2,獨立密碼,印於路由器上方便設定)
  "Guest"     → VLAN 40 (WPA2,簡單密碼,可自由分享)

交換器連接埠行為:
  Port 1  → 連接路由器的 Trunk 埠(Tagged VLANs 10,20,30,40,99)
  Port 2  → 連接 AP 的 Trunk 埠(Tagged VLANs 10,20,40;由 AP 處理各 SSID 的 Tagging)
  Port 3  → Access VLAN 30(NAS — Untagged,無須支援 VLAN)
  Port 4  → Access VLAN 30(Pi-hole — Untagged)
  Port 5–8 → Access VLAN 10(有線工作站)

已套用的防火牆規則(皆為增強隔離,不影響既有防護):
  IoT → Trusted: BLOCK
  IoT → Servers: BLOCK(192.168.30.2:53 除外,允許 Pi-hole DNS)
  IoT → Internet: ALLOW
  Guest → Local networks: BLOCK
  Guest → Internet: ALLOW
  Trusted → everywhere: ALLOW

UniFi 設定

在 UniFi Controller 中建立網路

Settings → Networks → Create New Network

針對每個 VLAN:
  Name: IoT
  Purpose: Corporate  (提供 DHCP + 路由)
  VLAN ID: 20
  Network: 192.168.20.0/24
  Gateway IP: 192.168.20.1
  DHCP: Enable
  DHCP Range: 192.168.20.100 – 192.168.20.254

將 SSID 對應至 VLAN (UniFi)

Settings → WiFi → Create New WiFi

  Name: IoT-Network
  Password: <獨立密碼>
  Network: IoT  ← 在此選擇您的 VLAN
  # 所有連接至此 SSID 的裝置都會分配到 VLAN 20

  Name: Guest
  Password: <訪客密碼>
  Network: Guest
  Guest Policy: Enable  ← 同時隔離訪客彼此之間的連線

UniFi 防火牆規則 (Traffic Rules)

Settings → Traffic & Security → Traffic Rules

# 封鎖 IoT 存取 Trusted VLAN
  Action: Block
  Category: Local Network
  Source: IoT (192.168.20.0/24)
  Destination: Trusted (192.168.10.0/24)

# 僅允許 IoT 存取網際網路
  Action: Allow
  Source: IoT
  Destination: Internet

# 封鎖訪客存取所有區域網路
  Action: Block
  Source: Guest
  Destination: Local Networks

pfSense / OPNsense 設定

建立 VLAN

Interfaces → Assignments → VLANs → Add

  Parent Interface: em1  (您的 LAN 網卡)
  VLAN Tag: 20
  Description: IoT

# 針對每個 VLAN 重複上述步驟,然後將每個 VLAN 分配給一個介面:
Interfaces → Assignments → Add
  選擇您建立的 VLAN → 點擊 Add
  啟用該介面,並將 IP 設定為閘道器位址 (192.168.20.1/24)

每個 VLAN 的 DHCP 設定

Services → DHCP Server → 選擇您的 VLAN 介面

  Enable DHCP
  Range: 192.168.20.100 至 192.168.20.254
  DNS Servers: 192.168.30.2  ← 若有設定 Pi-hole 請填入其 IP

防火牆規則 (pfSense/OPNsense)

# 規則會由上至下依序比對,符合第一條即生效。

# 在 IoT 介面 (VLAN 20) 上:
  規則 1:允許 IoT → Pi-hole DNS  ← 必須放在 RFC1918 封鎖規則之前
    Protocol: UDP/TCP
    Source: IoT net
    Destination: 192.168.30.2 port 53
    Action: Allow

  規則 2:封鎖 IoT → RFC1918 (所有私有 IP 區段)
    Protocol: any
    Source: IoT net
    Destination: RFC1918  (192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12)
    Action: Block

  規則 3:允許 IoT → 網際網路
    Protocol: any
    Source: IoT net
    Destination: any
    Action: Allow

# 在 Trusted 介面 (VLAN 10) 上:
  允許所有連線 (信任裝置可存取任何地方)
    Source: Trusted net
    Destination: any
    Action: Allow

# 針對需要特定區域服務的 IoT 裝置設定額外例外情況:
  插入至規則 2 (RFC1918 封鎖) 之前:
    Protocol: TCP
    Source: IoT net
    Destination: 192.168.30.x port 8123  ← Home Assistant
    Action: Allow

MikroTik 設定

# 步驟 1:建立 Bridge 並啟用 VLAN 過濾
/interface bridge
add name=bridge vlan-filtering=yes

# 步驟 2:將實體連接埠新增至 Bridge
# 上行路由器 / Trunk 埠(所有 VLAN 皆帶 Tag)
/interface bridge port
add bridge=bridge interface=ether1 frame-types=admit-only-vlan-tagged

# 信任裝置的 Access 埠(Untagged VLAN 10)
/interface bridge port
add bridge=bridge interface=ether2 pvid=10 frame-types=admit-only-untagged-and-priority-tagged

# IoT 裝置的 Access 埠(Untagged VLAN 20)
/interface bridge port
add bridge=bridge interface=ether3 pvid=20 frame-types=admit-only-untagged-and-priority-tagged

# 步驟 3:定義哪些連接埠允許哪些 VLAN 通過
/interface bridge vlan
add bridge=bridge tagged=ether1 untagged=ether2 vlan-ids=10
add bridge=bridge tagged=ether1 untagged=ether3 vlan-ids=20

# 步驟 4:在 Bridge 上建立 VLAN 介面(閘道器 IP)
/interface vlan
add interface=bridge name=vlan10 vlan-id=10
add interface=bridge name=vlan20 vlan-id=20

# 步驟 5:分配閘道器 IP
/ip address
add interface=vlan10 address=192.168.10.1/24
add interface=vlan20 address=192.168.20.1/24

# 步驟 6:設定 DHCP 位址池與伺服器
/ip pool
add name=pool-trusted ranges=192.168.10.100-192.168.10.254
add name=pool-iot ranges=192.168.20.100-192.168.20.254

/ip dhcp-server
add interface=vlan10 address-pool=pool-trusted name=dhcp-trusted
add interface=vlan20 address-pool=pool-iot name=dhcp-iot

/ip dhcp-server network
add address=192.168.10.0/24 gateway=192.168.10.1
add address=192.168.20.0/24 gateway=192.168.20.1

# 步驟 7:防火牆 — 封鎖 IoT 存取 Trusted VLAN
/ip firewall filter
add chain=forward src-address=192.168.20.0/24 dst-address=192.168.10.0/24 \
    action=drop comment="Block IoT to Trusted"

交換器 Trunk 埠 vs Access 埠

# Trunk 埠:傳送多個 VLAN 流量(Tagged)— 用於連接「交換器對交換器」、「交換器對路由器」、「交換器對 AP」
# Access 埠:僅傳送單一 VLAN 流量(Untagged)— 用於連接終端裝置(電腦、攝影機、NAS)

# 連接至路由器的網管型交換器連接埠應設定為 Trunk:
  允許的 VLAN:10, 20, 30, 40, 99

# 連接至電腦的連接埠應設定為 Access 埠:
  VLAN:10 (trusted)
  不加 Tag — 電腦不需要也不需理解 VLAN

# 連接至 AP 的連接埠必須設定為 Trunk:
  AP 會為來自各 SSID 的流量加上正確的 VLAN ID Tag
  允許的 VLAN:10, 20, 40(視 AP 提供的 SSID 而定)

反模式(應避免的做法)

# 錯誤:建立 VLAN 但未新增防火牆規則
# 缺乏防火牆規則的 VLAN 無法提供安全性 — VLAN 間路由預設是完全開放的
# 正確:建立 VLAN 後立即新增明確的封鎖規則

# 錯誤:將 Pi-hole 放在 IoT VLAN 中
# IoT 裝置可存取,但信任裝置無法存取(除非設定額外規則)
# 正確:將 Pi-hole 放在 Servers VLAN 中,並新增規則允許所有 VLAN 存取 53 埠

# 錯誤:原生 VLAN (Native VLAN) 等於管理 VLAN (Management VLAN)
# 未帶 Tag 的流量落入管理 VLAN 會引發 VLAN 跳躍 (VLAN hopping) 攻擊風險
# 正確:使用專用且未使用的 VLAN 作為 Native VLAN(例如 VLAN 999),並保持管理流量帶有 Tag

# 錯誤:IoT SSID 與信任 SSID 使用相同的 Wi-Fi 密碼
# 任何取得密碼的人都可能將 IoT 裝置連接到錯誤的網段

最佳做法

  • 建議先從 4 個 VLAN 開始:Trusted、IoT、Servers、Guest — 後續再依需求擴充
  • 將 Pi-hole 放在 Servers VLAN (192.168.30.x)
  • 新增一條防火牆規則,允許所有 VLAN 存取 Pi-hole IP 的 DNS (53 埠) — 且該規則必須放在任何 RFC1918 封鎖規則之前
  • 每變更一次規則即測試隔離效果:從 IoT VLAN 嘗試 ping 信任裝置 — 應無法 ping 通
  • 使用獨立的管理 VLAN 管理交換器與 AP 的 Web UI,並限制僅能從 Trusted VLAN 存取
  • 將您的 VLAN 設計記錄在表格中(包含 VLAN ID、名稱、子網路、用途)

相關 Skill

  • homelab-network-setup
  • homelab-pihole-dns
  • homelab-wireguard-vpn