我正在使用 Fedora 15 和 Transmission BT 客户端。除非禁用防火墙,否则传输无法打开端口。
我搜索了一些帖子,说将 1900 添加到受信任端口,或通过 iptable 规则:-A INPUT -m state --state NEW -m udp -p udp --sport 1900 -j ACCEPT"
。但是,Transmission 无论如何都无法打开端口。
我也用 进行了测试upnp-inspector
,它比 Transmission 更好,在将 1900 添加到受信任端口后,它可以检测到我的 upnp 路由器,但检测速度比禁用防火墙慢。
关于如何让 Transmission UPnP 与防火墙配合使用有什么想法吗?
答案1
您需要了解的第一件事是 UPnP IGD 协议是如何工作的。您选择随机本地 UDP 端口,然后从中向众所周知的多播地址 239.255.255.250 和 UDP 端口 1900 发送发现请求。UPnP IGD 服务器(在您的路由器上运行)侦听这些多播查询并向您发送随机的单播 UDP 回复选择您的 IP 地址的端口以及发送发现请求的端口。但是这样的回复不会被 conntrack iptables 模块与您发送的请求配对,因此,收到的回复会被 iptables 丢弃。这就是启用所有 UDP 端口或禁用防火墙有帮助的原因。在该 UDP 回复中,您的 UPnP IGD 服务器和客户端的位置,然后与 UPnP IGD 服务器建立经典 TCP 连接。因此,唯一的问题是如何编写接收对该多播发现请求的 UDP 回复的规则。
通过 ipset 是可以的。我在回答中描述了它https://serverfault.com/a/911286:
$ 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
在 IPv6 中,UPnP 数据包发送到多播地址 ff02::c 或 ff05::c。所以规则看起来像:
$ ipset create upnp6 hash:ip,port timeout 3 family inet6
$ ip6tables -A OUTPUT -d ff02::c/128 -p udp -m udp --dport 1900 -j SET --add-set upnp6 src,src --exist
$ ip6tables -A OUTPUT -d ff05::c/128 -p udp -m udp --dport 1900 -j SET --add-set upnp6 src,src --exist
$ ip6tables -A INPUT -p udp -m set --match-set upnp6 dst,dst -j ACCEPT
一些 UPnP 服务器(但不是全部)定期(例如每 30 秒)通过多播 UDP 数据包向众所周知的地址/端口宣告自己。如果您有这样的服务器以及正在侦听这些多播数据包的客户端,那么 iptables 规则非常简单:
$ iptables -A INPUT -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j ACCEPT
IPv6 的等效项:
$ ip6tables -A INPUT -d ff02::c/128 -p udp -m udp --dport 1900 -j ACCEPT
$ ip6tables -A INPUT -d ff05::c/128 -p udp -m udp --dport 1900 -j ACCEPT
在您的问题中,您描述了类似于上述 iptables 规则的内容,但您犯了一个大错误:您指定了来源端口,而不是目的地: 。 UPnP UDP 数据包从随机源端口发送到固定目标端口 1900。--sport 1900
您还描述了在将端口 1900 添加到可信端口(可能是源和目标)后,upnp-inspector 可以检测您的 UPnP IGD 路由器,但由于禁用防火墙,速度较慢。这完全符合上面对定期公告的描述,因为当您的路由器发送下一个公告数据包时,upnp-inspector 正在等待。
答案2
我找到了一个比禁用防火墙稍微安全的方法,即允许端口范围从10000到59999。并且不需要打开1900。