Giám sát blacklist: script, API và cảnh báo qua webhook
Giám sát danh sách đen nghĩa là định kỳ truy vấn nhiều danh sách chặn DNS (DNSBL) cho các IP và tên miền gửi thư của bạn, và chỉ phát cảnh báo khi kết quả thay đổi. Phát hiện việc bị liệt kê ngay khi nó xảy ra, thay vì khi khách hàng báo thư bị trả về, giúp bạn có thời gian tìm nguyên nhân và yêu cầu gỡ trước khi thiệt hại lan rộng.
Có hai cách thực tế để làm việc này: tự chạy một script nhỏ bằng dig và cron, hoặc giao việc kiểm tra cho một dịch vụ thông qua API và webhook. Dù chọn cách nào, có hai chi tiết quyết định việc công cụ giám sát có phản ánh đúng sự thật hay không: các truy vấn gửi qua resolver công cộng bị những danh sách như Spamhaus từ chối và cho ra câu trả lời gây hiểu nhầm, và mã lỗi tuyệt đối không được tính là mục liệt kê.
Các quy tắc của đơn vị vận hành danh sách được trích dẫn ở đây dựa trên trang chính thức của họ tính đến tháng 11 năm 2026. Chính sách có thể thay đổi, vì vậy hãy xác nhận trước khi dựa vào một cấu hình. Để tìm hiểu nền tảng về cách hoạt động của DNSBL, xem DNSBL (RBL) là gì.
Xác định đối tượng cần theo dõi và danh sách cần truy vấn
Hãy bắt đầu bằng việc ghi lại những đối tượng bạn thực sự cần theo dõi.
- Địa chỉ IP gửi thư. Đây là những địa chỉ mà máy chủ thư hoặc nhà cung cấp email của bạn thực sự dùng để gửi. Trang web và thư của bạn thường đi ra từ các máy khác nhau, vì vậy hãy xác nhận địa chỉ trong các header Received của một thư bạn đã gửi. Nếu bạn gửi qua IPv6, hãy giám sát cả những địa chỉ đó.
- Tên miền. Tên miền trong địa chỉ From và mọi tên miền xuất hiện trong các liên kết bên trong thư của bạn. Tên miền được kiểm tra trên các danh sách chặn tên miền, vốn tách biệt với danh sách IP.
Định dạng truy vấn được định nghĩa trong RFC 5782. Với IPv4, bạn đảo ngược các octet và nối thêm vùng (zone) của danh sách, nên 192.0.2.99 trên một danh sách sẽ thành 99.2.0.192 theo sau là tên vùng. Với IPv6, địa chỉ được viết thành 32 nibble thập lục phân theo thứ tự ngược. Tên miền thì chỉ cần đặt phía trước vùng. Một mục bị liệt kê trả về bản ghi A, theo quy ước nằm trong 127.0.0.0/8; mục không bị liệt kê trả về NXDOMAIN. RFC cũng lưu ý rằng danh sách nên công bố bản ghi TXT giải thích lý do liệt kê.
Hãy theo dõi nhiều danh sách thay vì chỉ một, vì không phải bên nhận nào cũng dùng cùng các danh sách. Ý nghĩa của từng mã trả về khác nhau tùy đơn vị vận hành; hướng dẫn của chúng tôi về mã trả về DNSBL trình bày các mã thường gặp.
Vì sao resolver công cộng cho câu trả lời sai
Một lỗi phổ biến trong các hệ thống giám sát tự xây dựng là gửi truy vấn qua resolver công cộng như Google Public DNS (8.8.8.8) hoặc Cloudflare (1.1.1.1). Câu hỏi thường gặp chính thức về cách dùng DNSBL của Spamhaus giải thích điều gì xảy ra:
- Việc dùng miễn phí các DNSBL của Spamhaus đòi hỏi mục đích phi thương mại và truy vấn không đến từ resolver công cộng hoặc resolver mở, hay từ một IP có DNS ngược chung chung.
- Qua các resolver mở miễn phí như Google Public DNS, trong hầu hết trường hợp truy vấn sẽ nhận được phản hồi không bị liệt kê (NXDOMAIN). Nói cách khác, một IP bị liệt kê có thể trông như sạch.
- Truy vấn qua resolver công cộng cũng có thể nhận được 127.255.255.254. Đó là mã lỗi, không phải mục liệt kê. Tương tự, 127.255.255.252 nghĩa là tên DNSBL bị gõ sai, và 127.255.255.255 nghĩa là số lượng truy vấn quá mức. Spamhaus nêu rằng không được hiểu các mã này là đối tượng được truy vấn đang bị liệt kê.
- Các resolver viết lại câu trả lời NXDOMAIN sẽ trả về một địa chỉ IP thay thế, nên bạn không bao giờ thấy được NXDOMAIN đúng.
Khuyến nghị hàng đầu của trang câu hỏi thường gặp là tự vận hành resolver DNS riêng. Với người dùng buộc phải dùng resolver công cộng, Spamhaus giới thiệu Data Query Service (DQS); hãy xem điều khoản của dịch vụ này để biết phần nào miễn phí. Trang này gợi ý dùng dig txt whoami.fastly.net để xem bạn thực sự đang dùng resolver nào.
RFC 5782 bổ sung một bước tự kiểm tra có sẵn: danh sách IPv4 phải chứa mục cho 127.0.0.2 và không được chứa 127.0.0.1, và máy khách nên định kỳ kiểm tra các mục kiểm thử này để xác nhận danh sách đang hoạt động. Trong ví dụ của Spamhaus, 2.0.0.127.zen.spamhaus.org trả về 127.0.0.10, 127.0.0.4 và 127.0.0.2, còn 1.0.0.127.zen.spamhaus.org trả về NXDOMAIN. Công cụ giám sát nên kiểm tra điều này trước và bỏ qua lần chạy nếu kiểm tra thất bại.
Cách 1: script dig và cron
Dưới đây là một script tối giản kiểm tra một địa chỉ IPv4 trên Spamhaus ZEN và SpamCop (bl.spamcop.net, mà theo tài liệu của SpamCop sẽ trả về 127.0.0.2 cho IP bị liệt kê). Hãy thay địa chỉ và các vùng bằng của bạn.
#!/bin/sh
# Truy vấn qua resolver đệ quy của chính bạn (ví dụ unbound trên cùng máy), không bao giờ dùng resolver công cộng
RESOLVER=127.0.0.1
IP=192.0.2.10
ZONES="zen.spamhaus.org bl.spamcop.net"
REV=$(echo "$IP" | awk -F. '{print $4"."$3"."$2"."$1}')
q() {
out=$(dig +time=3 +tries=1 @"$RESOLVER" "$1" A) || { echo ERR; return; }
case "$out" in
*"status: NOERROR"*) a=$(printf '%s\n' "$out" | awk '$4=="A"{print $5}'); echo "${a:-NX}" ;;
*"status: NXDOMAIN"*) echo NX ;;
*) echo ERR ;;
esac
}
for Z in $ZONES; do
# Nếu mục kiểm thử 127.0.0.2 không phân giải ra mã liệt kê, đừng tin kết quả của lần chạy này
case "$(q "2.0.0.127.$Z")" in
127.255.255.*|NX|ERR) echo "$Z ERROR test-entry"; continue ;;
127.*) ;;
*) echo "$Z ERROR test-entry"; continue ;;
esac
A=$(q "$REV.$Z")
case "$A" in
NX) echo "$Z CLEAN" ;;
ERR) echo "$Z ERROR no-answer" ;;
127.255.255.*) echo "$Z ERROR $A" ;;
127.*) echo "$Z LISTED $A" ;;
*) echo "$Z ERROR unexpected $A" ;;
esac
doneScript này làm những việc sau:
- Chỉ trạng thái NXDOMAIN mới được tính là sạch, 127.255.255.x là lỗi, và mọi giá trị 127.x khác là mục liệt kê. Bất cứ giá trị nào nằm ngoài 127.0.0.0/8 đều được coi là bất thường, chẳng hạn do resolver viết lại câu trả lời.
- Khi hết thời gian chờ (timeout), dig thoát với mã khác không (non-zero), còn SERVFAIL và REFUSED thoát với mã 0. Không trường hợp nào trong số đó được coi là sạch; script ghi nhận là lỗi.
- Mã trả về là riêng của từng danh sách. Ví dụ, một số danh sách dùng 127.0.0.1 để báo rằng truy vấn bị từ chối, vì vậy hãy đọc tài liệu của từng danh sách bạn thêm vào và mở rộng câu lệnh case khi cần.
Sau đó, để cron so sánh mỗi lần chạy với lần trước và chỉ gửi thư khi có thay đổi:
# Ví dụ: chạy mỗi giờ, chỉ gửi thư khi kết quả khác với lần chạy trước
0 * * * * /usr/local/bin/dnsbl-watch.sh > /var/tmp/dnsbl.now 2>&1; cmp -s /var/tmp/dnsbl.now /var/tmp/dnsbl.prev || mail -s "DNSBL status changed" you@example.com < /var/tmp/dnsbl.now; mv /var/tmp/dnsbl.now /var/tmp/dnsbl.prevChu kỳ mỗi giờ chỉ là ví dụ. Spamhaus cung cấp quyền truy cập miễn phí cho mục đích phi thương mại với lưu lượng thấp, và các máy khách vượt ngưỡng lưu lượng truy vấn của họ cần dùng phương án trả phí; hãy kiểm tra điều khoản của từng danh sách khi số IP được giám sát tăng lên. Trang câu hỏi thường gặp cũng khuyên nên thử lệnh vài lần để xác nhận kết quả không đổi.
Cách 2: API hàng loạt và webhook của DNSBL Checker
Nếu bạn không muốn tự duy trì resolver và các quy tắc phân tích riêng cho từng danh sách, bạn có thể để một dịch vụ chạy việc kiểm tra. Dưới đây là API v1 của trang này, chỉ trong phạm vi những gì phần triển khai phía máy chủ thực sự làm. Tài liệu tham chiếu nằm tại /en/api-docs và khóa được cấp trên trang thành viên tại /account. Đăng ký chỉ cần địa chỉ email, và bạn đăng nhập bằng liên kết được gửi qua email.
Xác thực và giới hạn
- Khóa bắt đầu bằng
dnsbl_và chỉ được hiển thị một lần, ngay sau khi cấp; hệ thống chỉ lưu giá trị băm. Cấp lại khóa sẽ làm khóa trước đó mất hiệu lực. - Gửi khóa trong header
X-API-Keyở mọi yêu cầu. Chỉ hỗ trợ HTTPS; http:// thông thường sẽ bị chuyển hướng sang https://, vì vậy hãy gọi https:// ngay từ đầu. - Giới hạn là 1.000 lượt kiểm tra mỗi ngày (mỗi đối tượng tính là một lượt), 100 đối tượng mỗi lô và 50 lượt đăng ký giám sát. Khi vượt giới hạn hằng ngày, bạn nhận được
429kèmdaily_limit_exceededvà mốc thời gianresets_at.
Kiểm tra hàng loạt
Gửi một mảng targets gồm tên miền hoặc địa chỉ IP tới POST /api/v1/batch:
curl -X POST https://dnsblchecker.com/api/v1/batch \
-H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
-d '{"targets":["example.com"]}'Nếu còn đối tượng nào cần kiểm tra, phản hồi sẽ là 202 kèm batch_id. Gọi GET /api/v1/batch/{batch_id} vài giây một lần cho đến khi status là done (ví dụ rút gọn; các con số và tên danh sách chỉ để minh họa, không phải kết quả thật):
{
"batch_id": 1, "status": "done", "created": "2026-11-03 09:10:41", "count": 1, "pending": 0,
"results": [
{
"target": "example.com", "type": "domain",
"status": "done", "verdict": "listed",
"checked_at": "2026-11-03 09:12",
"lists_checked": 80, "listed_count": 1, "error_count": 4,
"listed_on": [
{ "list": "ZapBL RHSBL", "zone": "rhsbl.zapbl.net", "response": "127.0.0.2" }
]
}
]
}verdictlàlistednếu có ít nhất một danh sách báo bị liệt kê, ngược lại làclean. Các danh sách bị hết thời gian chờ, hoặc trả lời bằng mã lỗi như 127.255.255.x, được tính vàoerror_countvà không bao giờ được tính là mục liệt kê.- Một lô sẽ trả về kết quả đã lưu nếu có kết quả trong 30 ngày gần nhất. Với giám sát định kỳ, hãy luôn xem
checked_at. - Các đối tượng sai định dạng được trả về trong
rejectedkèm lý do và không bị tính lượt. Nếu bạn truyền một URL, chỉ phần tên host được sử dụng. Các dải chỉ dùng cho tài liệu như 192.0.2.0/24 bị từ chối, vì vậy hãy kiểm thử bằng một IP gửi thư thật.
Giám sát qua webhook
Đăng ký một target và một callback_url bằng POST /api/v1/monitors. Sau đó, mỗi đối tượng đã đăng ký được kiểm tra một lần mỗi ngày mà không dùng bộ nhớ đệm (lần kiểm tra đầu tiên chạy trong vòng khoảng một ngày sau khi đăng ký), và một yêu cầu POST dạng JSON chỉ được gửi tới URL của bạn ở lần kiểm tra đầu tiên (monitor.initial) và khi kết luận chuyển đổi giữa bị liệt kê và sạch (monitor.status_changed).
curl -X POST https://dnsblchecker.com/api/v1/monitors \
-H "X-API-Key: $DNSBL_API_KEY" -H "Content-Type: application/json" \
-d '{"target":"example.com","callback_url":"https://your-app.example/hooks/dnsbl"}'signing_secrettrong phản hồi chỉ được hiển thị một lần. Mỗi lần gửi đều kèm headerX-DNSBL-Signature: sha256=..., là HMAC-SHA256 của phần thân thô với khóa là secret đó. Hãy xác minh chữ ký ở phía bạn.callback_urlphải dùng https trên cổng 443 và phân giải tới một IP công cộng; chuyển hướng sẽ không được theo, và thời gian chờ là 10 giây, vì vậy hãy đưa các tác vụ nặng vào hàng đợi và phản hồi nhanh.- Nếu endpoint của bạn trả về bất kỳ mã nào ngoài
2xx, hoặc kết nối thất bại, việc gửi sẽ được thử lại ở lần kiểm tra hằng ngày tiếp theo. Lý do hiển thị dưới dạnglast_delivery_errortrongGET /api/v1/monitors, vàDELETE /api/v1/monitors/{monitor_id}dùng để xóa một mục giám sát.
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, request.headers.get("X-DNSBL-Signature", ""))Thiết kế cảnh báo: tần suất, nhiều danh sách và báo động giả
Công cụ giám sát chỉ hữu ích nếu sau vài tháng mọi người vẫn còn đọc cảnh báo của nó. Một công cụ báo liên tục sẽ sớm bị phớt lờ.
Tần suất
- Tách biệt tần suất truy vấn với tần suất thông báo. Truy vấn theo lịch, nhưng chỉ thông báo khi trạng thái thay đổi. Một thông báo "mọi thứ ổn" hằng ngày sẽ nhấn chìm cảnh báo duy nhất thực sự quan trọng.
- RFC 5782 cho biết TTL của danh sách nên phản ánh tốc độ thay đổi của danh sách, và danh sách các nguồn thư rác có thể dùng TTL tính bằng phút. Hãy chọn chu kỳ với hiểu biết rằng một số mục liệt kê xuất hiện và hết hạn rất nhanh.
- Truy vấn quá dày có thể vi phạm điều khoản sử dụng của danh sách hoặc khiến bạn nhận 127.255.255.255 (truy vấn quá mức) thay vì câu trả lời thật.
Nhiều danh sách
- Ghi tên danh sách trong mọi cảnh báo. Mức độ phổ biến của các danh sách đối với bên nhận là khác nhau, nên bạn có thể cảnh báo ngay với những danh sách quan trọng nhất đối với người nhận của mình và gom phần còn lại vào một bản tổng hợp.
- Webhook ở trên chỉ kích hoạt khi kết luận chuyển đổi giữa bị liệt kê và sạch. Nếu một đối tượng đã bị liệt kê rồi sau đó xuất hiện thêm trên danh sách thứ hai, sẽ không có sự kiện nào được gửi. Hãy theo dõi
last_listed_counttrongGET /api/v1/monitors, hoặc chạy một lô và đọclisted_on, để phát hiện trường hợp đó.
Dương tính giả và câu trả lời nhất thời
- Ghi nhận lỗi tách biệt với mục liệt kê. Spamhaus cảnh báo các bên vận hành không được từ chối hay lọc thư dựa trên mã lỗi của họ; logic tương tự cũng áp dụng cho việc giám sát. Hết thời gian chờ hoặc câu trả lời 127.255.255.x không bao giờ được kích hoạt cảnh báo bị liệt kê.
- Để tránh phản ứng với một kết quả bất thường đơn lẻ, chỉ cảnh báo sau hai kết quả giống nhau liên tiếp, hoặc truy vấn lại sau vài phút trước khi gửi bất cứ thông báo nào.
- Nếu lỗi kéo dài, hãy nghi ngờ resolver đã thay đổi hoặc có thay đổi từ phía danh sách, và xem kết quả của mục kiểm thử trước tiên.
- Một IP dân dụng nằm trong Spamhaus PBL là mục liệt kê theo chính sách, không phải lời buộc tội: nó có nghĩa là địa chỉ đó không nên gửi thư trực tiếp. Hãy quyết định theo từng danh sách điều gì được tính là cảnh báo (xem gỡ khỏi Spamhaus).
Cần làm gì khi phát hiện bị liệt kê
- Xác nhận lại. Kiểm tra trên trang tra cứu của chính đơn vị vận hành và ghi lại tên danh sách, thời điểm và mọi lý do được hiển thị.
- Khắc phục nguyên nhân trước. Tìm các tài khoản bị chiếm quyền, biểu mẫu web bị lợi dụng, máy bị nhiễm, việc quản lý danh sách nhận thư kém, và DNS ngược (PTR) hoặc tên HELO không khớp. Yêu cầu gỡ khi nguyên nhân vẫn còn thường dẫn đến việc bị liệt kê lại.
- Làm theo quy trình gỡ của danh sách đó. Quyết định gỡ khỏi danh sách thuộc về từng đơn vị vận hành, và việc gửi yêu cầu không phải là lời hứa rằng mục liệt kê sẽ được gỡ. Nếu bạn không kiểm soát IP, như với hosting chia sẻ, hãy liên hệ nhà cung cấp hosting hoặc ISP của bạn.
- Để công cụ giám sát xác nhận kết quả. Bên nhận cũng chạy bộ lọc riêng, vì vậy hãy tiếp tục theo dõi việc chuyển thư sau khi kết luận trở lại trạng thái sạch.
Để kiểm tra nhanh một IP hoặc tên miền, hãy dùng công cụ kiểm tra danh sách đen. Nếu việc truy tìm nguyên nhân hoặc xử lý các yêu cầu vượt quá khả năng của bạn, bạn có thể nhờ chúng tôi hỗ trợ. Để xem toàn bộ quy trình xử lý sự cố khi thư bị trả về, xem email bị chặn bởi danh sách đen.
Chúng tôi giới thiệu các nhà cung cấp nhận làm yêu cầu gỡ tên (delist), tư vấn và hỗ trợ (từ JPY 50,000). Việc gỡ tên do từng đơn vị quản lý danh sách quyết định và không thể được cam kết.
Nhận hỗ trợTrang web này có thể nhận phí giới thiệu từ các nhà cung cấp được liệt kê. About
Câu hỏi thường gặp
Tôi kiểm tra qua 8.8.8.8 và không thấy bị liệt kê. Vậy là sạch chưa?
Không hẳn. Câu hỏi thường gặp của Spamhaus cho biết truy vấn qua các resolver mở miễn phí như Google Public DNS trong hầu hết trường hợp sẽ nhận phản hồi không bị liệt kê (NXDOMAIN), nên một IP bị liệt kê có thể trông như sạch. Hãy truy vấn từ resolver của chính bạn, hoặc dùng trang tra cứu của đơn vị vận hành.
Tôi nhận được 127.255.255.254. Có phải tôi bị liệt kê?
Không. Đây là mã lỗi được trả về cho các truy vấn qua resolver công cộng hoặc resolver mở, và Spamhaus nêu rằng nó không có nghĩa là đối tượng bị liệt kê. Hãy ghi nhận nó là lỗi và không gửi cảnh báo bị liệt kê.
Tôi có thể chỉ gọi API hàng loạt mỗi ngày để làm công cụ giám sát không?
Một lô có thể trả về kết quả đã lưu tới 30 ngày trước, nên không phải lúc nào cũng là trạng thái hôm nay. Hãy kiểm tra checked_at, hoặc dùng giám sát qua webhook (POST /api/v1/monitors), vốn chạy một lần kiểm tra mới mỗi ngày.
Tôi có nên yêu cầu gỡ ngay khi có cảnh báo không?
Hãy khắc phục nguyên nhân trước. Yêu cầu gửi khi vấn đề vẫn còn thường dẫn đến việc bị liệt kê lại. Quyết định luôn thuộc về đơn vị vận hành danh sách.
Các trang chính thức được tham khảo
Thông tin trong bài viết này đã được đối chiếu với các trang chính thức dưới đây tại thời điểm đăng. Chính sách và cách vận hành có thể thay đổi mà không báo trước, vì vậy bạn hãy kiểm tra lại các trang chính thức trước khi dựa vào thông tin cho việc quan trọng.
- RFC 5782: DNS Blacklists and Whitelists
- Spamhaus FAQ: DNSBL Usage
- Spamhaus: Using our public mirrors? Check your return codes now
- SpamCop FAQ: How do I configure my mailserver to reject mail based on the blocklist?
Hướng dẫn liên quan
Cách đọc mã trả về DNSBL: ý nghĩa của 127.0.0.2 theo RFC 5782, mã của Spamhaus, SpamCop và UCEPROTECT, mã lỗi, và NXDOMAIN khác SERVFAIL thế nào.
Bị Spamhaus liệt kê? Xác định bạn nằm trong danh sách nào (ZEN, PBL, XBL, CSS, SBL, DBL), ý nghĩa của mã trả về và cách gỡ tên đúng cho từng danh sách.
Email bị chặn vì danh sách đen? Đọc mã lỗi trả lại, kiểm tra nguyên nhân theo đúng thứ tự, xác định danh sách nào quan trọng và yêu cầu gỡ đúng cách.