Multicast

iptables 中多播響應的狀態匹配

  • May 8, 2018

我的防火牆配置的核心部分是:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

似乎這RELATED不適用於多播響應:當主機發送到多播組(在我的情況下是 UPnP SSDP 發現,到 239.255.255.250:1900)時,來自特定 IP 地址的相應響應會返回到發送者的隨機選擇的埠被丟棄。

--state ESTABLISHED,RELATED保留語義但使響應匹配對多播起作用的正確方法是什麼?

這就是多播的問題:netfilter 永遠無法確定它是否相關。

因此,您可以允許 UPnP SSDP 的唯一方法是:

-A INPUT -p udp --sport 1900 -j ACCEPT

除了現有的ESTABLISHED,RELATED規則。

對於最近的 Linux 核心 (>= 2.6.39),您可以使用核心的 ipset 來解決連接跟踪的限制。您不需要編寫任何使用者空間或核心幫助程序。對於 UPnP SSDP,它可以寫成:

$ ipset create upnp hash:ip,port timeout 3
$ iptables -A OUTPUT -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j SET --add-set upnp src,src --exist
$ iptables -A INPUT -p udp -m set --match-set upnp dst,dst -j ACCEPT

第一個命令創建一個名為upnp的新 ipset ,它儲存元組(ip 地址、ip 協議、ip 埠),每條插入的記錄在 3 秒內過期。

第二個命令匹配傳出的 UPnP SSDP 數據包(目標是 udp 埠​​ 1900 上的多播地址 239.255.255.250)並將數據包的源 ip 地址源 udp 埠​​儲存到 ipset upnp中。第一個關鍵字src表示源 ip 地址,第二個關鍵字src表示源埠作為類型為hash:ip 的 ipset,port總是需要這樣的對。關鍵字*–exists*表示對現有記錄進行計時器重置。此儲存記錄會在 3 秒內自動刪除。

第三個命令匹配傳入的 udp 數據包,如果其目標地址和目標埠與 ipset upnp中的某些記錄匹配,則接受該數據包。語法dst,dst表示目標 ip 地址目標埠

UPnP 客戶端通常將 udp 數據包發送到 239.255.255.250:1090 並等待 2 秒的響應。所以 ipset 中的 3 秒自動過期就足夠了。

我沒有在網際網路上找到任何用於 UPnP 客戶端的有效防火牆/iptables 配置,這些配置不太放鬆(例如,接受所有傳入的 UDP 數據包)或沒有一些使用者空間跟踪或需要修補核心。因此,我希望這個範例對您有所幫助。

引用自:https://serverfault.com/questions/250797