我最近将路由器换成了 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 的工作始终是创建和发送实际的端口映射请求数据包。