用Fortigate讓mDNS跨網段

參考文章

前陣子同事的客戶把網段切開來,然後呢?然後AirPrint就找不到了。

AirPrint跟Airplay還是Chromecast都使用mDNS也屬於Multicast,Mutlicast在網路環境中,只適合小範圍使用,像是個人或是家庭環境,只有一個網段,設備數也不多,就不會造成驚人影響。

Multicast預設也作用於一個VLAN中,不會跨網段。

因此,如果要跨網段,就需要特別手法,先撇除很少用的組播。讓多播跨網段有兩種方法:Multicast Forwarding、mDNS repeater。

Multicast Forwarding

簡單粗暴,把符合條件的Multicast,從A介面丟到B介面。

mDNS repeater

一種服務,當自己收到mDNS時,修改來源IP,內容不變,往另外一個介面丟。

在尋找服務時,客戶端會發出mDNS詢問,支援服務的設備會用mDNS回應。如果沒有詢問,支援服務的設備過一段時間也會用mDNS表達自己所支援的服務。

mDNS目的是用於發現,只要能收到,就可以看到從封包中看到Server的IP。

所以,重點是要讓客戶端可以收到Server的mDNS,這點使用Wireshark就能檢查。

如果要更快,客戶端的mDNS也要能到Server,這樣就能馬上建立連線。

如何在Fortigate上使用Mutlicast Forwarding

個人使用7.2.4版本 Fortigate 60E。

我的環境有兩區「internal」與「test」,這邊使用spotify做mDNS轉送功能的驗證,spotify有mDNS服務spotify_connect。

聲霸支援spotify_connect,所以只要我在「test」區域的電腦可以用spotify放音樂到「internal」的聲霸上就可以了。

利用Fortigate主控臺,輸入以下指令

config system settings
set multicast-forward enable
end

config firewall multicast-policy
edit 1
set srcintf "internal"
set dstintf "test"
set srcaddr "Soundbar"
set dstaddr "all"
next
edit 2
set srcintf "test"
set dstintf "internal"
set srcaddr "all"
set dstaddr "all"
next
end

第一條是限制只有聲霸的多播會轉送到test區域。第二條則是test區域所有裝置的mDNS都會送到internal區域。

藉此達到,在test區域設備一用mDNS問,轉送到internal區域,在internal區域的聲霸回應,又轉送回test區域,在test區域的設備接收到,就知道spotify可以投放的設備在哪個IP位置。非常及時。

實測也是如此。

雜談

關於mDNS服務的對策,各家都有一套,但是其本身設計就不適用於跨網段的場域,我仍不建議跨網段使用。

Sophos雖然也有Multicast Forwarding,但實測,只有SSDP能轉,最重要的mDNS卻轉不過去,但我也不懂為什麼。

Fortigate是看到某校園有mDNS大量洗,仔細看來源,Fortigate,原來如此。變成這次實作的可能選擇。

對於mDNS早就知道運作原理,但是卻沒有一個好用的解決方案,Aruba Airgroup用於無線環境很好用,但是碰上有線無線混合環境,就使不上力了。