技術分享
FortiGate 跨 VLAN AirPlay / mDNS 設定:找得到裝置但沒聲音的處理方式
跨 VLAN AirPlay 常見問題不是只有「看不到裝置」,也包含「找得到 AirPlay 裝置但沒有聲音」。關鍵在於同時處理 mDNS / Bonjour 發現、AirPlay 播放連線,以及 AirPlay 2 的 PTP time sync。
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 設計,應依實際架構規劃。

