👌

Magic WAN の新しい Tunnel Health Check

2024/02/16に公開

Magic WAN の Tunnel Health Check に更新があったので書いておきます。
これまで(1,2)と違って Bidirectional(双方向)Health Check がシンプルになりました。

設定と動作を見てみます。

環境(CPE)

IPsec トンネルインターフェースには 10.255.255.0/31 の IP がついています。
Cloudflare側 1
CPE 側 0

$ ip addr show dev vti1 label vti1 scope global
    inet 10.255.255.0 peer 10.255.255.1/31 scope global vti1
       valid_lft forever preferred_lft forever

Bidirectional, Request

Health Check の設定が BidirectionalRequest の場合。

Health Check は IPsec トンネルの Inner パケットで、下記のように流れます。

  • Cloudflare から CPE に ICMP Echo が来る(From 1 to 0
  • CPE は Echo Reply を返す(From 0 to 1
$ sudo tshark -i vti1 icmp

    1 0.000000000 10.255.255.1 → 10.255.255.0 ICMP 84 Echo (ping) request  id=0xaf6c, seq=0/0, ttl=64
    2 0.000038983 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0xaf6c, seq=0/0, ttl=64 (request in 1)
    3 0.031742625 10.255.255.1 → 10.255.255.0 ICMP 84 Echo (ping) request  id=0x4e46, seq=0/0, ttl=64
    4 0.031765869 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x4e46, seq=0/0, ttl=64 (request in 3)
    5 0.044617750 10.255.255.1 → 10.255.255.0 ICMP 84 Echo (ping) request  id=0xaae4, seq=0/0, ttl=64
    6 0.044670870 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0xaae4, seq=0/0, ttl=64 (request in 5)

Bidirectional, Reply

Health Check Type を Reply に変えてみます。

流れが変わります。

  • Cloudflare から CPE に ICMP Echo Reply が来る(From 0 to 1
  • CPE はルーティングして折り返す(From 0 to 1、 *転送処理で TTLが ‐1 されている)
$ sudo tshark -i vti1 icmp
    1 0.000000000 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=64
    2 0.000061596 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=63
    3 0.382075316 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0xec15, seq=0/0, ttl=64
    4 0.382141672 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0xec15, seq=0/0, ttl=63
    5 0.385116809 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x339f, seq=0/0, ttl=64
    6 0.385134863 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x339f, seq=0/0, ttl=63

Monitor

Health Check は複数の Cloudflare データセンターから発行されます。
ダッシュボードはこんな感じです。

API でも取ることができます。

データセンターの区別は Echo/Reply の Identifier フィールドを見ているものと思われます。
一定の間隔で同じ ID が利用されていました。

$ sudo tshark -i vti1 icmp | grep "id=0x1d44"

   41 5.157651650 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=64
   42 5.157699049 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=63
  135 15.158646022 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=64
  136 15.158706386 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=63
  227 25.157644438 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=64
  228 25.157692409 10.255.255.0 → 10.255.255.1 ICMP 84 Echo (ping) reply    id=0x1d44, seq=0/0, ttl=63

Notify

Health Check 状態の Notification が用意されています。

Magic Transit and Magic WAN customers who wish to receive alerts when the percentage of successful health checks for a Magic Tunnel drops below the selected service-level objective (SLO).

service-level objective(SLO)で感度を指定できます。

下記のようなアラートが来ます。

また、トンネルのステータスは Up, Degraded, Down の 3 種ですが、その状況を API で取ることもできます。 0 Down, 0.5 Degraded, 1 Up

The value 0 for the tunnel state represents it being down, the value 0.5 being degraded and the value 1 as healthy.

下記は直近 5 分の平均を取る例です。

# MacOS
back_seconds=60*5  # 5 mins
end_epoch=$(date +'%s')
let start_epoch=$end_epoch-$back_seconds
start_date=$(date -r $start_epoch +'%Y-%m-%dT%H:%M:%S+09:00')
end_date=$(date -r $end_epoch +'%Y-%m-%dT%H:%M:%S+09:00')

echo '{ "query":
  "{
    viewer {
      accounts(filter: { accountTag: $ACCOUNTTAG }) {
        magicTransitTunnelHealthChecksAdaptiveGroups(
          filter: $FILTER
          limit: 100
        ) {
          avg {
          tunnelState
          }
          dimensions {
          tunnelName,
          edgeColoName
          }
        }
      }
    }
  }",
  "variables": {
    "ACCOUNTTAG": "'$account_tag'",
    "FILTER": {
      "datetime_geq": "'$start_date'",
      "datetime_lt": "'$end_date'",
      "tunnelName": "'$tun_name'"
    }
  }
}' | tr -d '\n' | curl \
  -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  -s \
  -d @- \
  https://api.cloudflare.com/client/v4/graphql/

Up 1 以外を引き出してみると、ちょうどバンコック(BKK)とのトンネリングが調子ワルげでした。
このあたりを利用して、自作の通知も出せそうです。

$ sh graphql.query.tunnel.health.sh | jq '.data.viewer.accounts[].magicTransitTunnelHealthChecksAdaptiveGroups[]|select(.avg.tunnelState != 1)'
{
  "avg": {
    "tunnelState": 0.5
  },
  "dimensions": {
    "edgeColoName": "bkk06",
    "tunnelName": "IPsec_to_oci1"
  }
}

ちなみに、バンコックのデータセンターのステータスを見ると、デグレっているようでした。
このあたりは別の API で取ることができます。

~ $ curl -s https://www.cloudflarestatus.com/api/v2/components.json | jq -r '.components[] | select (.name |contains("BKK"))'
{
  "id": "5wtvzd626rd8",
  "name": "Bangkok, Thailand - (BKK)",
  "status": "partial_outage",
  "created_at": "2016-04-21T05:37:43.134Z",
  "updated_at": "2024-02-15T19:07:20.187Z",
  "position": 5,
  "description": null,
  "showcase": false,
  "start_date": null,
  "group_id": "77867vxkttgw",
  "page_id": "yh6f0r4529hb",
  "group": false,
  "only_show_if_degraded": false
}

以上、Bidirectional の Health Check がより直感的になって、よいと思いました。

Discussion