Server Plus 伺服器智選館

技術分享

FortiGate 跨 VLAN AirPlay / mDNS 設定:找得到裝置但沒聲音的處理方式

跨 VLAN AirPlay 常見問題不是只有「看不到裝置」,也包含「找得到 AirPlay 裝置但沒有聲音」。關鍵在於同時處理 mDNS / Bonjour 發現、AirPlay 播放連線,以及 AirPlay 2 的 PTP time sync。

6 分鐘閱讀Server Plus
FortiGateAirPlaymDNSBonjourIoT VLAN

AirPlay 接收端放在 IoT VLAN、電腦或手機在 trusted LAN 時,跨 VLAN 播放不只需要 mDNS / Bonjour 發現,也需要 AirPlay 播放流量與 AirPlay 2 PTP time sync。本文整理 FortiGate 80F / FortiOS 7.2.11 的 multicast forwarding、policy 設計與排錯方式。

資料來源:Server Plus 技術筆記 · 2026-07-11

環境與問題

這類場景常出現在企業或家庭辦公室網路:電腦、手機位於 trusted LAN,AirPlay 音箱、Apple TV 或智慧家庭設備放在 IoT VLAN。安全上希望 IoT 不要任意存取重要電腦,但使用者仍需要從 trusted LAN 投放 AirPlay。

一開始通常是跨 VLAN 看不到 AirPlay 裝置;mDNS 打通後,又可能遇到「裝置找得到,但播放沒有聲音」的狀況。這代表 Bonjour discovery 已經部分運作,但實際播放或時間同步流量仍被 policy 擋住。

  • Firewall:FortiGate 80F
  • FortiOS:7.2.11
  • 使用者端:USER-LAN
  • AirPlay / IoT 設備:IOT-AIRPLAY
  • AirPlay 接收端位於 IoT VLAN

AirPlay 跨 VLAN 需要兩類流量

AirPlay 跨 VLAN 不是只放行一條 TCP port 就能解決。第一類是裝置發現,也就是 mDNS / Bonjour;第二類是實際播放、控制與時間同步流量。

mDNS 使用 UDP 5353 與 224.0.0.251 multicast address。AirPlay 播放會使用多個 TCP / UDP port,AirPlay 2 另外依賴 UDP 319 / 320 做 PTP time sync。若只處理 mDNS,使用者可能看得到裝置,但播放時沒有聲音。

  • 裝置發現:mDNS / Bonjour,UDP 5353 -> 224.0.0.251
  • 播放與控制:AirPlay TCP / UDP services
  • 時間同步:AirPlay 2 PTP,UDP 319 / 320

啟用 multicast forwarding

在 FortiGate 80F / FortiOS 7.2.11 上,若環境沒有可用的通用 Bonjour Gateway 設定,可以用 multicast forwarding 搭配 multicast-policy 讓 mDNS 在指定 VLAN 之間轉送。

這個做法的重點不是打開 IoT VLAN 到 trusted LAN 的全部流量,而是只讓 mDNS discovery 與 AirPlay 所需流量通過,並保留 IoT VLAN 的安全邊界。

config system settings
    set multicast-forward enable
    set multicast-ttl-notchange enable
end

config firewall multicast-address
    edit "Bonjour"
        set start-ip 224.0.0.251
        set end-ip 224.0.0.251
    next
end

建立 AirPlay service

接著建立 AirPlay 相關 service。TCP / UDP 播放連線依設備與版本可能使用不同 port,實務上會將 AirPlay 常見控制與播放範圍整理成 service group。PTP UDP 319 / 320 另外獨立成 service,方便做反向最小權限 policy。

config firewall service custom
    edit "AirPlay-TCP"
        set tcp-portrange 80 443 554 3689 5000 6000 7000 7001 7100 49152-65535
    next
    edit "AirPlay-UDP"
        set udp-portrange 319-320 5353 49152-65535
    next
    edit "AirPlay-PTP"
        set udp-portrange 319-320
    next
end

config firewall service group
    edit "AirPlay-Services"
        set member "AirPlay-TCP" "AirPlay-UDP"
    next
end

建立 mDNS multicast policy

mDNS 需要雙向 multicast-policy。USER-LAN 需要能查詢 IOT-AIRPLAY 內的 AirPlay 接收端;IOT-AIRPLAY 也需要能回應 Bonjour announcement。這裡只處理 UDP 5353 與 224.0.0.251,不代表放通兩個 VLAN 的一般 unicast 流量。

config firewall multicast-policy
    edit 1
        set name "mDNS_user_to_iot"
        set logtraffic enable
        set srcintf "USER-LAN"
        set dstintf "IOT-AIRPLAY"
        set srcaddr "USER-LAN address"
        set dstaddr "Bonjour"
        set protocol 17
        set start-port 5353
        set end-port 5353
    next
    edit 2
        set name "mDNS_iot_to_user"
        set logtraffic enable
        set srcintf "IOT-AIRPLAY"
        set dstintf "USER-LAN"
        set srcaddr "IOT-AIRPLAY address"
        set dstaddr "Bonjour"
        set protocol 17
        set start-port 5353
        set end-port 5353
    next
end

建立 AirPlay 與 PTP policy

trusted LAN 到 IoT VLAN 可以允許 AirPlay 所需 service,讓使用者端能連到 AirPlay 接收端。反方向不要開 ALL,只允許 AirPlay 2 PTP time sync 所需的 UDP 319 / 320。

這樣可以讓 AirPlay 2 的時間同步通過,同時維持 IoT VLAN 不可任意連回重要電腦的安全邊界。

config firewall policy
    edit 0
        set name "user_to_iot_airplay"
        set srcintf "USER-LAN"
        set dstintf "IOT-AIRPLAY"
        set action accept
        set srcaddr "USER-LAN address"
        set dstaddr "IOT-AIRPLAY address"
        set schedule "always"
        set service "AirPlay-Services"
        set logtraffic all
        set nat disable
    next
    edit 0
        set name "iot_airplay_ptp_to_user"
        set srcintf "IOT-AIRPLAY"
        set dstintf "USER-LAN"
        set action accept
        set srcaddr "IOT-AIRPLAY address"
        set dstaddr "USER-LAN address"
        set schedule "always"
        set service "AirPlay-PTP"
        set logtraffic all
        set nat disable
    next
end

安全邊界設計

這個架構的安全重點,是不要為了 AirPlay 方便而打開 IOT-AIRPLAY -> USER-LAN / ALL。IoT VLAN 回 trusted LAN 只需要 UDP 319 / 320 給 AirPlay 2 PTP time sync,其餘連線維持 implicit deny。

換句話說,USER-LAN 可以主動控制 AirPlay 裝置;IoT VLAN 不應取得對重要電腦的任意存取能力。

  • USER-LAN -> IOT-AIRPLAY:允許 AirPlay 所需 service
  • IOT-AIRPLAY -> USER-LAN:只允許 UDP 319 / 320
  • 不要建立 IOT-AIRPLAY -> USER-LAN / ALL policy
  • mDNS multicast-policy 只處理 Bonjour discovery

排錯指令

排錯時先確認 mDNS 是否真的跨 VLAN,再看特定 AirPlay 裝置的 flow。若 debug 顯示 UDP 319 / 320 被 policy 0 擋下,通常就是缺少 IoT VLAN 回 trusted LAN 的 PTP policy。

diagnose sniffer packet any 'host 224.0.0.251 and udp port 5353' 4 0 a

diagnose debug reset
diagnose debug flow filter addr <AirPlay_Device_IP>
diagnose debug flow show function-name enable
diagnose debug flow show iprope enable
diagnose debug flow trace start 100
diagnose debug enable

# stop debug
diagnose debug disable
diagnose debug reset

常見現象

看不到 AirPlay 裝置時,先檢查 UDP 5353 / 224.0.0.251 是否有被 multicast-policy 雙向處理,並確認 multicast-forward 與 multicast-ttl-notchange 是否啟用。

找得到裝置但沒有聲音時,重點檢查 AirPlay service 是否完整,以及 IoT VLAN 回 trusted LAN 的 UDP 319 / 320 是否被允許。這個流量是 AirPlay 2 time sync 所需,不等於開放 IoT 裝置存取內部電腦。

  • 看不到裝置:檢查 mDNS、multicast forwarding、multicast-policy
  • 找得到但沒聲音:檢查 AirPlay ports 與 UDP 319 / 320
  • debug 顯示 policy 0 denied:補上 IOT-AIRPLAY -> USER-LAN 的 PTP policy

相關服務

FAQ

常見問題

為什麼 mDNS 通了還是沒有聲音?

mDNS 只負責發現裝置。AirPlay 實際播放仍需要 TCP / UDP 播放連線,AirPlay 2 還需要 UDP 319 / 320 做 PTP time sync。缺少 PTP policy 時,就可能找得到裝置但沒有聲音。

IoT VLAN 需要開回 trusted LAN 嗎?

不需要開 ALL。這個場景只建議讓 IOT-AIRPLAY 回 USER-LAN 的 UDP 319 / 320 通過,其他 IoT 到 trusted LAN 的流量維持 deny。

這個設定等於正式 Bonjour Gateway 嗎?

不是。這是 FortiGate multicast forwarding 搭配 multicast-policy 的做法,用來處理指定 VLAN 之間的 mDNS discovery。若環境有正式 Bonjour Gateway 或更完整的 service discovery 設計,應依實際架構規劃。