Serverless Edge DNS Gateway – chặn quảng cáo, sửa lỗi ECS Việt Nam và điều hướng CDN với Cloudflare Pages

Serverless Edge DNS Gateway là dịch vụ DNS-over-HTTPS (DoH) bảo mật, hiệu năng cao, chạy trên hạ tầng Edge toàn cầu của Cloudflare Pages, tối ưu tốc độ truy cập, chặn quảng cáo, tối ưu hóa ECS, bỏ qua giới hạn địa lý và chuyển hướng DNS, khá tương đồng với Cloudflare Gateway mà mình từng giới thiệu, nhưng Serverless Edge DNS Gateway cài đặt nhanh hơn, quản lý đơn giản, tính năng hay hiệu quả cũng tốt hơn

Tính năng nổi bật

  • Mức độ sử dụng miễn phí: chạy hoàn toàn trên gói Free của Cloudflare Pages với hạn mức 100,000 requests mỗi ngày. Với mức tiêu thụ trung bình 200 – 4000 requests/thiết bị/ngày, bạn có thể sử dụng khoảng 10-20 thiết bị trên cùng một tài khoản (thậm chí 100-200 thiết bị nếu dùng thông thường)
  • Tối ưu hóa vị trí địa lý: tự động chèn EDNS Client Subnet (IPv4 /24, IPv6 /48) giúp các CDN như Akamai, CloudFront, Fastly, BunnyCDN, Gcore điều hướng đến máy chủ gần nhất hiệu quả hơn
  • Điều hướng DNS (DNS redirect/rewrite): công cụ ép định tuyến domain A sang domain B bằng bản ghi CNAME, giúp tùy chỉnh cụm máy chủ CDN mong muốn (Bilibili, TikTok, Medium…)
  • Chặn quảng cáo: lọc quảng cáo bằng các bộ lọc nổi tiếng như AdGuard, ABPVN, 1Hosts … được cập nhật tự động mỗi giờ (có thể tùy chỉnh riêng bộ lọc nếu cần)
  • Độ tin cậy cao với hệ thống dự phòng:
    • Primary/Fallback: tự động chuyển sang máy chủ dự phòng nếu máy chủ chính gặp sự cố
    • Geo-Bypass: tự động phát hiện kết quả bị chặn địa lý (trả về 127.0.0.1 khi bật ECS Việt Nam), phân giải lại qua Mullvad DNS sẽ giải quyết được vấn đề này (nikke-en.com)
  • Bộ lọc truy vấn sớm (Edge Filtering): Loại bỏ các truy vấn không cần thiết (ANYAAAAPTRHTTPS) ngay tại Edge để tiết kiệm tài nguyên và tăng tốc độ phản hồi.
  • Lớp bảo vệ TLD nội bộ: ngăn rò rỉ các domain nội bộ (như .local.lan, trang quản trị router) ra môi trường internet bằng cách trả về NXDOMAIN ngay lập tức.
  • Tên miền riêng sử dụng Mullvad Upstream: dùng trên các domain cụ thể khi muốn hoàn toàn ẩn danh (không gửi ECS), Github định tuyến qua Mullvad sẽ hiệu quả hơn so với Google/Cloudflare DNS
  • Hỗ trợ custom domain: dễ dàng gắn tên miền riêng để có địa chỉ DNS ngắn gọn, chuyên nghiệp, bạn có thể sử dụng nhiều tài khoản Cloudflare khác nhau để tăng hạn mức (x100k/tài khoản) mà vẫn dùng được tên miền tùy chỉnh (đang áp dụng cho doh.bibica.net)
  • Tự động tạo trang hướng dẫn sử dụng và file cấu hình .mobileconfig (áp dụng cho các thiết bị chạy iOS/iPadOS)

Dùng Cloudflare Gateway DNS location có 1 vấn đề khá khó chịu, khi bạn bật ECS, Cloudflare tự định tuyến cụm server gần nhất làm IP subnet, đôi khi nó định tuyến sai, user ở Hồ Chí Minh lại dùng ECS tại Hà Nội, Serverless Edge DNS Gateway đã sửa lại để sử dụng IP của người dùng làm ECS

  • Nhờ cách này, các IP Serverless Edge DNS Gateway trả về, chính xác tương tương Google DNS

Một tính năng thêm vào là điều hướng DNS (DNS redirect/rewrite) giúp tùy chỉnh CNAME theo ý muốn

  • Ví dụwww.bilibili.tv trả về tùy lúc CNAMEwww.bilibili.tv.w.cdngslb.com hoặc a1346.v.akamai.net
  • Serverless Edge DNS Gateway có thể ép www.bilibili.tv luôn sử dụng www.bilibili.tv.w.cdngslb.com
  • Hoặc ở tình huống đặc thù hơn, truy cập domain medium.com nhưng cần kết quả trả về theo domain rocket.net (nhà mạng chặn nhẹ medium.com sẽ vào được)

Trên các domain hay dùng, nếu hỗ trợ nhiều CDN, bạn có thể tự tùy chỉnh lại CNAME về dịch vụ CDN tối ưu, đây là tính năng redirect mình biết tới khi dùng Mosdns-x, dùng quen rồi không có thì hơi khó chịu

Khuyết điểm

  • Thiếu DoT là khuyết điểm lớn nếu bạn dùng Android, cá nhân dùng iOS nên bỏ qua vấn đề này, phần vì dùng Cloudflare Pages làm proxy, chỉ có thể chạy được DoH, không có cách xử lý
  • Vì phải đi qua 1 tầng proxy (kèm 1001 cơ chế lọc, check, chặn), lý thuyết sẽ chậm hơn 1 chút so với chạy trực tiếp DNS thông thường, có điều thực tế sử dụng, kiểm tra qua dnscheck.tools đôi lúc xuống được ~40ms thì không có gì để phàn nàn
  • Lệ thuộc hoàn toàn vào cơ sở hạ tầng từ Cloudflare, Github, 2 cụ này mà sập thì oẳng luôn :]]

Hướng dẫn cài đặt

Để việc cài đặt đơn giản, tránh nhầm lẫn, nên tạo mới tài khoản Github và Cloudflare, có 100.000 request miễn phí mỗi ngày, không ảnh hưởng tới tài khoản chính

1. Fork Repository

  1. Fork dự án serverless-edge-dns-gateway về tài khoản GitHub của bạn
  2. Truy cập tab Actions trong repository bạn vừa fork và nhấn I understand my workflows, go ahead and enable them
  3. Chọn và Enable thủ công 2 workflows: Update DNS Blocklists và Delete old workflow runs

2. Triển khai lên Cloudflare Pages

  1. Vào Workers & Pages > Pages > Create application > Connect to Git (link vào nhanh)
  2. Chọn repository bạn vừa Fork.
  3. Build Settings: mặc định (không cần điền hay chỉnh sửa gì).
  4. Nhấn Save and Deploy.

Lúc này, bạn có thể vào thẳng domain tạo ra bởi Cloudflare Pages, đã có thể dùng được ngay

Việc sử dụng Serverless Edge DNS Gateway tương tự như mọi dịch vụ DoH khác, cấu hình .mobileconfig trên Apple (iOS/macOS) được tự động tạo ra, download về cài đặt bình thường

Cấu hình

Các thông số cấu hình đã được tối ưu sẵn theo mặc định, bạn nào muốn thay đổi cấu hình, tùy chỉnh danh sách bộ lọc … thì mới cần đọc phần này, dùng thông thường cài đặt rồi dùng luôn là được

Trên các CDN Akamai, nên dùng Cloudflare Gateway DNS location, đảm bảo trả về kết quả CDN chính xác khi chạy qua Cloudflare Pages proxy.

Bạn có thể sử dụng upstreams mặc định có sẵn, hoặc tự tạo DNS locations riêng trong tài khoản Cloudflare của mình.

Các cài đặt nằm ở phần đầu của file functions/[[path]].js

Hằng số Mặc định Mô tả
UPSTREAM_PRIMARY Cloudflare Gateway URL DoH máy chủ phân giải chính
UPSTREAM_FALLBACK Cloudflare Gateway URL DoH máy chủ phân giải dự phòng
UPSTREAM_GEO_BYPASS dns.mullvad.net Dùng khi máy chủ chính (hoặc dự phòng) trả về 127.0.0.1

Có thể tạo DoH Cloudflare Gateway riêng tại DNS locations, rồi thay vào UPSTREAM_PRIMARYUPSTREAM_FALLBACK dùng cho thoải mái, lười cứ dùng Cloudflare Gateway có sẵn, như nhau cả

Trên Serverless Edge DNS Gateway, đề xuất sử dụng UPSTREAM_PRIMARY, UPSTREAM_FALLBACK là Cloudflare Gateway DNS location, vì nó tối ưu riêng ECS cho upstreams này

Hằng số Mặc định Mô tả
BLOCK_AAAA true Chặn bản ghi IPv6 (buộc định tuyến qua IPv4).
BLOCK_HTTPS true Chặn truy vấn Type 65 (giúp tăng tốc độ phân giải).
BLOCK_ANY true Chặn các truy vấn ANY tiêu tốn tài nguyên.
BLOCK_PTR true Chặn truy vấn DNS ngược.
BLOCK_PRIVATE_TLD true Chặn các domain nội bộ hoặc router.
ECS_INJECTION_ENABLED true Bật ECS Injection (cần thiết để trả về đúng CDN).

Bật tắt các tính năng tùy nhu cầu sử dụng, ví dụ cần dùng IPv6 thì BLOCK_AAAA sửa lại thành false

Loại bỏ truy vấn ANYAAAAPTRHTTPS và các domain nội bộ ngay tại Edge không giúp hiệu năng tốt hơn, vì cơ sở hạ tầng Cloudflare mạnh điên, chủ yếu hạn chế request không cần thiết, bạn nào cần dùng tính năng nào thì mớ lại là được

Hằng số Mặc định Mô tả
DEBUG_ENABLED false Mặc định tắt kiểm tra tại /debug

Mới dùng, cần kiểm tra các tùy chọn, bật tắt chỉnh sửa, có thể bật debug lên, kiểm tra cấu hình, danh sách blocklist, allowlist … xem load ra đúng chưa, thấy hệ thống ổn định rồi thì tắt đi cho đỡ request rác

{
  "upstreams": {
    "primary": "https://bu0eg1tdzu.cloudflare-gateway.com/dns-query",
    "fallback": "https://rhpcv957tj.cloudflare-gateway.com/dns-query",
    "geoBypass": "https://dns.mullvad.net/dns-query"
  },
  "adBlock": {
    "enabled": true,
    "blocklist": 229678,
    "allowlist": 20,
    "lastFetch": "2026-04-15T23:43:19.538Z"
  },
  "ecs": {
    "enabled": true,
    "prefixV4": "/24",
    "prefixV6": "/48"
  },
  "blockedTypes": {
    "ANY": true,
    "AAAA": true,
    "PTR": true,
    "HTTPS": true
  },
  "privateTld": {
    "enabled": true,
    "entries": 39
  },
  "dnsRedirect": {
    "enabled": true,
    "rules": 17
  },
  "mullvadUpstream": {
    "enabled": true,
    "entries": 10
  }
}

Danh sách blocklist hơn 228k dòng ~ 5MB mà Cloudflare Pages vẫn chạy ngọt, không gặp vấn đề gì về hiệu năng hay tốc độ

Hằng số Mặc định Mô tả
MULLVAD_UPSTREAM_ENABLED true Các domain ở trong rules/mullvad_upstream.txt sẽ chạy trực tiếp qua dns.mullvad.net

Đây là tính năng mới thêm vào, ban đầu nghĩ là không cần, mà khi sử dụng, vẫn thấy các domain Github, thi thoảng hơi lag, dùng trực tiếp Mullvad cho an tâm

Quản lý quy tắc (Rules)

Các quy tắc nằm trong thư mục rules/. Khi bạn thực hiện thay đổi và commit lên GitHub, Cloudflare Pages sẽ tự động đồng bộ và áp dụng cấu hình mới (có thể vào /debug kiểm tra sau vài phút)

Các quy tắc chi tiết:

  • blocklists.txt / allowlists.txt: được cập nhật tự động mỗi giờ qua update_lists.sh.
    • Cơ chế: nếu một domain nằm trong allowlists.txt, nó sẽ luôn được cho phép kể cả khi có trong blocklists.txt (giúp tránh việc các bộ lọc khác chặn nhầm).
    • Quản lý theo domain chính xác điền vào, ví dụ trong blocklists.txt, có app.adsoctopus.com, thì sẽ chặn chính xác app.adsoctopus.com, không chặn adsoctopus.com
    • Cách cấu hình: Thay đổi các URL trong lệnh curl bên trong file update_lists.sh để thêm hoặc bớt các bộ lọc blocklists/allowlists

Chú ý: không sửa trực tiếp 2 file blocklists.txt / allowlists.txt có sẵn, hãy tạo mới các file .txt trong dự án tại Github, rồi thêm đường dẫn vào danh sách update_lists.sh, cần chỉnh gì sửa gì sẽ ở các file .txt mới này

  • private_tlds.txt: các domain nội bộ hoặc URL router của riêng bạn
    • Cơ chế: local sẽ chặn domain.local, sub.domain.local
    • Cách cấu hình: thêm, sửa trực tiếp, mỗi domain 1 dòng, mặc định không cần sửa gì file này
  • redirect_rules.txt: danh sách điều hướng DNS (DNS redirect/rewrite)
    • Định dạng: domain-nguon domain-dich (mỗi rule sẽ là 1 dòng)
    • Ví dụ: www.bilibili.tv www.bilibili.tv.w.cdngslb.com
    • Hiệu quả: www.bilibili.tv luôn sử dụng kết quả trả về từ www.bilibili.tv.w.cdngslb.com
    • Cách cấu hình: thêm, sửa trực tiếp

Bạn có thể fork, sửa lại các bộ lọc, rule cho phù hợp với nhu cầu của cá nhân, team, nhóm, sau đó nếu thành viên nào trong nhóm cần dùng, thì nói họ fork dự án của bạn, với các tùy chỉnh có sẵn

Về mặt lý thuyết, bạn có thể thêm các rule tự động từ Github Action, chỉnh sửa lại thời gian chạy các bộ lọc, để tạo ra 1 số tính năng, như chỉ cho phép vào youtube, tiktok từ 6h-8h tối, các giờ khác không cho truy cập

Bảo mật và riêng tư

Toàn bộ dự án đều chạy trên cơ sở hạ tầng Cloudflare, Github, các cơ chế bảo mật đều không cần thiết, nếu ngại request bị tốn thì thêm các Security rules/ Zero Trust chặn tới /dns-query, /debug là được

Ở mức độ người dùng, khi bạn dùng DNS từ 1 dịch vụ nào đó, như ở đây là Cloudflare, Mullvad sẽ “có thể” biết bạn truy cập tới trang nào, vào giờ nào … dù thường các log này đều siêu rác, bạn nào coi đó là vấn đề riêng tư, không muốn bất cứ ai biết, thì không dùng các sản phẩm dạng này …. nói nghiêm túc cũng chẳng giải quyết được cái gì, vì khi bạn truy cập 1 trang bất kì, mà trang đó dùng Cloudflare để bảo vệ, thì bản thân Cloudflare cũng đã biết rồi

Cloudflare Requests

Đây là thức phức tạp và gây căng thẳng nhất, cá nhân cố gắng hạn chế các request, nhưng thực tế serverless, nó chạy, tắt, rất tùy hứng, các rule khi chạy dù load vào RAM rồi, nhưng nếu hết RAM hoặc vì 1001 lý do, nó vẫn sẽ tắt, chạy lại …. ban đầu nghĩ không đủ request, nhưng thực tế lại khá bất ngờ

Cách Cloudflare tính request Functions rất lạ, cá nhân dùng 3 thiết bị, kiểm tra trong 24h, trung bình chỉ dùng < 300 request, quá ảo luôn, trông có vẻ như họ chỉ tính mỗi khi kết nối tới DNS, còn các request phân giải từ DNS đi không tính, nên request mới ít như thế

Theo cách tính request như này, 1 tài khoản miễn phí thậm chí có thể đáp ứng 100-200 người dùng cùng lúc (300-600 thiết bị) mà vẫn không lo chạm tới giới hạn

Bonus: dùng cùng lúc nhiều tài khoản Cloudflare Pages

Về mặt lý thuyết, bạn có thể tạo 3-5 tài khoản Cloudflare (Github) miễn phí (hoặc nhiều hơn tùy thích), cài đặt như thông thường, sau đó custom domain muốn dùng vào từng tài khoản Cloudflare Pages, mỗi tài khoản sẽ có 1 URL tương tự như sau

serverless-edge-dns-gateway-0ei.pages.dev
serverless-edge-dns-gateway-tui.pages.dev
serverless-edge-dns-gateway-zzz.pages.dev
......
serverless-edge-dns-gateway-09h.pages.dev

Tạo 1 cron chạy qua Cloudflare Pages, nội dung mẫu ở đây

  • Vào API Tokens tạo 1 token với quyền Zone.DNS, điền vào CF_API_TOKEN
  • Vào phần quản trị domain sẽ thấy Zone ID, thay vào CF_ZONE_ID
  • Để lấy giá trị CF_RECORD_ID cho domain cần đổi, ví dụ muốn lấy ID cho domain doh.bibica.net, chạy lệnh bên dưới

Thay CF_ZONE_ID, CF_API_TOKEN, doh.bibica.net bằng các thông tin của bạn

curl -s -X GET "https://api.cloudflare.com/client/v4/zones/CF_ZONE_ID/dns_records?name=doh.bibica.net" \
     -H "Authorization: Bearer CF_API_TOKEN" \
     -H "Content-Type: application/json" | jq -r '.result[0].id'
  • CF_RECORD_ID sẽ có định dạng kiểu b7f08f1db45f1abb23cc71c04bfc9782

Xong xuôi deploy cron này vào Cloudflare Worker, tạo Trigger Events cho chạy sau 5 phút hoặc 1h gì tùy thích

  • Rule hoạt động rất đơn giản, nó kiểm tra xem CNAME đang dùng là gì, rồi lấy CNAME tiếp theo có trong danh sách, cứ tuần tự đổi
Thành công! Vừa đổi từ [serverless-edge-dns-gateway-0ei.pages.dev] sang -> [serverless-edge-dns-gateway-tui.pages.dev]
  • Nếu bạn đủ rảnh để tạo tầm 100 tài khoản thì chắc đủ đáp ứng cho 20.000 người cùng sử dụng mà không lo hết request

Dùng cá nhân 1 người 1 tài khoản là thừa, dùng cho team, công ty này nọ tầm trăm người, tạo 3-5 tài khoản dùng cho thoải mái, dù lý thuyết 1 tài khoản cũng đủ

Kết luận

Serverless Edge DNS Gateway do chạy serverless trên Cloudflare Pages nên rất nhiều thứ thiết kế khá là ngu học, mỗi khi chạy “lần đầu”, phải load rất nhiều dữ liệu như danh sách bộ lọc, nhưng tốc độ vẫn ổn định, trung bình ~50ms – 80ms, thực tế các tính năng đang có ở Serverless Edge DNS Gateway đều là các rule mình dùng đó giờ trên Mosdns-X, bê vào dùng lại thôi

Bới ra để phàn nàn, chạy kiểu này chỉ hỗ trợ DoH, không có DoT hay IP, thiết bị chạy Android cần dùng 1 ứng dụng ngoài, tốn pin hơn, còn lại cá nhân tạm không biết chê cái gì


Related Posts

Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.

• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.

✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!