Chr*_*ian 4 iptables multicast
我的防火墙配置的核心部分是:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
这似乎RELATED
不适用于多播响应:当主机发送到多播组(在我的例子中是 UPnP SSDP 发现,到 239.255.255.250:1900)时,来自特定 IP 地址的相应响应返回到发送者随机选择的端口被丢弃。
保留--state ESTABLISHED,RELATED
语义的正确方法是什么,但使响应匹配适用于多播?
Pal*_*ali 10
使用最新的 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
Run Code Online (Sandbox Code Playgroud)
第一个命令创建一个名为upnp的新 ipset ,它存储元组(ip 地址、ip 协议、ip 端口),并且每条插入的记录都会在 3 秒内过期。
第二个命令匹配传出的 UPnP SSDP 数据包(目标是 udp 端口 1900 上的多播地址 239.255.255.250)并将数据包的源 ip 地址和源 udp 端口存储到 ipset upnp 中。第一个关键字src表示源 ip 地址,第二个关键字src表示源端口作为hash:ip,port类型的 ipset总是需要这样的对。关键字--exists表示为现有记录重置计时器。此存储的记录将在 3 秒内自动删除。
第三个命令匹配传入的 udp 数据包,如果其目标地址和目标端口与 ipset upnp中的某些记录匹配,则该数据包被接受。语法dst,dst表示目的 IP 地址和目的端口。
UPnP 客户端通常将 udp 数据包发送到 239.255.255.250:1090 并等待 2 秒的响应。所以在 ipset 3 秒内自动过期就足够了。
我在互联网上没有发现任何用于 UPnP 客户端的防火墙/iptables 配置不是太放松(例如接受所有传入的 UDP 数据包)或没有一些用户空间跟踪或需要修补内核。因此,我希望这个例子对你有所帮助。
这就是多播的问题:netfilter 永远无法确定它是否相关。
因此,允许 UPnP SSDP 的唯一方法是:
-A INPUT -p udp --sport 1900 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
除现有ESTABLISHED,RELATED
规则外。