Thank you for reading this post, don't forget to subscribe!
настраиваем zero trust
при открытии zero trust он попросит создать имя организации, после его можно посмотреть тут:
settings → Custom Pages
настраиваем policy для autentification
Access -> Policies -> Add Policy
тут настраиваем, имя полиси ставим action → Allow, сессию настроил на 1 неделю.
так как авторизовываться будем по email (пока однарозовый пароль, дальше покажу как настроить и SSO) выбираем Email ending in и наш email, так же в Require указываем метод аутентификации pin (для sso покажу настройку ниже)
дальше настраиваем tunnel
Networks → Tunnels → Add a tunnel
выбираем операционку на которой будет запущен тунель:
создадим ещё один туннель Cloudflared
выбираем нашу ось
дальше необходимо выбрать нашу внутреннюю подсеть, пока можно указать любой ip мы поправим это потом
далее поднимаем instance во внутренней сети вот моя сеть, в мир хожу через nat
вот route table
вот network acl той subnet где будем поднимать instance
вот security group
далее создаём instance
aws → ec2 → launch instance
поднимать будем на free tier
выбираем наш ssh key и выбираем нашу security group и vpc
всё, этих настроек хватает, диск оставлю по дефолту на 8 gb и запускаю instance
подключаемся к серверу:
подключаемся instance c помощью нашего приватного ssh ключа:
ssh -i "worker.pem" ec2-user@IP
sudo su -
дальше ставим то что нам показал cloudflare при создании warp tunnel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Add cloudflare-warp.repo to /etc/yum.repos.d/ curl -fsSl https://pkg.cloudflareclient.com/cloudflare-warp-ascii.repo | sudo tee /etc/yum.repos.d/cloudflare-warp.repo # Update repo sudo yum update # Install sudo yum install cloudflare-warp sudo sysctl -w net.ipv4.ip_forward=1 warp-cli connector new eyJhIjoiODI1hnPT0ifQ== warp-cli connect # Add cloudflared.repo to /etc/yum.repos.d/ curl -fsSl https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo #update repo sudo yum update # install cloudflared sudo yum install cloudflared sudo cloudflared service install eyJhIjoiODIzNjwWmpsayJ9 |
после выполнения команды
warp-cli connect пропадает доступ по ssh поэтому лучше настроить ssm
создаём дополнительную virtual network в cloudflare
идём Settings → Warp Client → Virtual networks → Add new
правим route который мы ранее создавали, указываем subnet нашего vpc 10.115.0.0/16
Networks → Routes
создаём ещё один route в котором указываем ту же subnet, tunnel от cloudflared и виртуальную сеть warp-virtual-network
настраиваем warp-client
Settings → WARP Client - > Device enrollment permissions → Manage
выбираем нашу policy
теперь в Settings → WARP Client включим Override local interface IP и настроим default Profile settings
из exclude нужно удалить подсети в которые мы попадаем
я удалил 10.0.0.0/8
добавим google auth
Settings - Authentication -> Login methods - > Add new
там есть подробная инструкция со скриншотами куда заходить в google console и что создавать
и поправим autentification policy оставим только по email
чтобы был доступ к другим окружениям (кластерам) нужно поднять тунели и до них:
вот роуты
подсети
10.114.0.0/16
10.115.0.0/16
10.102.0.0/16
10.118.0.0/16
это vpc в аккаунтах
настроим подключение клиента, вот тут можно скачать клиент для warp
https://developers.cloudflare.com/warp-client/get-started/
вводим имя организации
дальше может войти по sso или вручную ввести наш email и мы получим на почту одноразовый код
и подключение на linux (ubuntu)
https://pkg.cloudflareclient.com/
1 2 3 4 5 6 7 8 9 10 |
# Add cloudflare gpg key curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg # Add this repo to your apt repositories echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list # Install sudo apt-get update && sudo apt-get install cloudflare-warp |
вводим имя организации:
terraform module
вот terraform module для запуска cloudflared и warp tunnel
/infra/terraform/modules/cloudflared-zero-trust/main.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 |
terraform { required_providers { cloudflare = { source = "cloudflare/cloudflare" version = "5.5.0" } aws = { source = "hashicorp/aws" version = ">= 5.27.0" } random = { source = "hashicorp/random" version = ">= 3.7.2" } } } provider "cloudflare" { api_token = local.cloudflare_api_token } data "aws_secretsmanager_secret_version" "cloudflare_zero_trust_secret_manager" { secret_id = var.secret_name } locals { cloudflare_account_id = jsondecode(data.aws_secretsmanager_secret_version.cloudflare_zero_trust_secret_manager.secret_string)["cloudflare_account_id"] cloudflare_api_token = jsondecode(data.aws_secretsmanager_secret_version.cloudflare_zero_trust_secret_manager.secret_string)["cloudflare_api_token"] warp_tunnel_id = try(data.external.warp_tunnel[0].result.id, "") } ######################################## # 1. Генерация секрета и создание Tunnel ######################################## # Генерируем Base64-секрет (32 байта) для туннеля resource "random_bytes" "tunnel_secret" { length = 32 } # Создаём Named Tunnel (Cloudflared) в Cloudflare Zero Trust resource "cloudflare_zero_trust_tunnel_cloudflared" "tunnel" { account_id = local.cloudflare_account_id name = var.tunnel_name tunnel_secret = random_bytes.tunnel_secret.base64 } ######################################## # 2. (Опционально) Создание Virtual Network для WARP ######################################## resource "cloudflare_zero_trust_tunnel_cloudflared_virtual_network" "warp_vnet" { count = var.enable_warp && var.create_virtual_network ? 1 : 0 account_id = local.cloudflare_account_id name = var.warp_virtual_network_name comment = var.warp_virtual_network_comment is_default = false is_default_network = false } ######################################## # 3. Настройка маршрута для Cloudflared Tunnel ######################################## resource "cloudflare_zero_trust_tunnel_cloudflared_route" "private_network_route" { count = var.private_cidr != "" && var.private_cidr != null ? 1 : 0 account_id = local.cloudflare_account_id tunnel_id = cloudflare_zero_trust_tunnel_cloudflared.tunnel.id network = var.private_cidr comment = "Cloudflared private network route" } ######################################## # 4. WARP Connector: Service Token + маршрут ######################################## data "external" "warp_tunnel" { count = var.enable_warp ? 1 : 0 program = [ "bash", "-c", <<-EOT set -euo pipefail deadline=$((SECONDS + 10)) while (( SECONDS < deadline )); do # Получаем список всех туннелей resp=$(curl -sSX GET "https://api.cloudflare.com/client/v4/accounts/${local.cloudflare_account_id}/tunnels" \ -H "Authorization: Bearer ${local.cloudflare_api_token}" \ -H "Content-Type: application/json") # Ищем в нём нужный по имени id=$(echo "$resp" | jq -r --arg n "${var.tunnel_name}-warp" '[.result[] | select(.name==$n)][0].id // ""') if [[ -n "$id" ]]; then # Успех — отдаём JSON с полем "id" jq -nc --arg i "$id" '{ id: $i }' exit 0 fi sleep 10 done # По таймауту просто возвращаем пустой id, но не фейлим terraform jq -nc '{ id: "" }' exit 0 EOT ] } # Создаём Service Token типа "connector" для WARP Connector resource "cloudflare_zero_trust_access_service_token" "warp" { count = var.enable_warp ? 1 : 0 account_id = local.cloudflare_account_id name = "${var.tunnel_name}-warp-token" } # Создаём маршрут для WARP, привязывая его к ранее созданной Virtual Network resource "cloudflare_zero_trust_tunnel_cloudflared_route" "warp_network_route" { #count = var.enable_warp && var.warp_cidr != "" && var.create_virtual_network && length(data.external.warp_tunnel[0].result.id) > 0 ? 1 : 0 count = var.enable_warp && var.warp_cidr != "" && var.create_virtual_network && local.warp_tunnel_id != "" ? 1 : 0 account_id = local.cloudflare_account_id tunnel_id = data.external.warp_tunnel[0].result.id network = var.warp_cidr virtual_network_id = cloudflare_zero_trust_tunnel_cloudflared_virtual_network.warp_vnet[0].id comment = "WARP private network route" # Ждём, пока инстанс не завершит user_data и не создаст туннель в Dashboard depends_on = [ aws_instance.warp_connector ] } ######################################## # 5. Security Group (Cloudflared + WARP) ######################################## resource "aws_security_group" "tunnel_sg" { name = "${var.tunnel_name}-zero-trust-sg" description = "Security Group for Cloudflare Tunnel & WARP" vpc_id = var.vpc_id ingress { description = "SSH from trusted network" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["10.0.0.0/8"] } # WARP Connector: WireGuard (2408 UDP) от Cloudflare ingress { description = "WARP WireGuard from Cloudflare" from_port = 2408 to_port = 2408 protocol = "udp" cidr_blocks = ["0.0.0.0/0"] } egress { description = "Allow all outbound" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } ######################################## # 6. EC2 для Cloudflared Tunnel ######################################## data "aws_ami" "amzn_linux_2023_latest" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["al2023-ami-2023*"] } filter { name = "architecture" values = ["x86_64"] } filter { name = "root-device-type" values = ["ebs"] } } resource "aws_instance" "cloudflared" { ami = data.aws_ami.amzn_linux_2023_latest.id instance_type = var.instance_type subnet_id = var.subnet_id vpc_security_group_ids = [aws_security_group.tunnel_sg.id] key_name = var.key_name associate_public_ip_address = false user_data = templatefile("${path.module}/templates/user_data_cloudflared.sh.tpl", { TUNNEL_ID = cloudflare_zero_trust_tunnel_cloudflared.tunnel.id, TUNNEL_CRED_PARAM = random_bytes.tunnel_secret.base64, REGION = var.aws_region, ACCOUNT_ID = local.cloudflare_account_id }) tags = { Name = "${var.tunnel_name}-cloudflared-zero-trust" } } ######################## # 7. ssm для warp нужно потому что ssh перестаёт работать после запуска warp ######################## resource "aws_iam_role" "ec2_ssm_role" { count = var.enable_warp ? 1 : 0 name = "${var.tunnel_name}-ec2-ssm-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }] }) } resource "aws_iam_role_policy_attachment" "ec2_ssm_attach" { count = var.enable_warp ? 1 : 0 role = aws_iam_role.ec2_ssm_role[0].name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } resource "aws_iam_instance_profile" "ec2_ssm_profile" { count = var.enable_warp ? 1 : 0 name = "${var.tunnel_name}-ec2-ssm-profile" role = aws_iam_role.ec2_ssm_role[0].name } ######################################## # 8. EC2 для WARP Connector (опционально) ######################################## resource "aws_instance" "warp_connector" { count = var.enable_warp ? 1 : 0 ami = data.aws_ami.amzn_linux_2023_latest.id instance_type = var.instance_type subnet_id = var.subnet_id vpc_security_group_ids = [aws_security_group.tunnel_sg.id] key_name = var.key_name associate_public_ip_address = false iam_instance_profile = aws_iam_instance_profile.ec2_ssm_profile[0].name user_data = templatefile("${path.module}/templates/user_data_warp.sh.tpl", { CF_API_TOKEN = local.cloudflare_api_token, CF_ACCOUNT_ID = local.cloudflare_account_id, TUNNEL_NAME = var.tunnel_name, WARP_CIDR = var.warp_cidr, REGION = var.aws_region }) tags = { Name = "${var.tunnel_name}-warp-zero-trust" } } |
/infra/terraform/modules/cloudflared-zero-trust/variables.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# ----------------------------- # Cloudflare Zero Trust vars # ----------------------------- variable "tunnel_name" { description = "Имя Cloudflare Tunnel" type = string } # ----------------------------- # AWS vars # ----------------------------- variable "vpc_id" { description = "ID VPC in AWS for EC2" type = string } variable "subnet_id" { description = "Private Subnet ID for EC2 Cloudflared" type = string } variable "instance_type" { description = "Type for EC2 (Cloudflared WARP)" type = string default = "t3.micro" } variable "key_name" { description = "SSH for EC2" type = string } variable "aws_region" { description = "AWS Region" type = string default = "eu-central-1" } # ----------------------------- # Cloudflared Tunnel routing # ----------------------------- variable "private_cidr" { description = "CIDR network to be routed through Cloudflared Tunnel" type = string default = null } # ----------------------------- # WARP Connector vars # ----------------------------- variable "enable_warp" { type = bool default = false } variable "warp_cidr" { description = "CIDR network to be routed through WARP Connector" type = string default = null } variable "create_virtual_network" { description = "Should I create a Virtual Network for WARP (so that I can attach a route later)" type = bool default = false } variable "warp_virtual_network_name" { description = "Name of the Virtual Network to create in Cloudflare" type = string default = "" } variable "warp_virtual_network_comment" { description = "Comment for the Virtual Network to be created" type = string default = "virtual net for WARP" } variable "warp_team" { description = "Cloudflare WARP Team (the domain of your Zero Trust organization, e.g., tech.cloudflareaccess.com)" type = string default = "" } variable "secret_name" { type = string default = "" } |
/infra/terraform/modules/cloudflared-zero-trust/templates/user_data_cloudflared.sh.tpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/bash set -eux # -------------------------- # 1. Устанавливаем AWS CLI и jq # -------------------------- yum update -y yum install -y awscli jq # -------------------------- # 2. Переменные, переданные из Terraform # -------------------------- TUNNEL_ID="${TUNNEL_ID}" TUNNEL_CRED_PARAM="${TUNNEL_CRED_PARAM}" REGION="${REGION}" ACCOUNT_ID="${ACCOUNT_ID}" mkdir -p /etc/cloudflared # -------------------------- # 3. Формируем credentials.json через jq # -------------------------- cat <<EOF > /etc/cloudflared/credentials.json $( jq -n \ --arg id "${TUNNEL_ID}" \ --arg sec "${TUNNEL_CRED_PARAM}" \ --arg acct "${ACCOUNT_ID}" \ '{TunnelID: $id, TunnelSecret: $sec, AccountTag: $acct}' ) EOF # -------------------------- # 4. Формируем config.yml # -------------------------- cat > /etc/cloudflared/config.yml <<EOF tunnel: ${TUNNEL_ID} credentials-file: /etc/cloudflared/credentials.json warp-routing: enabled: true EOF # -------------------------- # 5. Скачиваем и устанавливаем cloudflared # -------------------------- curl -L -o /usr/local/bin/cloudflared \ https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x /usr/local/bin/cloudflared # -------------------------- # 6. Регистрируем и запускаем cloudflared как сервис # -------------------------- cloudflared service install systemctl enable cloudflared systemctl start cloudflared |
/infra/terraform/modules/cloudflared-zero-trust/templates/user_data_warp.sh.tpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#!/bin/bash set -eux # -------------------------- # 0. Переменные из Terraform (из templatefile) # -------------------------- CF_API_TOKEN="${CF_API_TOKEN}" CF_ACCOUNT_ID="${CF_ACCOUNT_ID}" TUNNEL_NAME="${TUNNEL_NAME}" WARP_CIDR="${WARP_CIDR}" # -------------------------- # 1. Устанавливаем WARP CLI и утилиты # -------------------------- tee /etc/yum.repos.d/cloudflare-warp.repo << 'EOF' [cloudflare-warp] name=Cloudflare WARP baseurl=https://pkg.cloudflareclient.com/rpm enabled=1 gpgcheck=1 gpgkey=https://pkg.cloudflareclient.com/pubkey.gpg EOF yum update -y yum install -y cloudflare-warp jq sysctl -w net.ipv4.ip_forward=1 # -------------------------- # 2. Генерируем вспомогательный скрипт (нужен из-за того что user_data не воспринимает переменные назначаемые в скрипте, # поэтому используется этот костыль, с экранированием переменных и запуском отдельного скрипта) # -------------------------- tee /tmp/register_warp_connector.sh << 'EOB' #!/bin/bash set -eux resp=$(curl -sSX POST "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/warp_connector" \ -H "Authorization: Bearer ${CF_API_TOKEN}" \ -H "Content-Type: application/json" \ --data '{"name":"'"${TUNNEL_NAME}-warp"'","network":"'"${WARP_CIDR}"'"}') CONNECTOR_TOKEN=$$(echo "$$resp" | jq -r '.result.token') if [[ -z "$$CONNECTOR_TOKEN" || "$$CONNECTOR_TOKEN" == "null" ]]; then echo "ERROR: не удалось получить WARP Connector Token" echo "RESPONSE: $$resp" exit 1 fi systemctl enable warp-svc systemctl restart warp-svc # ждём IPC-сокет for i in {1..15}; do if [ -S /run/cloudflare-warp/warp_service ]; then echo "warp_service socket is up" break fi sleep 1 done warp-cli --accept-tos connector new "$$CONNECTOR_TOKEN" warp-cli connector route add "${WARP_CIDR}" warp-cli --accept-tos connect EOB # -------------------------- # 3. Меняем $$ → $ для внутренних переменных # -------------------------- sed -i 's/\$\$/$/g' /tmp/register_warp_connector.sh # -------------------------- # 4. Делаем исполняемым и запускаем # -------------------------- chmod +x /tmp/register_warp_connector.sh bash /tmp/register_warp_connector.sh |
/infra/terraform/modules/cloudflared-zero-trust/README.md
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
нужно создать в cloudflare token со следующими правами: Cloudflare One Networks:Edit, Cloudflare One Connector: WARP:Edit, Cloudflare One Connector: cloudflared:Edit, Cloudflare Tunnel:Edit, Access: Service Tokens:Edit, Zero Trust:Edit, Account Settings:Read, Access: Apps and Policies:Edit создать секрет с 2мя переменными: cloudflare_account_id (это аккаунт id от нашего аккаунта в котором у нас zero trust) cloudflare_api_token (это токен который мы создани на уровне аккаунта) если ставим wapr то этот модуль запускаем 2 раза. 1 раз создастся ec2 отработает скрипт user data и будет создан warp tunnel 2 запуск получит id этого warp tunnel и будет создан route в cloudflare так же у warp есть особенность, хоть в user data и стоит команда warp-cli --accept-tos connect, но после инсталла нужно подключаться к серверу и руками запустить warp-cli --accept-tos connect, при этом пропадёт доступ по ssh но для warp сервера есть ssm. Ребут этого сервера проходит нормально, т.е. ручной запуск warp-cli --accept-tos connect он разовый |
для корректной работы создан во всех аккаунт aws secret cloudflare-zero-trust
в котором 2 переменные,
cloudflare_account_id - это аккаунт id который берём из клаудфлейра вот тут:
cloudflare_api_token - это токен который создаём тут:
вот с такими правами:
запуск модуля с terraform
/infra/infrastructure/aws/prod/cloudflared-zero-trust.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
module "cloudflare_tunnel_main" { source = "../../../terraform/modules/cloudflared-zero-trust" secret_name = "cloudflare-zero-trust" # --- Cloudflare --- tunnel_name = "tunnel-prod" # --- AWS --- vpc_id = "vpc-0ae749c02f09ff3" subnet_id = "subnet-0231d2514ff7c76" # подсеть для EC2 Cloudflared instance_type = "t2.micro" key_name = "work" private_cidr = "10.119.0.0/16" # Маршрут Cloudflared Tunnel (основная приватная сеть) # --- WARP Connector (опционально) --- enable_warp = false } |
tunnel_name - на основе этого имени будет создаваться тунель в cloudflare и ec2 instance в aws (может быть любым)
private_cidr - это подсеть нашей VPC
enable_warp - мы выключаем так как warp tunnel нужен только в одном аккаунте
subnet_id - это сабнет где запускаем наши ec2 instance
secret_name - имя секрета в котором id аккаунта и токен
instance_type - хватает free tier тачки
key_name - это наш приватный ssh ключ с помощью которого мы можем подключаться к ec2 instance
теперь рассмотрим установку как cloudflared tunnel так и warp tunnel в infrastructure cluster но запуск будет из terragrunt
/infra/terragrunt/infrastructure/eu-central-1/infra/cloudflare-zero-trust/terragrunt.hcl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
include "root" { path = find_in_parent_folders() expose = true merge_strategy = "deep" } include "cloudflared_zero_trust" { path = find_in_parent_folders("cloudflared_zero_trust.hcl") expose = true merge_strategy = "deep" } include "env" { path = find_in_parent_folders("env.hcl") expose = true merge_strategy = "deep" } terraform { source = "${get_path_to_repo_root()}/terraform/modules//cloudflared-zero-trust" } dependency "vpc" { config_path = "../common/aws-vpc" mock_outputs_allowed_terraform_commands = ["init", "validate", "plan", "destroy"] mock_outputs = { vpc_id = "vpc-0f5b1b5f788888888" vpc_cidr = "10.0.0.0/16" vpc_private_subnets = ["10.0.0.0/16"] vpc_public_subnets = ["10.0.0.0/16"] vpc_intra_subnets = ["10.0.0.0/16"] } } generate "providers_versions" { path = "versions.tf" if_exists = "overwrite" contents = <<EOF terraform { required_version = ">= 1.7.0" } EOF } inputs = { aws_region = include.env.locals.region secret_name = include.cloudflared_zero_trust.locals.secret_name vpc_id = dependency.vpc.outputs.vpc_id instance_type = include.cloudflared_zero_trust.locals.instance_type key_name = include.cloudflared_zero_trust.locals.key_name tunnel_name = include.cloudflared_zero_trust.locals.tunnel_name private_cidr = include.cloudflared_zero_trust.locals.private_cidr subnet_id = include.cloudflared_zero_trust.locals.subnet_id enable_warp = include.cloudflared_zero_trust.locals.enable_warp warp_cidr = include.cloudflared_zero_trust.locals.warp_cidr create_virtual_network = include.cloudflared_zero_trust.locals.create_virtual_network warp_virtual_network_name = include.cloudflared_zero_trust.locals.warp_virtual_network_name warp_team = include.cloudflared_zero_trust.locals.warp_team } |
/infra/terragrunt/infrastructure/eu-central-1/infra/cloudflared_zero_trust.hcl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
locals { tunnel_name = "tunnel-infrastructure" private_cidr = "10.115.0.0/16" subnet_id = "subnet-01e683f698a842" secret_name = "cloudflare-zero-trust" instance_type = "t2.micro" key_name = "worker" enable_warp = "true" warp_cidr = "10.115.0.0/19" create_virtual_network = "true" warp_virtual_network_name = "warp-vinet" warp_team = "tech.cloudflareaccess.com" } |
для cloudflared переменные все те же самые, а вот переменные которые нужны для запуска warp tunnel
enable_warp - включаем warp
warp_cidr - это subnet в рамках которой запущен warp tunnel
create_virtual_network - включаем создание виртульной сети - она необходима чтобы при подключении к warp tunnel трафик мог достучаться до cloudflared tunnel
warp_virtual_network_name - имя виртуальной сети (может быть любым)
warp_team - имя организации, которое создаётся в панели cloudflare при создании zero-trust
запускаем аплай из директории /infra/terragrunt/infrastructure/eu-central-1/infra/cloudflare-zero-trust
у Warp инсталяции есть особенность, после первого запуска будет создан ec2 instance, в котором через curl POST запросом будет создан warp tunnel, для создания route нужно ещё раз запустить terragrunt apply, тогда будет получен ID от warp tunnel и будет создан route.
такой костыль сделан потому что на момент создания в провайдере ещё нет соответствующего resource.
если тунель минуты 2,3 не переходит в статус HEALTHY то тогда нужно подключиться к ec2 instance и выполнить команду warp-cli --accept-tos connect
после этого может пропасть доступ по ssh но для этого instance подключена роль с ssm
так же отмечу что для всех instance я не использовал жёстко заданные ami - при установке используются самые новые на момент запуска.