国内線ANA Wifi Serviceを経由した通信を調べてみた

Page content

はじめに

2025年5月頃、ANAの国内線で旅行に行った。この際、自身がCloudflareにホストしているアプリにリクエストを投げてみたので、その調査結果を載せる。大した話ではなく、ただの興味本位によるものです。調べてもあまり情報が載ってないので、気になる方がいたら参考になればいいなと思います。

調べ方

ANA Wifi Serviceに接続したiPhone端末から、Cloudflare Workersにホストしたアプリに向かってHTTPSのGETリクエスト投げて、Cloudflare Workersのログを調べた。これだけである。本当に大した話ではない。リクエストパスの処理は、リクエストを受けた後、pongという固定の文字列をtext/plainでレスポンスするだけの非常にシンプルなもので、複雑な内部処理は一切存在しない。テストや死活監視等のために適当に用意した処理である。結果、以下のようなログを得た。

{
  "source": {
    "level": "info",
    "message": "GET https://hogehoge/hugahuga",
    "$cloudflare": {
      "$metadata": {
        "id": "11111111111111111111111111",
        "type": "cf-worker-event",
        "messagePattern": "GET <URL>"
      }
    }
  },
  "dataset": "cloudflare-workers",
  "timestamp": "2025-06-02T08:10:35.906Z",
  "$workers": {
    "event": {
      "request": {
        "cf": {
          "requestHeaderNames": {},
          "httpProtocol": "HTTP/3",
          "tlsCipher": "AEAD-AES128-GCM-SHA256",
          "continent": "AS",
          "clientAcceptEncoding": "gzip, deflate, br",
          "country": "JP",
          "verifiedBotCategory": "",
          "tlsClientCiphersSha1": "",
          "tlsClientAuth": {
            "certIssuerDNLegacy": "",
            "certIssuerSKI": "",
            "certSubjectDNRFC2253": "",
            "certSubjectDNLegacy": "",
            "certFingerprintSHA256": "",
            "certNotBefore": "",
            "certSKI": "",
            "certSerial": "",
            "certIssuerDN": "",
            "certVerified": "NONE",
            "certNotAfter": "",
            "certSubjectDN": "",
            "certPresented": "0",
            "certRevoked": "0",
            "certIssuerSerial": "",
            "certIssuerDNRFC2253": "",
            "certFingerprintSHA1": ""
          },
          "tlsClientRandom": "zkajhsaJAKzjALDJaas/AjsasjsofjtxzlasjhdgkjQ=",
          "tlsClientHelloLength": "275",
          "colo": "SJC",
          "timezone": "Asia/Tokyo",
          "longitude": "139.69000",
          "latitude": "35.69000",
          "requestPriority": "",
          "tlsVersion": "TLSv1.3",
          "asOrganization": "Panasonic Avionics Corporation",
          "tlsClientExtensionsSha1Le": "",
          "tlsClientExtensionsSha1": "mTyaosjahsriajs879210rdks7c=",
          "asn": 12345,
          "edgeRequestKeepAliveStatus": 1
        },
        "url": "https://hogehoge/hugahuha",
        "method": "GET",
        "headers": {
          "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
          "accept-encoding": "gzip, br",
          "accept-language": "ja",
          "cf-connecting-ip": "205.220.148.143",
          "cf-ipcountry": "JP",
          "cf-ray": "123456789abcdefg",
          "cf-visitor": "{\"scheme\":\"https\"}",
          "connection": "Keep-Alive",
          "host": "hogehoge",
          "priority": "u=0, i",
          "sec-fetch-dest": "document",
          "sec-fetch-mode": "navigate",
          "sec-fetch-site": "none",
          "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/137.0.7151.51 Mobile/15E148 Safari/604.1",
          "x-forwarded-proto": "https",
          "x-real-ip": "205.220.148.143"
        },
        "path": "/hugahuga"
      },
      "rayId": "123456789abcdefg",
      "executionModel": "stateless",
      "response": {
        "status": 200
      }
    },
    "diagnosticsChannelEvents": [],
    "truncated": false,
    "scriptName": "my-api",
    "outcome": "ok",
    "eventType": "fetch",
    "scriptVersion": {
      "id": "abcdef12-gh34-ij56-kl78-mnopqrs90123"
    },
    "requestId": "123456789abcdefg",
    "cpuTimeMs": 4,
    "wallTimeMs": 4
  },
  "$metadata": {
    "id": "0123456789ABCDEFGHIJKLMOPQ",
           
    "requestId": "123456789abcdefg",
    "trigger": "GET /hugahuga",
    "service": "hogehoge",
    "level": "info",
    "message": "GET https://hogehoge/hugahuga",
    "account": "1234567890abcdefghijklmnopqrstuv",
    "type": "cf-worker-event",
    "fingerprint": "1234567890abcdefghijklmnopqrstuv",
    "origin": "fetch",
    "messageTemplate": "GET <URL>"
  },
  "links": []
}

IPアドレス

このときのIPアドレスは205.220.148.143だった。これをwhoisすると以下の結果を得る。

$ whois 205.220.148.143

#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2025, American Registry for Internet Numbers, Ltd.
#


NetRange:       205.220.128.0 - 205.220.159.255
CIDR:           205.220.128.0/19
NetName:        PAC-59
NetHandle:      NET-205-220-128-0-1
Parent:         NET205 (NET-205-0-0-0-0)
NetType:        Direct Allocation
OriginAS:
Organization:   Panasonic Avionics Corporation (PAC-59)
RegDate:        2018-11-15
Updated:        2018-11-15
Ref:            https://rdap.arin.net/registry/ip/205.220.128.0
...

CIDRは205.220.128.0/19である。この中からIPが割り当てられるのだろう。ただ、乗客一人ひとりにそれぞれ異なるグローバルIPアドレスを割り当てるのかどうかは、なんとなく若干怪しい気はする。/19のCIDRだと使用できるIPアドレスは8190個なので、もしそんなやり方してるんだとすると同時に8190人までしか接続できないことになる。ANAの国内線便数は1日辺り912便なので、1時間あたり38便。例えばボーイング787だと246席なので、仮にこの機が満席だとすると1時間あたり平均で246×38=9348のIPが使用される計算になり、8190では不足する。ある1時間の間に飛んでいるANAの飛行機が全てボーイング787で、しかも飛んでる全ての便が満席で、そのうえ乗客全員がANA Wifi Serviceを使い、かつ確保しているIPを余すことなく全て乗客に割り当てる(予約用とかメンテ用とかの内部業務も一切苦慮せず全部サービスとして使う)という、かなりざっくりした前提なので、実際はもっと流動的だと思うが、/19のCIDRでは心もとないのは事実だろう。そう思ってちょっと探したら、199.21.160.0/22も確保されてるようなので、もしかしたらもう少し余裕あるのかもしれない。

Organization

管轄は「Panasonic Avionics Corporation 」で、これはアメリカに本社のあるパナソニックの関連企業である。この会社はANA Wifi Serviceのホームページでも紹介されているので別に秘匿情報でもなんでもない。Wikiによれば

旅客機向けの機内エンターテインメントやインターネット接続に必要な機器の製造の他、納入後のメンテナンスなども行っており[4]、世界の主要空港に保守管理用のエンジニアを常駐させている。

とのことなので、別に違和感もない。(疑う気もないが)なお、顧客にJALもいて、JALの機内WiFiサービスもこの会社が提供しているらしいので、そうなると上のIPアドレスの項で考察した問題がさらに深刻になる。やはり「乗客一人ひとりにグローバルIPアドレスを割り当てる」のは恐らく誤りだろう(振り出したAvailableなグローバルIPを複数人で兼用する、という挙動なのだろう)。

経度・緯度

Cloudflare Workersのログには、リクエスト元のクライアントの経度(longitude)と緯度(latitude)が出力される。このログにおいては 経度139.69緯度35.69 が記録されている。ここはどこか?

調べてみたら、この場所は東京都新宿区、「新宿中央公園前」交差点あたり、都営新宿線「都庁前」駅A5出口付近を指している。

当日の航路は沖縄から羽田に向けたもので、基本的に海上(太平洋上)を飛ぶルートであり、新宿上空は通過しないし、そもそもこのリクエストを実行した時点では多分九州の南側あたりの太平洋上を飛んでいるので、仮に新宿上空を通過するルートだったとしてもおかしい。なので「リクエストしたクライアントの現在位置(付近)」を指しているというわけではないのだろう。

しかしかといって、ここがどういう理由で採用されているのかも不明である。上の「パナソニックアビオニクス」という会社の本社所在地でも指してるのかと思ったが、この会社は本社がアメリカにあるのでそうではないし、親会社であるパナソニックコネクトの本社所在地も銀座にあるので、新宿との関連性が見いだせない。Cloudflare Workersのログが、小数点後ろ3桁が全て"000"なのが少し怪しく、切り落とされている可能性もあると思っていて、例えば経度(longitude)でいえば"139.69000"なので"139.69000"~"139.69999"までは可能性があるのではないかと疑っているが、そうだとしても(少なくとも)「新宿」を大きく外れるものではないのでない。新宿にこの会社の通信拠点になる設備でもあるのだろうか?

ちなみに、「新宿中央公園前」交差点とか「都庁前駅A5出口」というのはざっくりした言い方で(Google Mapで一番近くにあった名前のついてる地名がそれだったのでそう述べたに過ぎず)、ログの出力は"longitude": "139.69000","latitude": "35.69000",なので、(上で述べた「小数点3桁以降が桁落ちしている」話は抜きにして)ここは厳密にいうと新宿中央公園のド真ん中なのだ。Google Mapで見る限り、少なくともこの場所に何かランドマークがあるようには見えない。何の変哲もない広場のただの地面を指している。ここには何があるのだ??(地下に何かが埋まってるとか?)
経度139.69、緯度39.69のGoogle Map上での位置
経度139.69、緯度39.69のGoogleストリートビューでの表示

結論

よくわからなかった。 もう少し情報が必要のような気はする。また飛行機乗るときに試してみようと思う。(終)