Files

13 KiB
Raw Permalink Blame History

ipcheck-domains

Список доменов сервисов, которые определяют и проверяют IP-адрес: «какой у меня IP», тесты утечек DNS/WebRTC, GeoIP-базы и скоринг прокси/VPN.

Собирается в несколько форматов. Основной — geosite.dat (protobuf v2ray/Xray) для 3x-ui. CI на Gitea Actions пересобирает всё при каждом изменении data/ и раз в сутки по расписанию.

Если форкнули к себе — поменяйте gitea.hsrv.site/mrleo1nid/ipcheck-domains в примерах ниже и в BASE_URL внутри tools/update-geosite.sh.

Категории

Категория Что внутри
ipcheck всё вместе — то, что обычно и нужно в роутинге
ip-lookup «какой у меня IP»: 2ip, whoer, ipinfo, ifconfig.me, ipify…
leak-test тесты утечек: browserleaks, ipleak, dnsleaktest
geoip-db GeoIP-базы и справочники: maxmind, db-ip, ip2location…
fraud-score детекторы VPN/прокси: spur, scamalytics, ipqualityscore…

Скачать

Ветка release перезаписывается при каждой сборке, ссылки стабильные:

https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/<путь>
Файл Для чего
ipcheck.dat Xray / v2ray / 3x-ui — кладётся рядом со штатным geosite.dat
geosite.dat то же самое, но именем по умолчанию — если хотите заменить штатный файл
ipcheck.dat.sha256sum контрольная сумма, по ней работает автообновление
update-geosite.sh скрипт обновления для cron (см. ниже)
sing-box/<категория>.srs sing-box, скомпилированный rule-set
sing-box/<категория>.json sing-box, исходный rule-set
mihomo/<категория>.mrs mihomo, бинарный rule-provider
clash/<категория>.yaml Clash/mihomo rule-provider, behavior: domain
clash/<категория>.list Clash/mihomo rule-provider, behavior: classical
txt/<категория>.txt просто домены, по одному на строку
json/<категория>.json структурированный список с типами правил
adguard/<категория>.txt AdGuard Home / uBlock — если нужно блокировать, а не роутить
metadata.json, SHA256SUMS время сборки, счётчики, суммы по всем файлам

Плюс каждая сборка публикуется как релиз Gitea с датой в теге — там же лежит ipcheck-domains-all.tar.gz со всем содержимым dist/ разом.

3x-ui

Файл кладётся туда же, где у панели лежат geoip.dat и geosite.dat. Обычно это /usr/local/x-ui/bin (установка скриптом) или /usr/local/share/xray:

curl -fsSL -o /usr/local/x-ui/bin/ipcheck.dat https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/ipcheck.dat

Дальше в панели: Xray Settings → Routing Rules → Add Rule, поле domain:

ext:ipcheck.dat:ipcheck

и нужный outboundTag. Тем же правилом в JSON-конфиге:

{
  "type": "field",
  "domain": ["ext:ipcheck.dat:ipcheck"],
  "outboundTag": "proxy"
}

Если вы заменили штатный geosite.dat нашим файлом, синтаксис короче — geosite:ipcheck. Отдельные категории адресуются так же: ext:ipcheck.dat:leak-test.

После замены файла Xray нужно перезапустить (в 3x-ui — Restart Xray).

Автообновление на сервере

Xray читает .dat только при старте, поэтому обновление — это «скачать файл и перезапустить сервис». Этим занимается update-geosite.sh:

  • сначала тянет .sha256sum и, если сумма совпала с локальным файлом, молча выходит — ни лишней закачки, ни лишнего перезапуска Xray;
  • проверяет контрольную сумму скачанного файла до подмены;
  • подменяет файл атомарно (mv в пределах каталога), старый сохраняет в .bak;
  • перезапускает сервис только если файл действительно изменился;
  • пишет в stdout только когда что-то произошло, так что cron не будет слать письма впустую.

Установка

curl -fsSL -o /usr/local/bin/update-geosite.sh https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/update-geosite.sh
chmod +x /usr/local/bin/update-geosite.sh

BASE_URL и DEST уже прописаны в скрипте по умолчанию, так что задать нужно только команду перезапуска. Проверьте вручную — первый запуск скачает файл и перезапустит панель:

RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh

Второй запуск подряд должен отработать молча и мгновенно — значит сравнение сумм работает.

Вариант 1: cron

crontab -e от root, одна строка (04:17 ночи, чтобы не совпадать с чужими крон-джобами):

17 4 * * * RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh >> /var/log/ipcheck-update.log 2>&1

Если путь до .dat другой или репозиторий свой, добавьте в ту же строку DEST=… и BASE_URL=…. Когда переменных много, вынесите их в /etc/default/ipcheck:

export BASE_URL=https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release
export DEST=/usr/local/x-ui/bin/ipcheck.dat
export RESTART_CMD='x-ui restart'
17 4 * * * . /etc/default/ipcheck && /usr/local/bin/update-geosite.sh >> /var/log/ipcheck-update.log 2>&1

export здесь обязателен: скрипт читает переменные из окружения, а не из своего шелла.

Вариант 2: systemd timer

Точнее cron: Persistent=true догоняет пропущенный запуск после перезагрузки, RandomizedDelaySec размазывает нагрузку, а логи идут в journald.

/etc/systemd/system/ipcheck-geosite.service:

[Unit]
Description=Обновление ipcheck.dat для Xray
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
Environment=BASE_URL=https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release
Environment=DEST=/usr/local/x-ui/bin/ipcheck.dat
Environment=RESTART_CMD=x-ui restart
ExecStart=/usr/local/bin/update-geosite.sh

/etc/systemd/system/ipcheck-geosite.timer:

[Unit]
Description=Ежедневное обновление ipcheck.dat

[Timer]
OnCalendar=daily
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now ipcheck-geosite.timer
systemctl start ipcheck-geosite.service   # разовая проверка
journalctl -u ipcheck-geosite.service -n 20

Если 3x-ui в Docker

Путь указывайте внутрь примонтированного тома, а перезапуск делайте через docker:

DEST=/var/lib/x-ui-bin/ipcheck.dat RESTART_CMD='docker restart 3x-ui' /usr/local/bin/update-geosite.sh

Переменные скрипта

Переменная По умолчанию Значение
BASE_URL https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release база, откуда качать
DEST /usr/local/x-ui/bin/ipcheck.dat куда положить файл
NAME имя файла из DEST имя файла в репозитории
RESTART_CMD пусто что выполнить после успешного обновления
TIMEOUT 30 таймаут curl, секунды

Коды возврата: 0 — обновлено или уже актуально, 1 — ошибка (не скачалось, не совпала сумма, не удался перезапуск).

sing-box

{
  "route": {
    "rules": [{ "rule_set": "ipcheck", "outbound": "proxy" }],
    "rule_set": [
      {
        "type": "remote",
        "tag": "ipcheck",
        "format": "binary",
        "url": "https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/sing-box/ipcheck.srs",
        "download_detour": "direct",
        "update_interval": "1d"
      }
    ]
  }
}

Здесь cron не нужен — sing-box обновляет rule-set сам.

Clash / mihomo

rule-providers:
  ipcheck:
    type: http
    behavior: domain
    format: yaml
    url: "https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/clash/ipcheck.yaml"
    path: ./ruleset/ipcheck.yaml
    interval: 86400

rules:
  - RULE-SET,ipcheck,PROXY

Для .mrs укажите behavior: domain и format: mrs. Обновление тоже своё, по interval.

Как добавить домен

Правьте файлы в data/ — по одному домену на строку, в подходящую категорию. Всё остальное соберётся само.

Формат строки (тот же, что у v2fly/domain-list-community):

example.com            # домен и все его поддомены (тип по умолчанию)
domain:example.com     # то же самое, явно
full:www.example.com   # только этот хост, без поддоменов
keyword:ipcheck        # подстрока в имени
regexp:^ip[0-9]+\.com$ # регулярное выражение
include:ip-lookup      # подключить другую категорию целиком
example.com @ads       # атрибут — попадёт в .dat как geosite:ipcheck@ads

Пустые строки и всё после # игнорируются.

Локальная сборка

Нужен только Python 3.10+, зависимостей нет:

python3 tools/build.py

Результат — в dist/. Проверка исходников без сборки (синтаксис, дубликаты, домены, уже покрытые родительским суффиксом, циклические include):

python3 tools/build.py --check

Тесты сборщика:

python3 -m unittest discover -s tools -t tools

.srs и .mrs собираются, только если в PATH есть sing-box и mihomo — без них остальные форматы всё равно соберутся. Скачать их вместе с xray:

sh tools/fetch-tools.sh ./bin

Сборщик проверяет сам себя: после записи geosite.dat он разбирает файл обратно и сверяет с исходником. В CI дополнительно поднимается настоящий Xray с правилом ext:ipcheck.dat:ipcheck — если файл не читается, сборка падает.

CI

.gitea/workflows/build.yml: проверка → тесты → сборка → валидация настоящими Xray и sing-box → публикация в ветку release → релиз в Gitea.

Раннеру нужен образ с python3, curl, unzip, tar, git (например catthehacker/ubuntu:act-latest); если чего-то нет, первый шаг доставит пакеты сам.

Публикация идёт под автоматическим токеном ${{ github.token }}. Если у раннера нет прав на push в репозиторий или на создание релизов — заведите секрет RELEASE_TOKEN с правами repo:write, workflow предпочтёт его.

Лицензия

MIT. Список доменов — общедоступные факты, используйте как угодно.