Khám phá Learn Stream About Jokes
WORKSHOP Foundation — Claude Code — 3 buổi, từ newbie đến tự dựng quy trình build app Đăng ký →
Bài viết

Website Cloudflare không vào được trên mạng VNPT? Thử tắt ECH

Một lỗi rất khó chịu vì nó không phải lúc nào cũng xảy ra: chỉ người dùng VNPT gặp, lúc vào được lúc không, đổi sang mạng khác thì bình thường. Thủ phạm thường là Encrypted ClientHello (ECH). Bài này là cách chẩn đoán, cách sửa bằng tay, và một script để quét-và-tắt cho hàng loạt domain.

Gần đây mình gặp một tình trạng khá lạ. Một vài website chạy trên Cloudflare bỗng dưng bị người dùng phản ánh: truy cập rất chậm, có lúc không vào được. Cái khó là nó không xảy ra với tất cả mọi người — chỉ những ai đang dùng mạng VNPT mới gặp. Cùng cái link đó, đổi sang Viettel, FPT, hay 4G/5G thì vào ngon lành.

Kiểu lỗi này rất dễ làm mình đi sai hướng, vì nó chập chờn: bạn tự test thì thấy bình thường (vì bạn không dùng VNPT), còn khách thì cứ báo lỗi. Nó cũng không để lại log gì rõ ràng ở phía server, bởi vì kết nối chết ngay từ bước bắt tay TLS — chưa kịp chạm tới worker hay origin.

Dấu hiệu nhận biết

Nếu website của bạn có đủ mấy dấu hiệu sau, khả năng cao là dính ECH:

  • Chỉ người dùng VNPT gặp lỗi.
  • Lúc vào được, lúc không — không ổn định.
  • Website dùng Cloudflare (đám mây màu cam).
  • Đổi sang mạng khác thì truy cập bình thường.

Ban đầu mình cũng nghi mấy nghi phạm quen thuộc: QUIC, DNS, IPv6. Nhưng sau khi thử tắt từng thứ, cái khiến website sống lại ổn định là khi tắt Encrypted ClientHello (ECH) trên Cloudflare.

ECH là gì, và vì sao nó gây lỗi

Khi trình duyệt bắt tay TLS với server, bước đầu tiên là gói ClientHello — trong đó có tên miền bạn muốn vào (trường SNI). Bình thường trường này để trần, ai đứng giữa đường truyền cũng đọc được bạn đang vào site nào.

ECH (Encrypted ClientHello) là tính năng mã hoá luôn cả phần đó, để nhà mạng không nhìn thấy bạn đang truy cập tên miền gì. Về mặt riêng tư thì đây là điều tốt. Nhưng vấn đề là: một số thiết bị định tuyến/thanh tra của nhà mạng — cụ thể ở đây là hạ tầng VNPT — không xử lý được gói ClientHello đã mã hoá này, và thay vì cho qua thì nó làm nghẽn hoặc rớt kết nối. Kết quả: bắt tay TLS thất bại, website không load.

Nói cách khác, đây không phải lỗi ở code hay ở origin của bạn. Nó nằm ở tầng bắt tay TLS, giữa trình duyệt của kháchedge của Cloudflare — và bạn sửa được bằng cách bảo Cloudflare đừng quảng bá ECH cho domain đó nữa.

Cách sửa bằng tay (Cloudflare API)

Điều bất ngờ là nhiều tài khoản Cloudflare không hiện nút bật/tắt ECH trong dashboard, dù API vẫn cho đổi bình thường. Nên cách chắc ăn nhất là dùng API.

Bạn cần hai thứ:

  • Zone ID: Dashboard → chọn domain → tab Overview, kéo xuống cột phải.
  • API Token: My Profile → API Tokens → Create Custom Token, cấp quyền Zone Settings: Edit.

Bước 1 — kiểm tra ECH đang bật hay tắt:

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/ech" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

Nếu trả về "value": "on" là đang bật ECH — nghi phạm số một.

Bước 2 — tắt ECH:

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ZONE_ID/settings/ech" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"value":"off"}'

Bước 3 — kiểm tra lại, thấy "value": "off" là xong. Thay đổi này ở tầng edge của Cloudflare nên có hiệu lực gần như ngay lập tức, không cần deploy lại site.

Cách kiểm chứng nhanh xem domain còn “khoe” ECH trong DNS không:

dig +short yourdomain.com HTTPS

Nếu trong kết quả không còn tham số ech=... nữa là ổn.

Script tự động: quét và tắt cho hàng loạt domain

Sửa bằng tay ổn nếu bạn có một hai domain. Nhưng mình quản lý mấy chục zone trên cùng một tài khoản Cloudflare — gõ curl từng cái vừa lâu vừa dễ sót. Nên mình gói lại thành một command dùng đi dùng lại được, tên là ech, chạy trong CLI cá nhân của mình (amy). Bản chất nó chỉ là bash + curl + jq, bạn tách ra chạy độc lập cũng được.

#!/usr/bin/env bash
# ech — bật/tắt Cloudflare Encrypted ClientHello (ECH) theo zone
# Auth: đặt biến môi trường CLOUDFLARE_API_TOKEN (quyền "Zone Settings: Edit")
set -euo pipefail

API="https://api.cloudflare.com/client/v4"
TOKEN="${CLOUDFLARE_API_TOKEN:?Cần đặt CLOUDFLARE_API_TOKEN}"

cf() { # cf METHOD PATH [BODY]
  curl -sS -X "$1" "$API$2" \
    -H "Authorization: Bearer $TOKEN" \
    ${3:+-H "Content-Type: application/json" --data "$3"}
}

# Lấy "id<TAB>name" cho mọi zone trong tài khoản (có phân trang)
all_zones() {
  local page=1 out total
  while :; do
    out="$(cf GET "/zones?per_page=50&page=$page")"
    echo "$out" | jq -r '.result[] | "\(.id)\t\(.name)"'
    total="$(echo "$out" | jq -r '.result_info.total_pages')"
    [ "$page" -ge "$total" ] && break
    page=$((page + 1))
  done
}

ech_value() { cf GET "/zones/$1/settings/ech" | jq -r '.result.value'; }

case "${1:-list}" in
  list) # quét mọi zone, in trạng thái ECH
    while IFS=$'\t' read -r id name; do
      v="$(ech_value "$id")"
      [ "$v" = "on" ] && echo "  ⚠️  $name  ECH=on" || echo "  ✅ $name  ECH=$v"
    done < <(all_zones)
    ;;
  all) # tắt ECH ở mọi zone đang bật
    while IFS=$'\t' read -r id name; do
      if [ "$(ech_value "$id")" = "on" ]; then
        cf PATCH "/zones/$id/settings/ech" '{"value":"off"}' >/dev/null
        echo "  ✅ $name — đã tắt ECH"
      fi
    done < <(all_zones)
    ;;
esac

Cách dùng:

export CLOUDFLARE_API_TOKEN="..."   # token có quyền Zone Settings: Edit
./ech list      # quét toàn bộ tài khoản, xem zone nào còn ECH=on
./ech all       # tắt ECH cho tất cả zone đang bật

Lần đầu mình chạy ./ech list, kết quả làm mình hơi giật mình: 27/31 zone vẫn đang bật ECH — trong đó có mấy site tiếng Việt lượng truy cập lớn. Nghĩa là suốt thời gian qua có thể một phần khách VNPT đã âm thầm không vào được mà mình không hề biết. Một dòng ./ech all là dọn sạch.

Không phải mọi lỗi VNPT đều do ECH

Cần nói rõ để bạn khỏi kết luận vội: tắt ECH chỉ là một phương án để thử, và nó đã sửa được cho một số site mình quản lý. Nếu tắt rồi mà vẫn lỗi, thủ phạm có thể nằm ở chỗ khác:

  • Định tuyến giữa VNPT và Cloudflare.
  • IPv6 cấu hình lệch.
  • DNS phân giải sai hoặc chậm.

Nên hãy kiểm tra từng yếu tố một, đừng đổ hết cho ECH. Và vì bản chất đây là lỗi phía khách, cách kiểm chứng thật nhất là nhờ một người đang dùng VNPT thử vào lại sau khi bạn tắt.

Tóm gọn

  • Website Cloudflare chỉ lỗi trên VNPT, chập chờn → nghi ECH trước tiên.
  • Kiểm tra và tắt qua Cloudflare API (settings/ech"off"), vì dashboard thường không có nút.
  • Nhiều domain thì dùng script quét-và-tắt một phát cho cả tài khoản.
  • Hiệu lực ngay ở edge, không cần deploy lại. Reversible — bật lại lúc nào cũng được.

Cảm ơn nhóm xvps.io đã ghi lại manh mối ECH đầu tiên. Nếu bạn đã thử cách này, chia sẻ kết quả để mọi người có thêm dữ liệu đối chiếu.

#cloudflare #vnpt #ech #devops #troubleshooting #dns #tls

Bài viết liên quan

Nâng cấp Astro 6: cái bẫy 10MB và bài học deploy cho chắc

idea

Bản nâng cấp tưởng nửa ngày hoá ra đụng một cái blocker thật: worker phình lên 53MB, vượt giới hạn 10MB của Cloudflare. Đây là cách mình gỡ, và vì sao 'build pass' không bao giờ là 'xong'.

50 năm của Email: Từ hộp thư cho người đến giao diện cho Agent

idea

Cloudflare vừa cập nhật Email Service. Điều đáng nói không phải là mức giá rẻ hơn Resend, mà là cách họ cấu trúc lại một giao thức 50 năm tuổi thành môi trường làm việc gốc cho AI.

0:00

Chia sẻ ảnh

Bắt đầu gõ để tìm kiếm...