2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudflareAdvent Calendar 2022

Day 20

Cloudflare Tunnel (cloudflared) に Tunnel Virtual Networks を使ったルーティング設定を行う

Last updated at Posted at 2023-05-23

Cloudflare Tunnel (cloudflared) に同じ IP ルートを定義しようとすると

怒られます。

ただ Create private network for default network tunnel とあるように

default network でない場合には定義が可能です。

そこで Tunnel Virtual Networks を使います。

image.png

Tunnel Virtual Networks とは

要は、default network 以外にも複数の Virtual Networks を作成して、IP 重複があったとしても Virtual Networks として分かれていれば、選択して利用できます。

ただし2023/05/23時点では、ダッシュボード UI からは default network に対してしか設定できないため、API で設定する方法を書きます。

Cloudflare Tunnelは、仮想ネットワークの作成と設定をサポートしています。Tunnel Virtual Networksを使用すると、オーバーラップするIP範囲を持つ異なるプライベートネットワークを管理できます。
たとえば、組織が「本番」と「ステージング」と考えている2つの異なる仮想プライベートクラウド(VPC)ネットワークを公開したい場合があります。ただし、2つのプライベートネットワークが同じRFC 1918 IP割り当てを受けた場合、同じIPアドレスを持つ2つの異なるリソースがある可能性があります。 2つの別々の仮想ネットワークを作成することにより、10.128.0.1 / 32 stagingおよび10.128.0.1 / 32 productionなど重複するプライバシーアドレスにトラフィックを決定的にルーティングできます。エンド ユーザーはWARP クライアント設定にアクセスして接続する ネット ワー ク を選択します。

Tunnel Virtual Networks の確認

export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'
curl -s --request GET \
  --url https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/virtual_networks \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" | jq
result.json
{
  "success": true,
  "messages": [],
  "errors": [],
  "result": [
    {
      "id": "604aa865-1642-405c-a745-3d448f69b8f1",
      "account_id": 00000000,
      "comment": "This network was autogenerated because this account lacked a default one",
      "name": "default",
      "is_default_network": true,
      "created_at": "2021-11-17T09:40:27.640842Z",
      "deleted_at": null
    },
    {
      "id": "ffe4c560-0a28-4253-808b-c327cfccf962",
      "account_id": 00000000,
      "comment": "Staging Virtual Network",
      "name": "kyouhei-virtual-network",
      "is_default_network": false,
      "created_at": "2023-04-20T14:32:01.436116Z",
      "deleted_at": null
    }
  ]
}

Tunnel Virtual Networks の作成

curl -s --request POST \
  --url https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/virtual_networks \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  --data '{
  "comment": "Staging VPC for data science",
  "is_default": false,
  "name": "us-east-1-vpc"
}'  | jq
result.json
{
  "success": true,
  "messages": [],
  "errors": [],
  "result": {
    "id": "615c2f89-8084-4475-a40c-9e5542e3f3fa",
    "account_id": 00000000,
    "comment": "Staging VPC for data science",
    "name": "us-east-1-vpc",
    "is_default_network": false,
    "created_at": "2023-05-23T03:29:35.474147Z",
    "deleted_at": null
  }
}

【参考】 Tunnel Virtual Networks の削除

削除された Virtual Networks には deleted_at に値が入ります。

export VNET_ID='YOUR_VNET_ID'

curl -s --request DELETE \
  --url https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/virtual_networks/$VNET_ID \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" | jq
result.json
{
  "success": true,
  "messages": [],
  "errors": [],
  "result": {
    "id": "615c2f89-8084-4475-a40c-9e5542e3f3fa",
    "account_id": 00000000,
    "comment": "Staging VPC for data science",
    "name": "us-east-1-vpc",
    "is_default_network": false,
    "created_at": "2023-05-23T03:29:35.474147Z",
    "deleted_at": "2023-05-23T03:32:54.727897Z"
  }
}

Cloudflare Tunnel (cloudflared) の作成

以下の手順に沿って作成します。

Tunnel ID の取得

作成した Cloudflare Tunnel (cloudflared) の Tunnel ID を取得します。

image.png

Tunnel Virtual Networks で Tunnel Routes を作成

10.146.0.0/20 を作成したい場合は 10.146.0.0%2F20 のように URL エンコードした値を使います。

export TUN_ID='YOUR_TUN_ID'
export VNET_ID='YOUR_VNET_ID'
curl -s --request POST \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes/network/10.146.0.0%2F20" \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  --data '{
  "tunnel_id":"'$TUN_ID'",
  "virtual_network_id":"'$VNET_ID'"
}' | jq

Tunnel Virtual Networks で Tunnel Routes を確認

curl -s --request GET \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes" \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" | jq '.result[] | select (.virtual_network_id == "'$VNET_ID'") | select (.deleted_at == null)'
result.json
{
  "network": "10.146.0.0/20",
  "tunnel_id": "71ba0fd1-8678-4620-8de5-43444a7e4c13",
  "comment": "",
  "created_at": "2023-05-23T03:07:56.923139Z",
  "deleted_at": null,
  "virtual_network_id": "ffe4c560-0a28-4253-808b-c327cfccf962",
  "tunnel_name": "tunnel virtual network"
}

【参考】 Tunnel Virtual Networks で Tunnel Routes を削除

API で削除する必要があります。

cloudflared の実装によると、クエリパラメータで virtual_network_id を渡してあげたところ、削除できました。

curl -s --request DELETE \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/teamnet/routes/network/10.146.0.0%2F20?virtual_network_id=$VNET_ID" \
  --header 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" | jq
result.json
{
  "success": true,
  "messages": [],
  "errors": [],
  "result": {
    "network": "10.146.0.0/20",
    "tunnel_id": "71ba0fd1-8678-4620-8de5-43444a7e4c13",
    "comment": "",
    "created_at": "2023-05-23T04:34:29.895735Z",
    "deleted_at": "2023-05-23T04:35:03.872589Z",
    "virtual_network_id": "ffe4c560-0a28-4253-808b-c327cfccf962"
  }
}

WARP クライアントで接続する Tunnel Virtual Networks を選択

同じ宛先の IP だったとしても Virtual Networks として分かれていれば、選択して利用できます。

image.png

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?