IP и ASN

Автоматический мониторинг IP-подсети: чёрные списки, геолокация и RPKI с оповещениями в Telegram

5 шагов 14 мин чтения 37 просмотров 0
Содержание

Арендованная IP-подсеть может сменить статус без предупреждения: адрес попадает в чёрный список из-за одного клиента, база геолокации «переносит» диапазон в другую страну, а изменение ROA делает ваш анонс невалидным. Узнавать об этом от пользователей спустя недели — дорого. В этой статье мы соберём небольшой скрипт мониторинга, который ежедневно проверяет каждый адрес ваших подсетей по основным DNS-блэклистам, сравнивает геолокацию с ожидаемой страной, проверяет RPKI и присылает сообщение в Telegram, когда что-то меняется.

Spamhaus не отвечает на запросы, отправленные через крупные публичные резолверы вроде 8.8.8.8 или 1.1.1.1 (вместо ответа приходит код ошибки 127.255.255.254). Выполняйте проверки через собственный резолвер на сервере, как в шаге 1. Бесплатный сервис Spamhaus предназначен для небольших объёмов и некоммерческого использования; для коммерческого мониторинга зарегистрируйтесь в Spamhaus Data Query Service (DQS).

Шаг 1: Установка собственного DNS-резолвера

# Debian / Ubuntu
apt install -y unbound dnsutils jq curl
systemctl enable --now unbound

# Test: a listed test address must return 127.0.0.x through the local resolver
dig +short 2.0.0.127.zen.spamhaus.org @127.0.0.1

Ответ 127.0.0.2 (и другие) для тестового адреса 127.0.0.2 подтверждает, что проверки по чёрным спискам работают.

Шаг 2: Как работают запросы к DNSBL

Чтобы проверить 203.0.113.10 по зоне чёрного списка, запишите октеты в обратном порядке и добавьте зону. Отсутствие ответа (NXDOMAIN) означает, что адреса в списке нет; ответ из диапазона 127.0.0.0/8 означает листинг, а последний октет показывает, в каком именно списке.

dig +short 10.113.0.203.zen.spamhaus.org @127.0.0.1
# 127.0.0.2 / .3       SBL / CSS (spam sources)
# 127.0.0.4 – .7       XBL (exploited hosts, malware)
# 127.0.0.9            DROP (hijacked or criminal ranges)
# 127.0.0.10 / .11     PBL (policy: not expected to send mail directly; not a sign of abuse)
# 127.255.255.x        query error (public resolver, rate limit), not a listing

Шаг 3: Создание скрипта мониторинга

mkdir -p /opt/ipmon
cat > /opt/ipmon/blocks.txt <<'EOF2'
# prefix          expected country   origin ASN
203.0.113.0/24    JP                 AS64500
198.51.100.0/24   KR                 AS64500
EOF2

cat > /opt/ipmon/check.sh <<'EOF2'
#!/bin/bash
# Daily IP block check: DNSBL listings, geolocation and RPKI. Prints problems only.
ZONES="zen.spamhaus.org bl.spamcop.net psbl.surriel.com dnsbl-1.uceprotect.net"
grep -v '^#' /opt/ipmon/blocks.txt | while read -r PREFIX CC ASN; do
  [ -z "$PREFIX" ] && continue
  BASE=${PREFIX%.*}                      # works for /24 blocks: 203.0.113
  IFS=. read -r a b c _ <<< "$PREFIX"
  for d in $(seq 1 254); do
    for z in $ZONES; do
      r=$(dig +short +time=2 +tries=1 "$d.$c.$b.$a.$z" @127.0.0.1 | head -1)
      case "$r" in
        127.255.255.*|"") ;;                                   # error or not listed
        127.0.0.10|127.0.0.11) ;;                              # Spamhaus PBL: policy list, ignore
        127.*) echo "LISTED $BASE.$d on $z ($r)";;
      esac
    done
  done
  # Geolocation of a few sample addresses
  for d in 1 64 128 200 254; do
    got=$(curl -s --max-time 10 "https://ipinfo.io/$BASE.$d/country" | tr -d '[:space:]')
    [ -n "$got" ] && [ "$got" != "$CC" ] && echo "GEO $BASE.$d is $got, expected $CC"
  done
  # RPKI status of the announcement
  st=$(curl -s --max-time 20 "https://stat.ripe.net/data/rpki-validation/data.json?resource=$ASN&prefix=$PREFIX" | jq -r '.data.status')
  [ "$st" != "valid" ] && echo "RPKI $PREFIX from $ASN is $st"
done
EOF2
chmod +x /opt/ipmon/check.sh
/opt/ipmon/check.sh

Если всё в порядке, скрипт ничего не выводит. Он рассчитан на блоки /24; более крупные блоки разбейте на строки по /24. Полный /24 по четырём зонам — это около тысячи DNS-запросов: проверка занимает несколько минут, что вполне допустимо раз в сутки.

Шаг 4: Отправка оповещений в Telegram

Создайте Telegram-бота и узнайте свой chat ID, как описано в статье мониторинг Uptime Kuma с оповещениями в Telegram. Затем оберните проверку в небольшой скрипт отправки, который пишет вам только тогда, когда есть находки:

cat > /opt/ipmon/run.sh <<'EOF2'
#!/bin/bash
TOKEN="123456:ABC-your-bot-token"
CHAT="123456789"
OUT=$(/opt/ipmon/check.sh 2>&1)
if [ -n "$OUT" ]; then
  curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
       --data-urlencode "chat_id=$CHAT" \
       --data-urlencode "text=IP block check $(hostname) $(date +%F):
$OUT" >/dev/null
fi
EOF2
chmod 700 /opt/ipmon/run.sh

# Every day at 07:30
echo '30 7 * * * root /opt/ipmon/run.sh' > /etc/cron.d/ipmon

Шаг 5: Реагирование на результаты

  • Листинг в чёрном списке: выясните, какой сервер или клиент использует адрес, устраните причину (часто это взломанный сервер или неправильно настроенный почтовый скрипт), затем запросите удаление на сайте чёрного списка (см. проверка IP в чёрных списках и удаление из них).
  • Изменилась геолокация: проверьте свой geofeed и отправьте исправление в базу, где произошло изменение (см. исправление геолокации IP). Если блок арендован, сообщите арендодателю.
  • Статус RPKI не valid: проверьте, что в ROA указаны правильная ASN и максимальная длина префикса (см. ROA и RPKI). Невалидный маршрут многие сети могут начать отбрасывать уже в течение нескольких часов.

Частые вопросы

Все адреса показываются как внесённые в Spamhaus

Ваши запросы идут через публичный или общий резолвер, который Spamhaus блокирует; такие ответы — это ошибки, а не листинги. Убедитесь, что скрипт использует @127.0.0.1 при запущенном unbound, либо используйте ключ DQS.

Почему листинги PBL игнорируются?

Spamhaus PBL содержит диапазоны, с которых не ожидается прямая отправка почты в интернет. Это список политик, а не признак злоупотреблений; IP, с которых действительно отправляется почта, можно исключить из него на сайте Spamhaus.

Можно ли добавить другие чёрные списки?

Да, добавьте зоны в ZONES. Сначала ознакомьтесь с правилами использования каждого списка: некоторые требуют регистрации для автоматических запросов, а некоторые вносят целые диапазоны по причинам, не связанным с вашим собственным поведением.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите ваши IP-подсети, вывод скрипта и чёрный список или базу данных, которые сообщают о проблеме, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства