bibica
Senior Member
Serverless Edge DNS Gateway là dịch vụ chuyển tiếp DNS-over-HTTPS (DoH) trên hạ tầng Cloudflare, với tính năng chặn quảng cáo, tối ưu hóa ECS và chuyển hướng DNS, khá tương đồng với Cloudflare Gateway, nhưng Serverless Edge DNS Gateway cài đặt, quản lý đơn giản, tính năng đầy đủ hơn
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
Bật tắt các tính năng tùy nhu cầu sử dụng, ví dụ cần tắt IPv6 thì
Các quy tắc chi tiết:
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
Sử dụng hàng ngày, thấy cần chặn thêm cái gì, hoặc thấy chặn nhầm cái gì, thêm vào danh sách tương ứng, sử dụng 1-2 tuần sẽ có bộ lọc ổn định
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 dùng < 300 request, trông có vẻ như Cloudflare Functions chỉ tính request mỗi khi kết nối tới DNS, còn các request phân giải từ DNS thì không tính
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
Bạn có thể mua các subdomain Việt Nam, dạng
Lười quá dùng domain miễn phí
Mặc định Serverless Edge DNS Gateway dùng khá ít request, dùng cá nhân hoặc < 10 thiết bị cá nhân nghĩ thoải mái, nếu nhu cầu dùng nhiều thiết bị hơn, hoặc chia sẽ cho team, nhóm này nọ .... có thể tạo nhiều tài khoản Cloudflare (Github) miễn phí, 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
Tạo 1 cron chạy qua Cloudflare Pages, nội dung mẫu ở đây
Bạn nào sử dụng hàng ngày, gặp vấn đề gì, có thể comment trực tiếp tại topic này, vui lòng giải thích tình huống cụ thể, vì DNS rất khó bắt bệnh và giả lập tình huống lỗi, cá nhân khi chạy mosdns-x, khi coi các video youtube có thời gian 1-3 ngày, cứ coi tầm 5-10h, thi thoảng youtube sẽ đơ, 5-6s sau mới buffer, mà coi video ngắn, thời lượng 30-60 phút thì không bao giờ gặp tình huống này ... báo cáo lại tác giả, họ cũng không hiểu vì sao, bản thân họ sử dụng không gặp tình huống như thế .... hay khi chạy trên iOS/iPadOS không thấy vấn đề gì, mà chạy Windows lại thi thoảng ngáo ngáo ... nên nếu gặp vấn đề gì, cố gắng nói chi tiết tình huống sử dụng, để tôi có thể giả lập lại tình huống đó
Về mặt lý thuyết, chạy qua Cloudflare Pages độ ổn định sẽ kém hơn so với chạy trực tiếp qua Cloudflare DNS / Google DNS / Cloudflare Gateway, vì trung bình 1 năm Cloudflare Pages sẽ ngáo sảng, sập vài phút (cá biệt sau mỗi 3-5 năm sẽ có thời điểm Cloudflare sập siêu nặng, thậm chí vài giờ), có điều nếu so với chuyện bạn tự build qua VPS, tự quản trị, tự bảo mật ... độ ổn định khi chạy qua Serverless Edge DNS Gateway thường sẽ tốt hơn
So với việc cấu hình, cài đặt cloudflare-gateway-pihole-scripts trên Cloudflare Gateway, Serverless Edge DNS Gateway cấu hình, cài đặt nhanh hơn, tính năng mạnh hơn, quan trọng nhất ECS trả về chính xác ngang ngửa Google DNS
Bới ra để phàn nàn, là nó chạy qua 1 tầng proxy (Cloudflare Pages), nên chỉ chạy qua được DoH, không hỗ trợ DoT và IP, dùng trên Android cấu hình hơi lằng nhằng, và không cấu hình IP được trên router đời cũ, trên Windows/Mac/iOS/iPadOS cấu hình trực tiếp, sẽ hiệu quả hơn
Cá nhân đang duy trì thèng
Bài giới thiệu, giải thích hơi dài dòng, user thông thường, tạo tài khoản, Fork Repository -> Triển khai lên Cloudflare Pages, trung bình 5-10 phút là có thể sử dụng được rồi
Demo
Trang demo: Serverless Edge DNS Gateway (https://serverless-edge-dns-gateway.bibica.net/)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, có thể sử dụ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 (ECS) giúp các CDN Akamai, CloudFront, Fastly, BunnyCDN, Gcore ... điều hướng đến máy chủ gần nhất hiệu quả hơn
- 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 máy chủ CDN mong muốn (Bilibili, TikTok, Medium…)
- Chặn quảng cáo: sử dụng các bộ lọc 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): có thể bỏ các truy vấn không cần thiết (
ANY,AAAA,PTR,HTTPS) 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) 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), các domain github định tuyến qua Mullvad sẽ hiệu quả hơn
- 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, có thể sử dụng nhiều tài khoản Cloudflare khác nhau để tăng hạn mức 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)
Lý do tôi tạo ra Serverless Edge DNS Gateway
Dùng Cloudflare Gateway tạo DNS location có 1 vấn đề khá khó chịu, khi bạn bật ECS, Cloudflare dùng 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 khắc phục vấn đề này bằng cách sử dụng IP của người dùng làm ECS
- Nhờ cách này, ECS trên Serverless Edge DNS Gateway trả về, chính xác tương tương Google DNS (một trong các dịch vụ hỗ trợ CDN qua ECS tốt nhất)
- Ví dụ:
www.bilibili.tvtrả về tùy lúc CNAMEwww.bilibili.tv.w.cdngslb.comhoặca1346.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.comnhưng cần kết quả trả về theo domainrocket.net(nhà mạng chặn nhẹ medium.com sẽ vào được)
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), sẽ chậm hơn (10ms - 20ms) so với chạy trực tiếp qua Cloudflare Gateway, 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ính1. Fork Repository
- Fork dự án
serverless-edge-dns-gatewayvề tài khoản GitHub của bạn - Truy cập tab
Actionstrong repository bạn vừa fork và nhấnI understand my workflows, go ahead and enable them - Chọn và
Enablethủ công 2 workflows:Update DNS BlocklistsvàDelete old workflow runs
2. Triển khai lên Cloudflare Pages
- Vào Workers & Pages > Pages > Create application > Connect to Git (link vào nhanh)
- Chọn repository bạn vừa Fork.
- Build Settings: mặc định (không cần điền hay chỉnh sửa gì).
- Nhấn Save and Deploy.
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ườngCấ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 dùng luôn là được- Các cài đặt nằm ở phần đầu của file
functions/[[path]].js
UPSTREAM_PRIMARY , UPSTREAM_FALLBACK, tự quản trị sẽ an toàn hơn, còn lười thì dùng mặc định cũng đượcTham số / Cấu hình | Giá trị | Mô tả |
BLOCK_AAAA | false | Chặn bản ghi IPv6 (buộc định tuyến qua IPv4). |
BLOCK_HTTPS | false | Chặn truy vấn Type 65 (giúp tăng tốc độ phân giải). |
BLOCK_ANY | false | Chặn các truy vấn ANY tiêu tốn tài nguyên. |
BLOCK_PTR | false | 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 tắt IPv6 thì
BLOCK_AAAA sửa lại thành true- Nếu chỉ sử dụng IPv4, có thể tắt
ANY,AAAA,PTR,HTTPS, giúp giảm lượng request không cần thiết, lười thì cứ để mặc định
DEBUG_ENABLED mặc định tắt, khi mới cài đặt lần đầu, có thể bật lên, giúp kiểm tra các cấu hình tại /debug, xem các giá trị trả về có đúng như cấu hình khôngQuản lý quy tắc (Rules)
Các quy tắc nằm trong thư mụcrules. 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ờ quaupdate_lists.sh.- Cơ chế: nếu một domain nằm trong allowlists.txt, sẽ luôn được cho phép kể cả khi có trong blocklists.txt (tránh việc các bộ lọc blocklists 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, sẽ chặn app.adsoctopus.com (không chặn adsoctopus.com)
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
Sử dụng hàng ngày, thấy cần chặn thêm cái gì, hoặc thấy chặn nhầm cái gì, thêm vào danh sách tương ứng, sử dụng 1-2 tuần sẽ có bộ lọc ổn định
private_tlds.txt: các domain nội bộ hoặc URL router của riêng bạn- Cơ chế:
localsẽ chặndomain.local,sub.domain.local... - Cách cấu hình: thêm, sửa trực tiếp, mỗi domain 1 dòng
- Cơ chế:
tk sẽ chặn tất cả domain .tk, dùng cơ chế này để chặn các domain rác cũng đượcredirect_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, phân cách bởi khoảng cách) - Ví dụ:
www.bilibili.tv www.bilibili.tv.w.cdngslb.com - -> www.bilibili.tv chỉ 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, mỗi domain 1 dòng
- Định dạng:
DNS redirect/rewrite hiếm khi cần tùy chỉnh, vì CDN sẽ tự điều chỉnh dựa vào ECS, ECS chính xác thì kết quả trả về thường chính xác, chế độ này thường dùng trên 1 số domain đặc thù, kiểu medium.com rocket.net giúp user dùng nhà mạng tại VN truy cập được vào medium.com, đôi lúc nhà mạng của bạn gặp vấn đề với 1 dịch vụ CDN nào đó, có thể tự định tuyến sang CDN khác cho phù hợpmullvad_upstream.txt: domain bắt buộc phân giải qua Mullvad DNS- Cách cấu hình: thêm, sửa trực tiếp, mỗi domain 1 dòng
github.com, vì 1 số lý do không giải thích được, phân giải qua Cloudflare hay Google ... đôi lúc nó trả về server đang bị sập, dùng Mullvad DNS thì không gặp tình huống này ... hoặc trên 1 số domain check DNS như dnscheck.tools, nếu bạn không muốn lộ ECS, thêm domain đó vào mullvad_upstream.txt- Bạn có thể fork dự án gốc, sửa lại các bộ lọc, rule cho phù hợp với nhu cầu cá nhân, team, nhóm, sau đó nếu thành viên nào trong nhóm cần dùng, nói họ fork dự án của bạn, với các tùy chỉnh có sẵn, sẽ rất nhanh
Bảo mật
Serverless Edge DNS Gateway chạy qua DoH, nhận kết quả từ Cloudflare Gateway / Mullvad, lọc kết quả (chặn quảng cáo, redirect/rewrite) qua Cloudflare Pages, sau đó chuyển kết quả cuối tới User, toàn bộ quá trình đều trên cơ sở hạ tầng Cloudflare, mọi thứ đều được Cloudflare bảo vệ, không cần làm gì thêmCloudflare Requests
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
Custom domain
Cá nhân đề xuất sử dụng domain riêng, không dùng domain miễn phí*.pages.dev, vì không chắc các domain này có bị Cloudflare giới hạn khi chạy 24/24/365 liên tục không
Bạn có thể mua các subdomain Việt Nam, dạng
.name.vn, .io.vn … chi phí tầm 20.000 vnđ / 1 năm, dùng cho thoải mái, đỡ phải kiếm các dịch vụ miễn phí domain mà không biết lúc nào lăn quay ra sập, hoặc có thể vào tld-list.com, xem domain nào gia hạn rẻ nhất thì dùngLười quá dùng domain miễn phí
*.pages.dev cũng được, có điều cá nhân không dùng, nên không chắc chạy hàng ngày có ổn định không?Bonus: dùng cùng lúc nhiều tài khoản Cloudflare Pages
Phần này nói thêm, bạn nào chạy hàng ngày mà thấy hết request hãy quan tâm :]]Mặc định Serverless Edge DNS Gateway dùng khá ít request, dùng cá nhân hoặc < 10 thiết bị cá nhân nghĩ thoải mái, nếu nhu cầu dùng nhiều thiết bị hơn, hoặc chia sẽ cho team, nhóm này nọ .... có thể tạo nhiều tài khoản Cloudflare (Github) miễn phí, 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
Mã:
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
- 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
Mã:
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
- 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
Góc nhờ vã, báo cáo lỗi
Serverless Edge DNS Gateway thiết kế đơn giản tuyệt đối để hạn chế mọi lỗi có thể phát sinh, các lỗi gặp phải trong gần 2 tháng thử nghiệm đã xử lý rồiBạn nào sử dụng hàng ngày, gặp vấn đề gì, có thể comment trực tiếp tại topic này, vui lòng giải thích tình huống cụ thể, vì DNS rất khó bắt bệnh và giả lập tình huống lỗi, cá nhân khi chạy mosdns-x, khi coi các video youtube có thời gian 1-3 ngày, cứ coi tầm 5-10h, thi thoảng youtube sẽ đơ, 5-6s sau mới buffer, mà coi video ngắn, thời lượng 30-60 phút thì không bao giờ gặp tình huống này ... báo cáo lại tác giả, họ cũng không hiểu vì sao, bản thân họ sử dụng không gặp tình huống như thế .... hay khi chạy trên iOS/iPadOS không thấy vấn đề gì, mà chạy Windows lại thi thoảng ngáo ngáo ... nên nếu gặp vấn đề gì, cố gắng nói chi tiết tình huống sử dụng, để tôi có thể giả lập lại tình huống đó
Kết luận
Serverless Edge DNS Gateway do chạy trên Cloudflare Pages nên nhiều thứ thiết kế khá ngu học, mỗi khi chạy “lần đầu”, phải load 3MB - 5MB danh sách bộ lọc, tổng thể tốc độ ổn định, trung bình ~50ms – 80ms, sử dụng thực tế không có gì phàn nàn
Về mặt lý thuyết, chạy qua Cloudflare Pages độ ổn định sẽ kém hơn so với chạy trực tiếp qua Cloudflare DNS / Google DNS / Cloudflare Gateway, vì trung bình 1 năm Cloudflare Pages sẽ ngáo sảng, sập vài phút (cá biệt sau mỗi 3-5 năm sẽ có thời điểm Cloudflare sập siêu nặng, thậm chí vài giờ), có điều nếu so với chuyện bạn tự build qua VPS, tự quản trị, tự bảo mật ... độ ổn định khi chạy qua Serverless Edge DNS Gateway thường sẽ tốt hơn
So với việc cấu hình, cài đặt cloudflare-gateway-pihole-scripts trên Cloudflare Gateway, Serverless Edge DNS Gateway cấu hình, cài đặt nhanh hơn, tính năng mạnh hơn, quan trọng nhất ECS trả về chính xác ngang ngửa Google DNS
Bới ra để phàn nàn, là nó chạy qua 1 tầng proxy (Cloudflare Pages), nên chỉ chạy qua được DoH, không hỗ trợ DoT và IP, dùng trên Android cấu hình hơi lằng nhằng, và không cấu hình IP được trên router đời cũ, trên Windows/Mac/iOS/iPadOS cấu hình trực tiếp, sẽ hiệu quả hơn
Cá nhân đang duy trì thèng
doh.bibica.net trên logic gốc của Serverless Edge DNS Gateway, dùng 1-2 tháng nay, tổng thể mọi thứ ổn định, không có gì để phàn nànBài giới thiệu, giải thích hơi dài dòng, user thông thường, tạo tài khoản, Fork Repository -> Triển khai lên Cloudflare Pages, trung bình 5-10 phút là có thể sử dụng được rồi
Sửa lần cuối:


