IBM Cloud Internet Services (CIS) のanycastをコマンドで確認する

# 記事の目的
IBM Cloud Internet Services (CIS)では、anycastというルーティング手法が使われています。

https://www.ibm.com/blogs/solutions/jp-ja/security-performance-ibm-cloudflare/
>IBM Cloud Internet Services は、Cloudflare のグローバル・エニイキャスト・ネットワーク（65カ国以上にある125以上のデータ・センター）に支えられ、モバイル・ユーザー・エクスペリエンスを強化し、インターネット対応アプリケーションのグローバルな応答性能と可用性を確保します。

anycastのwikipediaの説明：
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%8B%E3%83%BC%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88

この記事では、anycastがどのような挙動をするか、コマンドの実行結果を見ながら確認したいと思います。

# 環境説明

検証用に、下記のサーバーを、IBM Cloud上に用意しました。

・オリジンサーバー＠東京DC
・擬似的なクライアント端末として、Windows環境＠東京DC
・擬似的なクライアント端末として、Windows環境＠ワシントンDC
・擬似的なクライアント端末として、Windows環境＠パリDC

そして、下記URLの手順でCISを構成し、www.tama0921.com へのアクセスがCIS経由で行われる状態にしました。
https://qiita.com/y_tama/items/9151b4c981abbb65c53d

# 東京のWindows環境からのアクセスを確認

まず、クライアント端末を模して東京DCに立てたWindows環境にリモートデスクトップでログインし、そこからのnslookupやpingの結果を確認します。

まずはオリジンサーバーの実IPアドレスへのpingを確認します。同じ東京DC内なので当然近く、1msで応答が返ります。

```
>ping 161.202.136.194

Pinging 161.202.136.194 with 32 bytes of data:
Reply from 161.202.136.194: bytes=32 time<1ms TTL=64
Reply from 161.202.136.194: bytes=32 time<1ms TTL=64
Reply from 161.202.136.194: bytes=32 time<1ms TTL=64
Reply from 161.202.136.194: bytes=32 time<1ms TTL=64

Ping statistics for 161.202.136.194:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
```

次に、www.tama0921.com へのnslookupを確認します。CISを設定していますので、オリジンサーバーの実IPアドレスではなく、104で始まるCISのエッジのIPアドレスが返ってきます。（2つの値が返るのは冗長性の意味があります）

```
>nslookup www.tama0921.com
Server:  UnKnown
Address:  10.0.80.11

Non-authoritative answer:
Name:    www.tama0921.com
Addresses:  2400:cb00:2048:1::6814:ab3
          2400:cb00:2048:1::6814:9b3
          104.20.9.179
          104.20.10.179
```

ここで、CISのエッジに対してpingを打つとどうなるでしょうか？ これも1msで返ってきます。
CISのエッジの具体的な場所は公開されていませんが、クライアント端末を模したWindows環境に非常に近い距離にあることが窺えます。

```
>ping 104.20.9.179

Pinging 104.20.9.179 with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

>ping 104.20.10.179

Pinging 104.20.10.179 with 32 bytes of data:
Reply from 104.20.10.179: bytes=32 time=1ms TTL=59
Reply from 104.20.10.179: bytes=32 time=1ms TTL=59
Reply from 104.20.10.179: bytes=32 time=1ms TTL=59
Reply from 104.20.10.179: bytes=32 time=1ms TTL=59

Ping statistics for 104.20.10.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

```

　www.tama0921.com への応答も早いです。

```
>ping www.tama0921.com

Pinging www.tama0921.com [104.20.9.179] with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59
Reply from 104.20.9.179: bytes=32 time=1ms TTL=59

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

C:\Users\Administrator>

```

# アメリカのWindows環境からのアクセスを確認

次に、アメリカにいるユーザーのクライアント端末を模してワシントンDCに立てたWindows環境に、リモートデスクトップでログインし、そこからのnslookupやpingの結果を確認します。


オリジンサーバーの実IPアドレスへのpingを確認します。アメリカから日本なので、これはそれなりのLatencyがあります。

```
>ping 161.202.136.194

Pinging 161.202.136.194 with 32 bytes of data:
Reply from 161.202.136.194: bytes=32 time=158ms TTL=53
Reply from 161.202.136.194: bytes=32 time=157ms TTL=53
Reply from 161.202.136.194: bytes=32 time=157ms TTL=53
Reply from 161.202.136.194: bytes=32 time=157ms TTL=53

Ping statistics for 161.202.136.194:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 157ms, Maximum = 158ms, Average = 157ms
```

次に、www.tama0921.comの名前解決をします。ここで注目いただきたいのが、返ってくるIPアドレスが東京DCで試した時と全く同じIPアドレスであるという点です。

```
>nslookup www.tama0921.com
Server:  UnKnown
Address:  10.0.80.11

Non-authoritative answer:
Name:    www.tama0921.com
Addresses:  2400:cb00:2048:1::6814:9b3
          2400:cb00:2048:1::6814:ab3
          104.20.9.179
          104.20.10.179
```

では、このIPアドレスにpingを打つとどうなるでしょうか？
下記のように、ワシントンDCのWindows環境からも、1msで応答が返っています。同じIPアドレスなのに、東京DCからもワシントンDCからも1msで応答がある、これがanycastの特長です。
世界に125箇所以上あるCISのデータセンターのうち、クライアントに最も近いエッジが応答をしているのです。

```
>ping 104.20.9.179

Pinging 104.20.9.179 with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

>ping 104.20.10.179

Pinging 104.20.10.179 with 32 bytes of data:
Reply from 104.20.10.179: bytes=32 time=1ms TTL=53
Reply from 104.20.10.179: bytes=32 time=1ms TTL=53
Reply from 104.20.10.179: bytes=32 time=1ms TTL=53
Reply from 104.20.10.179: bytes=32 time=1ms TTL=53

Ping statistics for 104.20.10.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms
```

ワシントンDCのWindows環境から、www.tama0921.comへの応答も1msです。ブラウザでアクセスする際、初回のアクセスはオリジンまで見に行くので遠いですが、2回目以降、キャッシュに載ったコンテンツは、この最寄りのCISエッジから配信されるので高速にアクセスできることが期待できます。

```
>ping www.tama0921.com

Pinging www.tama0921.com [104.20.9.179] with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53
Reply from 104.20.9.179: bytes=32 time=1ms TTL=53

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms
```

# フランスのWindows環境からのアクセスを確認

念のため、フランスにいるユーザーのクライアント端末を模してパリDCに立てたWindows環境にもリモートデスクトップでログインし、そこからのnslookupやpingの結果を確認します。

細かいコメントは割愛しますが、ワシントンDCと全く同様の結果です。

```
>ping 161.202.136.194

Pinging 161.202.136.194 with 32 bytes of data:
Reply from 161.202.136.194: bytes=32 time=227ms TTL=54
Reply from 161.202.136.194: bytes=32 time=227ms TTL=54
Reply from 161.202.136.194: bytes=32 time=227ms TTL=54
Reply from 161.202.136.194: bytes=32 time=227ms TTL=54

Ping statistics for 161.202.136.194:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 227ms, Maximum = 227ms, Average = 227ms


>nslookup www.tama0921.com
Server:  UnKnown
Address:  10.0.80.11

Non-authoritative answer:
Name:    www.tama0921.com
Addresses:  2400:cb00:2048:1::6814:9b3
          2400:cb00:2048:1::6814:ab3
          104.20.9.179
          104.20.10.179


>ping 104.20.9.179

Pinging 104.20.9.179 with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

>ping 104.20.10.179

Pinging 104.20.10.179 with 32 bytes of data:
Reply from 104.20.10.179: bytes=32 time=1ms TTL=60
Reply from 104.20.10.179: bytes=32 time=1ms TTL=60
Reply from 104.20.10.179: bytes=32 time<1ms TTL=60
Reply from 104.20.10.179: bytes=32 time<1ms TTL=60

Ping statistics for 104.20.10.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms

>ping www.tama0921.com

Pinging www.tama0921.com [104.20.9.179] with 32 bytes of data:
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60
Reply from 104.20.9.179: bytes=32 time<1ms TTL=60
Reply from 104.20.9.179: bytes=32 time=1ms TTL=60
Reply from 104.20.9.179: bytes=32 time<1ms TTL=60

Ping statistics for 104.20.9.179:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 1ms, Average = 0ms
```

#まとめ
上記の検証から下記が確認できました。
・世界中のどこで自ドメインを名前解決しても同じIPアドレスが返ってくる
・それに応答するのはクライアントに最も近いCISエッジである

仮に最寄りのCISエッジが障害で使えなかった場合は、次に近いCISエッジにルーティングされ、そちらが処理を行います。冒頭に引用したように、CIS（Cloudflare）は125以上のデータ・センターがありますので、その全てで応答が無くなることはほぼ考えられません。

さらに、広域に分散したbotが仕掛けるDDoS攻撃も、それぞれの最寄りのCISエッジにルーティングされますので、1つのエッジに負荷が集中する事を防げるというメリットもあります。

このように、anycastの手法を使い、CISはパフォーマンス、可用性、セキュリティを向上させています。