OSX mDNSResponder 在 Billion 上开放所有端口

OSX mDNSResponder 在 Billion 上开放所有端口

我最近将路由器换成了 Billion 7800VDOX,并注意到有人试图从外部地址连接我的 iMac。经过调查,我发现路由器上已打开一个 uPnP 端口,端口范围为 0-0(内部和外部)。经外部端口扫描器验证,这会导致路由器上的所有端口号都打开并指向 iMac。我删除了映射并运行了 Wireshark,并在映射恢复的同时捕获了一个外部地址请求。

Frame 496: 102 bytes on wire (816 bits), 102 bytes captured (816 bits) on interface 0
Ethernet II, Src: Apple_d0:7e:eb (d4:9a:20:d0:7e:eb), Dst: BillionE_cb:49:27 (00:04:ed:cb:49:27)
Internet Protocol Version 4, Src: 192.168.1.131, Dst: 192.168.1.254
User Datagram Protocol, Src Port: 5353 (5353), Dst Port: 5351 (5351)
Source Port: 5353
Destination Port: 5351
Length: 68
Checksum: 0x8527 [validation disabled]
[Stream index: 0]
Port Control Protocol, Map Request
Version: 2
0... .... = R: Request
.000 0001 = Opcode: Map (1)
Reserved: 0
Requested Lifetime: 7200
Client IP Address: ::ffff:192.168.1.131
Map Request
    Mapping Nonce: f88237920f8cd6c0a3765f39
    Protocol: 6
    Reserved: 0
    Internal Port: 9
    Suggested External Port: 0
    Suggested External IP Address: ::ffff:xxx.181.81.112

在此之前,有一个 SOAP 请求用于获取路由器的外部 IP 地址。使用 lsof 检查源端口 (5353) 后,我发现它属于 mDNSResponder。

我对所发生情况的假设是,mDNSResponder 使用它只是为了获取路由器的外部 IP 地址,并使用一个本应无害的请求来映射端口 0,而端口 0 应该是无效端口。然而,Billion 路由器将此视为打开所有端口的请求,无论是设计错误还是编程错误。关闭路由器上的 uPnP 可以解决问题(尽管正如指出的那样,这实际上不是 uPnP。)

有人还有其他建议吗?

答案1

您捕获的数据包显示了端口控制协议 (PCP:IETF 标准轨道 NAT-PMP 的后继者) 端口映射请求。请求映射的客户端端口为 9/TCP。客户端对外部端口应该是什么没有任何建议,因此它将建议的外部端口字段设置为零。定义 PCP 的 IETF RFC 6887 明确指出,零表示此字段中的“无建议”。

我认为为这个 Billion 路由器实施 PCP 的人误读了 RFC。您会看到,在某些非常有限且定义明确的情况下,OTHER 端口字段中的零可能表示“所有端口”。例如,当此映射请求的请求生存期为零时,零客户端端口将意味着“删除此客户端 IP 地址上所有端口的所有映射”。

但同样,在建议的外部端口字段中,零始终意味着“无建议”。它永远不会意味着此字段中的“所有端口”。

因此,很明显您在这台 Billion 路由器中发现了 PCP 错误。

这里还有一件奇怪的事情是客户端端口。传统上,9/TCP 是discard服务的端口,但该discard服务已被弃用,所以我不确定还有谁在运行它,或者为什么任何东西都会请求它的端口映射。

至于 mDNSResponder 为什么要发送这些请求,原因很简单,因为 mDNSResponder 除了通常的 mDNS、DNS-SD 和 DNS 解析器职责外,还充当 macOS 上的 PCP/NAT-PMP/UPnP 守护进程。当 macOS 上的任何进程触发系统向路由器请求端口映射时,mDNSResponder 的工作始终是创建和发送实际的端口映射请求数据包。

相关内容