Chặn quảng cáo theo kiểu Pihole bằng Cloudflare Gateway Zero Trust, kết hợp rule Allow ưu tiên cao hơn rule Block — tất cả trong một workflow duy nhất.
| Variable | Mô tả | Ví dụ |
|---|---|---|
GITHUB_TOKEN |
GitHub Personal Access Token (cần quyền Workflow, không hết hạn) | ghp_xxxxxxxxxxxx |
GITHUB_USER |
Tên tài khoản GitHub của bạn | luxysiv |
GITHUB_REPO |
Tên repository của bạn | Cloudflare-Gateway-DNS-Filter |
WORKFLOW_ID |
Tên file workflow | main.yml |
-
Nên chọn private repository khi deploy.
-
Sau khi deploy xong, bạn có thể xoá repository đã clone.
-
Nếu nhận được email thông báo Github Action bị dừng, đừng lo — dùng Cloudflare Workers bên trên để script chạy mãi mãi.
Script quản lý hai tập rule DNS trên Cloudflare Gateway trong một lần chạy duy nhất:
| Rule | Hành động | Độ ưu tiên | Nguồn dữ liệu |
|---|---|---|---|
[AdBlock-DNS-Filters] Block Ads |
block | 1000 | adlist.ini + dynamic_blacklist.txt |
[AdAllow-DNS-Filters] Allow |
allow | 999 (ưu tiên cao hơn) | whitelist.ini + dynamic_whitelist.txt |
[AdBlock-DNS-Filters] Block Ads (SNI) (tuỳ chọn) |
block | 1000 | Dùng lại chính list block ở trên |
Vì rule Allow có số độ ưu tiên thấp hơn (999 < 1000), Cloudflare đánh giá nó trước — tên miền được cho phép luôn được phân giải kể cả khi nằm trong danh sách chặn. Script không cần trừ whitelist khỏi blocklist nữa.
Script cũng kiểm tra giới hạn 300 lists của gói miễn phí Cloudflare Gateway (tính tổng cả block lẫn allow). Nếu vượt quá, script dừng lại trước khi gọi bất kỳ API nào.
Bộ lọc DNS bình thường có một điểm yếu: nếu thiết bị/app không dùng DNS mặc định của mạng (tự đổi sang DNS-over-HTTPS riêng, hoặc gọi thẳng bằng IP), nó né được hoàn toàn bộ lọc.
SNI (Server Name Indication) là tên miền được gửi dạng chưa mã hoá ngay trong bước bắt tay TLS, trước khi HTTPS được thiết lập. Bật thêm rule lọc theo SNI nghĩa là Cloudflare Gateway soi thẳng vào bước bắt tay đó, độc lập với DNS — nên dù thiết bị né DNS bằng cách nào, kết nối tới domain bị chặn vẫn bị cắt.
Cách bật:
- Thêm biến môi trường/Actions variable
ENABLE_SNI_FILTER=true. - Vào Cloudflare Zero Trust dashboard → Settings → Network → bật Gateway proxy for TCP. Thiếu bước này thì rule vẫn được tạo nhưng không có tác dụng gì.
- Thiết bị phải kết nối qua WARP client (chế độ Gateway with WARP) — chỉ đổi DNS server thôi thì SNI rule sẽ không chạm được vào traffic.
Rule SNI dùng lại đúng list domain của rule block DNS, không tạo thêm list mới nên không tốn thêm hạn mức 300 list.
-
Account ID — lấy từ URL:
https://dash.cloudflare.com/?to=/:account/workers -
API Token — tạo tại
https://dash.cloudflare.com/profile/api-tokensvới 3 quyền:Account.Zero Trust : EditAccount.Account Firewall Access Rules : EditAccount.Access: Apps and Policies : Edit
Tạo CF_API_TOKEN như sau:
Vào https://github.com/<username>/Cloudflare-Gateway-DNS-Filter/settings/secrets/actions và thêm:
| Secret | Giá trị |
|---|---|
CF_API_TOKEN |
API Token vừa tạo |
CF_IDENTIFIER |
Account ID của bạn |
Secret Github Action như sau:
Danh sách chặn — chỉnh sửa lists/adlist.ini:
[Ad-Urls]
Adguard = https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txtDanh sách cho phép — chỉnh sửa lists/whitelist.ini:
[Allow-Urls]
MyAllow = https://example.com/my-whitelist.txtCả hai file đều chấp nhận URL thuần (mỗi dòng một URL) hoặc định dạng INI [Section] key = url.
Vào https://github.com/<username>/Cloudflare-Gateway-DNS-Filter/settings/variables/actions và thêm:
| Name | Value |
|---|---|
ADLIST_URLS |
Các URL blocklist cách nhau bằng dấu cách |
WHITELIST_URLS |
Các URL allowlist cách nhau bằng dấu cách |
DYNAMIC_BLACKLIST |
Tên miền chặn thêm, mỗi dòng một tên |
DYNAMIC_WHITELIST |
Tên miền cho phép thêm, mỗi dòng một tên |
ENABLE_SNI_FILTER |
true để bật thêm rule chặn theo SNI (xem mục bên trên) |
- Bạn nên thêm danh sách tùy chỉnh vào Action variables để không bị mất khi pull cập nhật repo.
Các bạn cần phân biệt bộ lọc DNS và bộ lọc browser. Nhiều bạn đem bộ lọc browser lên chạy dẫn đến lỗi lướt web — bộ lọc browser chứa các quy tắc CSS/cosmetic không dùng được cho DNS.
- Mở Termux và chạy lần lượt các lệnh sau:
yes | pkg upgrade
yes | pkg install python-pip
yes | pkg install git
git clone https://github.com/<username>/Cloudflare-Gateway-DNS-Filter.git- Di chuyển vào thư mục vừa clone:
cd Cloudflare-Gateway-DNS-Filter- Chỉnh file
.env(bắt buộc):
nano .envSau khi chỉnh xong, nhấn CTRL + X, rồi Y, rồi ENTER để lưu.
- Chạy lệnh để tải lên (cập nhật) danh sách DNS:
python -m src run- Chạy lệnh để xoá danh sách DNS:
python -m src leave-
Tải file ZIP của repository từ nút Code → Download ZIP trên GitHub.
-
Giải nén file vừa tải.
-
Chỉnh các giá trị trong
.env,lists/adlist.ini,lists/whitelist.ini... -
Mở Termux và chạy:
yes | pkg upgrade
yes | pkg install python-pip
termux-setup-storage-
Cho phép Termux truy cập bộ nhớ.
-
Di chuyển vào thư mục chứa source code đã giải nén:
cd storage/downloads/Cloudflare-Gateway-DNS-Filter-main- Chạy lệnh để tải lên (cập nhật) danh sách DNS:
python -m src run- Chạy lệnh để xoá danh sách DNS:
python -m src leaveNếu gặp lỗi trong quá trình cài đặt, tham khảo termux-change-repo để đổi nguồn Termux.
-
Giới hạn của Cloudflare Gateway Zero Trust free là 300 lists (block + allow cộng lại), mỗi list 1.000 tên miền — tối đa 300.000 domains. Script tự dừng nếu vượt giới hạn.
-
Các bạn đã tải danh sách bằng script khác thì nên xoá đi bằng tính năng xoá của script đó hoặc xoá tay.
-
Để xoá toàn bộ lists và rules do script này tạo ra, vào main.yml và đổi lệnh:
- name: Cloudflare Gateway Zero Trust
run: python -m src leave- Hỗ trợ dynamic_blacklist.txt và dynamic_whitelist.txt để tự chặn hoặc bỏ chặn tên miền theo ý thích.
👌 Chúc các bạn thành công!
👌 Mọi thắc mắc về script, các bạn có thể mở issue.

