1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudflareのCDNはなぜ近いサーバにつながるのか?BGPを利用したAnycastを観察しながら理解する

Last updated at Posted at 2025-12-08

概要

時に西暦2025年11月、インターネットインフラ企業Cloudflareで大規模障害が発生し、少なくない数のウェブサイトが数時間ほどCloudflareの Internal Server Error 画面を表示していました
普段見慣れたサイトの豹変に驚いた人も多いことでしょう

スクリーンショット 2025-11-18 232723.png

これをきっかけにCloudflareがCDN (ウェブサイトのコンテンツをユーザに最寄りのサーバから配信すること) を実現する仕組みに興味を持ったので調査をしました

Cloudflareが世界中に展開するエッジネットワークと、ルーティングプロトコルの一種であるBGPの仕様を利用した手法がシンプルで美しいと感じたので、私なりの理解と調査の過程を共有します

CloudflareとCDN

CDNとは何か

Cloudflareはウェブサイトを高速かつ安全に動かすためのインターネットインフラを提供する米国の企業です
世界中のデータセンタ(以下、DC)に張り巡らされたエッジネットワークを使用してCDN(Content Delivery Network) やDDoS対策、Bot対策といったセキュリティを提供しています

CDNはウェブサイト上のコンテンツを最寄りのキャッシュサーバから配信するためのネットワークです

Cloudflare Anycast.png

ユーザがCDNを使用していないウェブサイトの上のコンテンツにアクセスするとします
ユーザとサーバが地理的に離れている場合は遅延が大きくなりますし、複数のユーザから大量のアクセスがあるとサーバの負荷が増加してしまいます

CDNを導入すると、キャッシュサーバが定期的にオリジンサーバにコンテンツを取得しに行き、ユーザは最寄りのキャッシュサーバからコンテンツを取得するようになります

CDN導入前よりユーザとサーバの地理的距離が近づくことによる遅延防止が期待できます
また、オリジンサーバの負荷低減とオリジンサーバを収容しているネットワークの負荷低減が期待できます

CloudflareはどのようにCDNを実現しているのか

ユーザはウェブサイトがCDNを利用していることなど知るはずもないので、世界中から同じURLを指定してサービスにアクセスしてきます

ユーザは同じURLを指定してアクセスしてくるのに、なぜ最寄りのキャッシュサーバが応答することができるのでしょう

詳細については後述しますが、
Cloudflareは世界中に展開するエッジネットワークと、BGPの仕様を利用してAnycast動作を実装することでCDNを実現しています

CDNの実現方法はベンダーごとに異なります
この記事の内容はCloudflareのCDNについてのものです

Cloudflare CDNで利用されるAnycastアドレス

CloudflareはCDNを実現するためにAnycastアドレスを使用しています
Anycastはネットワーク上で複数の機器が同一のIPアドレスを共有していて、ユーザから最寄りの機器が応答するものです(Anycastを実現する仕組みについては後述します)

Cloudflare Anycast (2).png

ユーザがAnycastアドレスにアクセスすると、東京のユーザには東京付近のキャッシュサーバが、ボストンのユーザにはボストン付近のキャッシュサーバがコンテンツを返します

Anycast動作の観察

Anycastの仕組みについて説明をする前に、実際にCloudflareでAnycast動作を観察してみましょう

PixivがCloudflareを使っているそうなので、Anycastの観察にPixivのIPアドレスを使わせていただきます

www.pixiv.net を名前解決すると返ってくるIPアドレス104.18.42.239, 172.64.145.17はCloudFlareが管理していて、pixivサービスで使用されているAnycastアドレスです

www.pixiv.net を名前解決する
stodo@TDRK:~$ nslookup www.pixiv.net
Server:         10.255.255.254
Address:        10.255.255.254#53

Non-authoritative answer:
Name:   www.pixiv.net
Address: 104.18.42.239
Name:   www.pixiv.net
Address: 172.64.145.17

www.pixiv.net からコンテンツを取得しようとする場合、ユーザの地理的位置にかかわらず104.18.42.239172.64.145.17にアクセスすることになります
名前解決の結果はユーザの地理的位置に依存しません

名前解決の結果をユーザの地理的位置によって変化させることによってCDNを実現する手法もあります
CDNの老舗であるAkamaiでは上記の手法でCDNを実現しているそうです

PixivのIPアドレスを使ってCloudflareのAnycast動作を観察していきます

異なる地理的位置からAnycastアドレスにアクセスしてみたいので、VPNを使用してアクセス元を変化させながら観察します

次の3つの方法で観察しながら理解を深めていきます

1. traceroute コマンドで通信経路を見る
tracerouteは目的地までに経由するルータを表示するコマンドです
アクセス元の地域によって経由するルータが異なることを確認します

2. cdn-cgi/trace エンドポイントを叩いて応答しているDCを確認する
cdn-cgi/traceはCloudflareを使用しているドメインに自動で作成されるエンドポイントです
どのDC上のサーバが応答しているかを教えてくれます
アクセス元の地域から近いデータセンタ(以下、DC)上のサーバが応答していることを確認します

3. Looking glassでルータのBGPテーブルを見る
Anycastを実現する仕組みについては後述しますが、ルーティングプロトコルの一種であるBGPの仕様を利用しています

仕組みについて説明をした後に、日本と北米のように地域に離れた2つのAS内にあるルータのBGPテーブルを比較して、Cloudflareが管理している同一のAnycastアドレスの学習元が異なることを確認します

ルータのBGPテーブルが異なるということは、別のAS配下のユーザが同一のAnycastアドレスにアクセスする場合に応答するサーバが変わるということです

traceroute コマンドで通信経路を見る

CloudflareのCDNに使用されているAnycastアドレスにアクセスすると、アクセス元から地理的に近いDC上のサーバが応答を返すことが期待されます

VPNを利用して、アクセス元を切り替えながらAnycastアドレスに向けてtracerouteを実行します
今回はアクセス元を東京とボストンにしています

東京からtraceroute

目的地のAnycastアドレス104.18.42.239に到達する直前に103.22.201.129を経由しています
直前に経由したIPアドレスの地理的位置を見ると、東京にあるようです
https://iptoolskit.com/ip/103.22.201.129

東京からのtraceroute
stodo@TDRK:~$ traceroute -A -q 1 104.18.42.239
traceroute to 104.18.42.239 (104.18.42.239), 30 hops max, 60 byte packets
 1  TDRK.mshome.net (172.24.112.1) [*]  1.050 ms
 2  *
 3  93.118.40.21 (93.118.40.21) [AS58325]  16.845 ms
 4  ae10.5.rt0-tky.jp.as58325.net (93.118.40.16) [AS58325]  8.976 ms
 5  101.203.90.97 (101.203.90.97) [*]  15.280 ms
 6  103.22.201.129 (103.22.201.129) [AS13335]  9.439 ms
 7  104.18.42.239 (104.18.42.239) [AS13335]  8.808 ms

ボストンからtraceroute

目的地のAnycastアドレス104.18.42.239に到達する直前に162.158.61.111を経由しています
直前に経由したIPアドレスの地理的位置を見ると、ニューアークにあるようです
https://iptoolskit.com/ip/162.158.61.111

ボストンからのtraceroute
stodo@TDRK:~$ traceroute -A -q 1 104.18.42.239
traceroute to 104.18.42.239 (104.18.42.239), 30 hops max, 60 byte packets
 1  TDRK.mshome.net (172.24.112.1) [*]  3.008 ms
 2  *
 3  145.79.196.124 (145.79.196.124) [AS136787/AS212238]  185.287 ms
 4  vl201.bos-mark-core-1.cdn77.com (185.156.45.196) [AS60068]  185.359 ms
 5  *
 6  be3471.ccr41.jfk02.atlas.cogentco.com (154.54.40.154) [AS174]  184.905 ms
 7  be2236.rcr21.ewr02.atlas.cogentco.com (154.54.45.6) [AS174]  184.692 ms
 8  *
 9  162.158.61.111 (162.158.61.111) [AS13335]  184.281 ms
10  104.18.42.239 (104.18.42.239) [AS13335]  184.228 ms

これらの情報から、地理的に離れた位置ユーザーが同じCloudflareのAnycastアドレスにアクセスしているつもりでも、実際には異なる場所にあるサーバが応答していることが推測できます

どの地域のDC上のサーバが応答しているかをより直接的な方法で確認してみたいので、cdn-cgi/traceエンドポイントの情報を見てみましょう

ASとはインターネット上で1つの組織が一貫した方針で運用するネットワークの単位です
各ASは固有の番号(ASN)を持ち、BGPというプロトコルで他ASと経路情報を交換します

cdn-cgi/trace エンドポイントを叩いて応答しているDCを確認する

cdn-cgi/traceってなに?

CloudFlareを利用しているドメインで自動的に生成されるエンドポイントです
ユーザからのアクセスに対して応答しているサーバがどのDCに置かれているか、といった情報を返してくれます
DCの場所は空港コードで教えてくれます

The three-letter code in the data center name is the IATA code of the nearest major international airport. Determine the Cloudflare data center serving requests for your browser by visiting: http://_www.example.com_/cdn-cgi/trace.

Pixivの場合は下記URLが/cdn-cgi/trace エンドポイントです
https://www.pixiv.net/cdn-cgi/trace/

VPNでアクセス元を変更しながらこのエンドポイントを叩いてみます

東京からのアクセス

成田 (NRT)のサーバが応答を返しています

stodo@TDRK:~$ curl https://www.pixiv.net/cdn-cgi/trace/ | grep colo=

colo=NRT

ボストンからのアクセス

ニューアーク (EWR)のサーバが応答を返しています

stodo@TDRK:~$ curl https://www.pixiv.net/cdn-cgi/trace/ | grep colo=

colo=EWR

ここまでで、同じAnycastアドレスにアクセスしているつもりでも、クライアントの地理的位置によって応答するサーバが変わることを観察できました

しかし、traceroute やcdn-cgi/traceの情報から「Anycast動作の観察」はできても「Anycastどのように実現しているか」までは分かりせん

ここで、いったんは観察を中断してAnycastを実現する仕組みについての自分なりの理解を共有します

CloudflareがAnycastを実現する仕組み

CloudflareがAnycastを実現する仕組みを理解するためには、インターネットの構造とBGPについての知識が必要です

インターネットはASが結びついて形成されている

インターネットはAS(Autonomous System)というネットワークどうしが結合してネットワークを形成し、お互いに経路情報(このIPアドレス帯はこっちにあるよという情報)を交換し、ルーティング(経路情報をもとにトラフィックを適切な方向に導く)をすることで形成されています
Cloudflare Anycast.png
ASとはインターネット上で1つの組織が一貫した方針で運用するネットワークの単位です

ASそれぞれIPアドレス帯の割り当てを受けており、自身の管理下にあるIPアドレス帯(プレフィックス)への経路を広告しています

ASごとに番号の割り当てを受けていて、CloudflareはAS 13335となっています

BGPによる経路広告

インターネットを通じて情報をやりとりするためには、他のASの管理下のIPアドレス帯への経路を知らなければなりません

ASはBGP(Border Gateway protocol)を使って経路情報を配信します
経路情報を配信することを広告すると呼びます
広告には経路情報とパス属性が含まれます

パス属性はいくつかありますが、今回はBGPの解説がメインではないのでAS_PATHという属性のみ扱います
AS_PATHはその広告が通過してきたAS番号を並べたものです

Cloudflare Anycast (2).png

ルータが最適な経路を選択する

広告を受け取ったルータは受け取った経路情報に含まれるパス属性に従って最適な経路(ベストパス)を選択します

今回の図で場合は、20.0.0.0/8への経路をAS222とAS333の2つのASから学習しているので、AS111は20.0.0.0/8へのベストパスがAS222方面とAS333方面のどちらにあるか判断をする必要があります

AS_PATHは広告がASを通過するたびに追加されるので、AS_PATHが長いということはその経路は多くのASを経由する必要がある経路だと考えられます
そのため、AS_PATHが短い経路が優先され、AS111は20.0.0.0/8がAS222方面にあると判断することになります

BGPの基本的な経路選択手順は共通ですが、LocalPrefの設定やASのポリシーにより実際の優先順位は変わります
また、AS間の契約形態や接続ポリシーにも影響を受けます

ASが配下のユーザのパケットをルーティングする

仮にユーザが契約しているISPがAS111だとすると、ユーザはAS111配下からインターネットにアクセスすることになります
ユーザが20.1.1.1にアクセスしたいとすると、A111はAS222方面にパケットをルーティングします

世界中のAS13335(Cloudflare)からAnycastアドレスを広告する

ここまでで、簡略化はしていますがBGPの経路選択の仕組みを説明しました
ここからは、CloudflareがBGPの経路選択の仕組みを利用してAnycastを実現する仕組みについて説明します

世界中のASに接続して経路をアナウンスするCloudflare

Cloudflareは世界中にエッジネットワークを持つ強みをいかして、世界中のASに接続しています
https://www.cloudflare.com/ja-jp/peering-policy/

Cloudflare AS13335 operates a global anycast network, spanning over 330 cities, in more than 125 countries. We have an open peering policy, and will peer with networks that have a presence in mutual locations, in accordance with the policies described below. Exceptions to these policies may be granted.

そして、各地域のデータセンターから同じプレフィックスをBGPでアナウンスしています
https://www.cloudflare.com/resources/assets/slt3lc6tev37/3pQctgV8XEdU93aBlWTm6Q/969abc3a9fdd2078d411369437b3beaf/Cloudflare-Magic-Transit-Reference-Architecture.pdf

BGP Announcement from every Cloudflare Point of Presence

Cloudflare Anycast (3).png

各ASはIX経由でBGPによってAS13335への経路を複数受け取りますが、その中で最も近くにあることが期待されるAS13335から学習した経路をルーティングテーブルへ格納します

ASがAnycastアドレスへの経路を決定する

Cloudflareは世界のデータセンタから同一のAnycastアドレスへの経路情報を広告するだけで、あとは各ASがBGPの経路選択にしたがって最良の経路を選択します

結果として、クライアントからのAnycastアドレスへのトラフィックは地理的に近いCloudflareのデータセンタに吸い込まれる可能性が高くなります

私たちがCDNを使用する際の具体例

私たちは通常はISPと契約してインターネットを使用します
私たちがISP配下からAnycastアドレスにアクセスしようとすると、ISPのルータは自身のルーティングテーブルに従って、最寄りと期待されるAS13335への誘導されます

最寄りと期待されるAS13335にあるキャッシュサーバはオリジンサーバからキャッシュしているコンテンツを返します

このような仕組みによって、クライアントは何も考えずとも地理的に近いキャッシュサーバからコンテンツを受け取ることが期待されます

各ASが実際にどのような基準で経路を選択するかはブラックボックスです

AS_PATH、ローカルポリシー、ピアリング状況、負荷・トラフィック状況など多くの要素が絡みあって決定されています

BGP自体は地理情報を考慮しませんが、CDN事業者が世界中のIXでピアリングし同一prefixをAnycastでアナウンスすることで、結果的にクライアントは地理的に近いノードに誘導されやすくなります

Looking glassを使ってAS内部のルータでBGPテーブルを見る

Anycastを実現する仕組みについて共有したところで観察にもどりましょう

実際にBGPテーブルを覗き見る

実際にAS内部にあるルータのBGPテーブルを見て、地理的に遠い2つのASが同一のAnycastアドレスに対して経路情報の学習元が異なることを確認してみましょう

これまでの観察と整合性をとるならtracerouteに登場したASのルータについてBGPテーブルを見たいところですが、すべてのASがLooking-glassを公開しているわけではありません

なので、アクセス元から地理的に近く、かつLooking glassを公開しているASでBGPテーブルを見て比較してみましょう

下記サイトで公開されている東京のASとボストンのASのBGPテーブルを見ることにします

地理的に遠いASでは別々のCloudflareデータセンタから経路を学習している

このサイトを使って、東京のASとボストンのASそれぞれで、CloudflareのAnycastアドレス104.18.42.239への経路がどのように学習されているかを表示してみました
文字が小さくて見にくいでしょうが、1行目がベストパスとなっているので、その列のNext Hop列とLearnedが特に重要です

  • Next Hopは、「104.18.42.239に行くためには次にどのルータに行けばいいか」を意味しています
  • Learnedは、「誰からその情報を教わったか」を意味しています

東京のAS(Equinix Tokyo TY2)が学習している経路情報

image.png

東京のASにあるルータから show ip bgp routes
core2.tyo1.he.net> show ip bgp routes detail 104.18.42.239 
  Number of BGP Routes matching display condition : 10
Status A:AGGREGATE B:BEST b:NOT-INSTALLED-BEST C:CONFED_EBGP D:DAMPED
       E:EBGP H:HISTORY I:IBGP L:LOCAL M:MULTIPATH m:NOT-INSTALLED-MULTIPATH
       S:SUPPRESSED F:FILTERED s:STALE x:BEST-EXTERNAL
RPKI State V: Valid I: Invalid N: Not found ?: Undefined
1         Prefix: 104.18.42.0/24, Rx path-id:0x00000000, Tx path-id:0x01d40001, rank:0x00000001,  Status: BMEx,  Age: 22d8h41m29s
         NEXT_HOP: 101.203.88.62, Metric: 0, Learned from Peer: 101.203.88.62 (13335)
          LOCAL_PREF: 100,  MED: 0,  ORIGIN: igp,  Weight: 0,  RPKI State: N, GROUP_BEST: 1
         AS_PATH: 13335
            COMMUNITIES: 6939:7319 6939:8392 6939:9003

ボストンのAS(One Summer Boston)が学習している経路情報

image.png

ボストンのASにあるルータから show ip bgp routes
core2.bos1.he.net> show ip bgp routes detail 104.18.42.239 
  Number of BGP Routes matching display condition : 32
Status A:AGGREGATE B:BEST b:NOT-INSTALLED-BEST C:CONFED_EBGP D:DAMPED
       E:EBGP H:HISTORY I:IBGP L:LOCAL M:MULTIPATH m:NOT-INSTALLED-MULTIPATH
       S:SUPPRESSED F:FILTERED s:STALE x:BEST-EXTERNAL
RPKI State V: Valid I: Invalid N: Not found ?: Undefined
1         Prefix: 104.18.42.0/24, Rx path-id:0x00000000, Tx path-id:0x00930001, rank:0x00000001,  Status: BEx,  Age: 38d7h8m44s
         NEXT_HOP: 206.108.236.61, Metric: 0, Learned from Peer: 206.108.236.61 (13335)
          LOCAL_PREF: 100,  MED: 0,  ORIGIN: igp,  Weight: 0,  RPKI State: N, GROUP_BEST: 1
         AS_PATH: 13335
            COMMUNITIES: 6939:7342 6939:8840 6939:9001

東京ASでは「104.18.42.239101.203.88.62(AS 13335)を経由した先にあるよ」という情報を101.203.88.62 (AS13335)から教わっています

一方で、ボストンASでは「104.18.42.239206.108.236.61(AS 13335)を経由した先にあるよ」という情報を206.108.236.61 (AS 13335)から教わっています

上記の観察結果から次のことが確認できました

  • Cloudflare(AS13335)が同一プレフィックスを複数の接続点からアナウンスしている
  • 東京とボストンでは Next-Hop が異なり、ASのルータはそれぞれ別のCloudflareルータを経由する経路を学習している

Conclusion

CloudflareのCDNは、Anycast + BGP というインターネットの基盤技術を巧みに活用することで、ユーザに最も近いエッジサーバが応答する仕組みを実現しています

同一のAnycastアドレスを世界中のデータセンタから広告し、Anycastアドレスへのアクセスに対してどのサーバが応答するかはインターネット内でルーティングの自律分散的な仕組みに任せるという設計はシンプルで美しいです

実際にtracerouteや/cdn-cgi/traceを用いてアクセス元を変えながら観察することで、同じAnycastアドレスにアクセスしてもアクセス元地域によって異なるデータセンタ上のサーバが応答している様子を確認できました

また、BGPテーブルを比較することで、Cloudflare(AS13335)が同一プレフィックスを複数の接続点からアナウンスしていることと、ASごとに異なるCloudflareルータから経路を学習していることを確認できました

参考資料

BGPについての解説
https://www.nic.ad.jp/ja/newsletter/No35/0800.html

Anyycat BGPで最寄りのデータセンタにルーティングされること
https://blog.cloudflare.com/cloudflare-1111-incident-on-june-27-2024/

1.1.1.1へのBGPハイジャック
https://blog.cloudflare.com/cloudflare-1111-incident-on-june-27-2024/

クラウドフレアは世界中のASとIXを介して接続されている
https://www.cloudflare.com/ja-jp/peering-policy/

複数のPoPから同一のプレフィックスが広告されている
https://www.cloudflare.com/resources/assets/slt3lc6tev37/3pQctgV8XEdU93aBlWTm6Q/969abc3a9fdd2078d411369437b3beaf/Cloudflare-Magic-Transit-Reference-Architecture.pdf

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?