CloudflareをDNSサーバーに設定していれば、国外からのアクセスをブロックできるっぽいので試して見た。今回はサブドメインを対象にしてます(ドメインを対象にすると、このブログも見れなくなっちゃうからね……)。
まずはCloudflareにログイン。アカウントない人は作ってね✨
あわせて読みたい

テーブルにあるドメイン名をクリックして、設定したいドメインのダッシュボードに入りましょう。ドメインがない?登録しようね✨(ドメインをCloudflareで管理してなくても、DNSサーバーに設定することで使えるようになるよ。調べてみようね)

そしたら左の「セキュリティ」>「セキュリティ ルール」を開こう!

「ルールを作成」>「カスタム ルール」をクリック。

そしたら、サブドメインを国外ブロックの設定をするよ。追加するときは「AND」ボタンをクリックしようね。ORにしちゃうと意味ないよ。
- 「ホスト名」「次と等しい」「sub.example.com」
※サブドメインの内容は拒否したいサブドメインにしてね - 「国」「次と等しくない」「Japan」
※複数の国を指定することも出来る(その場合はGUIじゃなくて「式を編集」が楽そう) - アクションを選択する:「ブロック」

ChatGPT曰く (http.host eq "sub.example.com" and not ip.geoip.country ne "JP") が正しいらしいけどGUIではsrcなのでsrcのままで良いかと思います。ぶっちゃけgeoipでも問題無く動くんですけどね。
> ip.src.country / ip.geoip.country の違いは?
実際のところ、Cloudflareの内部ではどちらも同じGeoIPデータベースに依存してるけど、
ip.geoip.country → WAF(Edge)用変数
ip.src.country → Zero Trust(Access)用変数
というように利用される文脈が違うだけ。設定したら「デブロイ」をクリックすることで完了!

実際にブロックされるかはChromeのVPN拡張を入れて、実際に国外IPアドレスからアクセスするのが早い!

目次
メモ
許可国を複数する場合は、こんな風に追加できるよ。

式はこうなるね。
(http.host eq "sub.example.com" and not ip.src.country in {"AX" "KR" "AL"})
