OSX mDNSResponderがBillionで全ポートを開放

OSX mDNSResponderがBillionで全ポートを開放

最近、ルーターを Billion 7800VDOX に交換したところ、外部アドレスから iMac への接続がいくつか試みられていることに気付きました。調査したところ、ルーターのポート範囲 0-0 (内部および外部) で uPnP ポートが開かれていることがわかりました。外部ポート スキャナーで確認したところ、ルーターのすべてのポート番号が開かれ、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

これに先立って、ルーターの外部 IP アドレスを取得するための SOAP 要求が行われました。lsof を使用して送信元ポート (5353) を確認すると、そのポートが mDNSResponder によって所有されていることがわかりました。

何が起こっているのかという私の推測は、mDNSResponder がこれをルーターの外部 IP アドレスを取得するためだけに使用し、ポート 0 をマップする無害な要求を使用してこれを実行しているということです。ポート 0 は無効なポートであるはずです。しかし、Billion ルーターは、設計またはプログラミング エラーにより、これをすべてのポートを開く要求として処理しています。ルーターで uPnP をオフにすると、問題は解決します (指摘されているように、これは実際には uPnP ではありませんが)。

他に何か提案はありますか?

答え1

キャプチャしたパケットには、ポート制御プロトコル (PCP: NAT-PMP の IETF 標準トラックの後継) のポート マッピング要求が示されています。要求されたマッピングのクライアント ポートは 9/TCP です。クライアントは外部ポートが何であるべきかについて提案を持っていないため、提案された外部ポート フィールドは 0 に設定されています。PCP を定義する IETF RFC 6887 では、このフィールドで 0 は「提案なし」を意味することが明確にされています。

この Billion ルーターに PCP を実装した人は、RFC を誤解したと思います。非常に限定的で明確に定義されたケースでは、OTHER ポート フィールドのゼロは「すべてのポート」を意味する場合があります。たとえば、このマッピング要求の要求された有効期間がゼロの場合、クライアント ポートがゼロであれば、「このクライアント IP アドレスのすべてのポートのすべてのマッピングを削除する」という意味になります。

ただし、提案された外部ポート フィールドでは、ゼロは常に「提案なし」を意味します。このフィールドでは、ゼロが「すべてのポート」を意味することはありません。

つまり、この Billion ルーターに PCP のバグが見つかったことは明らかです。

ここでもう 1 つ奇妙なのは、クライアント ポートです。従来、9/TCP がdiscardサービスのポートでしたが、このdiscardサービスは廃止されたため、誰がこのサービスを実行しているのか、また、なぜポート マッピングを要求するのかはわかりません。

mDNSResponder がこれらのリクエストを送信する理由は、mDNSResponder が通常の mDNS、DNS-SD、および DNS リゾルバの役割に加えて、macOS 上で PCP/NAT-PMP/UPnP デーモンとして機能するためです。macOS 上のいずれかのプロセスがシステムをトリガーしてルーターにポート マッピングを要求すると、実際のポート マッピング リクエスト パケットを作成して送信するのは常に mDNSResponder の役割です。

関連情報