Files
ipcheck-domains/README.md
T

301 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`](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`:
```bash
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-конфиге:
```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`](tools/update-geosite.sh):
- сначала тянет `.sha256sum` и, если сумма совпала с локальным файлом, **молча выходит**
ни лишней закачки, ни лишнего перезапуска Xray;
- проверяет контрольную сумму скачанного файла **до** подмены;
- подменяет файл атомарно (`mv` в пределах каталога), старый сохраняет в `.bak`;
- перезапускает сервис только если файл действительно изменился;
- пишет в stdout только когда что-то произошло, так что cron не будет слать письма впустую.
### Установка
```bash
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` уже прописаны в скрипте по умолчанию, так что задать нужно только
команду перезапуска. Проверьте вручную — первый запуск скачает файл и перезапустит панель:
```bash
RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh
```
Второй запуск подряд должен отработать молча и мгновенно — значит сравнение сумм работает.
### Вариант 1: cron
`crontab -e` от root, одна строка (04:17 ночи, чтобы не совпадать с чужими крон-джобами):
```cron
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`:
```bash
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'
```
```cron
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`:
```ini
[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`:
```ini
[Unit]
Description=Ежедневное обновление ipcheck.dat
[Timer]
OnCalendar=daily
RandomizedDelaySec=1h
Persistent=true
[Install]
WantedBy=timers.target
```
```bash
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:
```bash
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
```json
{
"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
```yaml
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+, зависимостей нет:
```bash
python3 tools/build.py
```
Результат — в `dist/`. Проверка исходников без сборки (синтаксис, дубликаты,
домены, уже покрытые родительским суффиксом, циклические `include`):
```bash
python3 tools/build.py --check
```
Тесты сборщика:
```bash
python3 -m unittest discover -s tools -t tools
```
`.srs` и `.mrs` собираются, только если в `PATH` есть `sing-box` и `mihomo`
без них остальные форматы всё равно соберутся. Скачать их вместе с `xray`:
```bash
sh tools/fetch-tools.sh ./bin
```
Сборщик проверяет сам себя: после записи `geosite.dat` он разбирает файл обратно
и сверяет с исходником. В CI дополнительно поднимается настоящий Xray с правилом
`ext:ipcheck.dat:ipcheck` — если файл не читается, сборка падает.
## CI
[`.gitea/workflows/build.yml`](.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](LICENSE). Список доменов — общедоступные факты, используйте как угодно.