Magic WAN の新しい Tunnel Health Check
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 の設定が Bidirectional
で Request
の場合。
Health Check は IPsec トンネルの Inner パケットで、下記のように流れます。
- Cloudflare から CPE に ICMP Echo が来る(From
1
to0
) - CPE は Echo Reply を返す(From
0
to1
)
$ 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
to1
) - CPE はルーティングして折り返す(From
0
to1
、 *転送処理で 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