KUSONEKOの見る世界

プッシュ通知をネットワーク管理者目線で考える

多くのAndroidやiPhoneのアプリで利用されているプッシュ通知ですが、Wi-Fiに接続したときに通知が来なくなるという現象に出くわしたことはないでしょうか。

その原因の一つとして考えられるのが、セッションのタイムアウトです。

今回、プッシュ通知についてネットワーク管理者目線で考えてみます。

プッシュ通知

仕組み

プッシュ通知は、即時通知のために使われる物です。

Androidでは、FCM(Firebase Cloud Messaging)、iPhoneではAPNs(Apple Push Notification service)と常時セッションを張っています。
(iPhoneでFCMを使用することもできるようです)

そして、サービスを提供しているサーバ(Provider)が端末に通知をしたい場合、サーバがFCM/APNsにメッセージを送信し、FCM/APNsが端末との間に張っているセッションを利用し、プッシュ通知を行っています。

この端末とFCM/APNs間のセッションが切れない限り、プッシュ通知は受け取れるはずです。

使用ポート番号

この時に使われるポート番号が以下の通りで、ネットワーク機器では、これらのポート番号の通信を許可するようにします。

Android

  • Android→FCM
    TCP 5228~5230、443
    ※443はフォールバック用のポートだと思われます。
  • Provider→FCM
    TCP 5228~5230、443

iPhone

  • iPhone→APNs
    TCP 5223、(443はフォールバック用で、Deep SSLインスペクションは不可)
  • Provider→APNs
    TCP 443、2197

通信先IPアドレス

FCM/APNsのIPアドレスは公開されていますが、FMCの方は量が多く頻繁に変わるようなので、ネットワーク機器に設定するのは困難でしょう。

Android(FMC)

  • https://www.gstatic.com/ipranges/goog.json

iPhone(APNs)

  • 17.249.0.0/16
  • 17.252.0.0/16
  • 17.57.144.0/22
  • 17.188.128.0/18
  • 17.188.20.0/23
  • 2620:149:a44::/48
  • 2403:300:a42::/48
  • 2403:300:a51::/48
  • 2a01:b740:a42::/48

端末のkeepalive間隔

Android/iPhoneとFCM/APNsのセッション維持のため、一定間隔でキープアライブパケットが送受信されています。

この間隔よりも早く、ネットワーク機器がセッションを破棄すると、プッシュ通知が届かなくなってしまいます。

我が家にある端末をキャプチャをした結果は以下の通りです。

Android(Galaxy Note8)

  • 30分(1800sec)に一回端末から送信
    (実測は28~29分程度)

iPhone(iPhone 12 Pro)

  • 30分くらい(1802sec)に一回APNsから送信
    (30分を少し超える場合や、継続的に10分間隔の時もある)

ネットワークによっては、リソース開放を早めるために、NATテーブル、ステートフルインスペクションの破棄時間を短く設定する場合があると思いますが、これらの時間より長く設定することをおすすめします。

可能であれば、プッシュ通知用のポート番号のみ、タイムアウトを長くに設定するのも良いでしょう。

まとめ

Android、iPhoneのプッシュ通知を確実にするために、
以下の通信(IPアドレス、ポート番号)を許可し、NATテーブルとステートフルインスペクションのタイムアウトを、キープアライブ間隔以上に設定しておきましょう。

端末種別 宛先IPアドレス ポート番号 キープアライブ
間隔
Android Any TCP
5228~5230
30分
(1800sec)
iPhone 17.249.0.0/16
17.252.0.0/16
17.57.144.0/22
17.188.128.0/18
17.188.20.0/23
2620:149:a44::/48
2403:300:a42::/48
2403:300:a51::/48
2a01:b740:a42::/48
TCP
5223
30分強
(1802sec)

参考

  • https://support.apple.com/ja-jp/HT203609
  • https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ja
  • https://qiita.com/jumperson/items/3fde555fd4660f474579
  • https://pol-japan.co.jp/products/help/v14/networkports/