New output formats: - `format=geosite` — v2ray/xray geosite.dat, built natively by GeositeDatWriter (domain-list-community rejects 406 of 409 portal names, so an external generator was not an option); `domaintype=suffix|full|keyword|regex`. - `format=singbox` — sing-box rule-set source JSON, served inline; it becomes an attachment only with `?filesave=1`. - `format=srs` — the same rule-set compiled to binary by the sing-box binary (SINGBOX_PATH); without the binary the format returns a plain-text error. - `format=geoip` — same contract, now built in PHP by GeoipDatWriter. `SYS_GEOIP_NATIVE=false` keeps the v2fly binary path for one release. Infrastructure: - src/Infrastructure/Codec: ProtobufWriter, GeoipDatWriter, GeositeDatWriter, SingboxRuleSetBuilder, EntryPayload, DatEncoder. Writers are pure functions — no I/O, no Amp, no singletons — so the same class runs inline and inside an amphp/parallel worker. Above SYS_ENCODE_WORKER_THRESHOLD encoding goes to a worker, below it yields to the event loop every 32 lists. - TempWorkspace: one temp dir per request under storage/tmp, removed in a finally, plus a sweeper for dirs orphaned by SIGKILL (SYS_TMP_TTL, SYS_TMP_SWEEP_INTERVAL). Replaces the leaking geoip/input + geoip/output. - ProcessRunner: the single place that starts external binaries — command as an array, both pipes buffered concurrently (not reading them deadlocked a chatty child), exit code and stderr surfaced in the error body. Fixes: - wildcard domain collapse no longer emits a bare "." for scraped junk like `DNSdumpster..`; such entries are dropped by SiteFactory::normalizeDomains on ingestion, and a matching guard sits in Site::getDomains. - geoip.dat was served as text/plain; both engines now use application/octet-stream. - HttpClient in AsyncTest is shared across the run: per-test clients kept their keep-alive pools alive and starved the Windows StreamSelectDriver by the end of a full run. UI, docs, build: - Form.vue: new formats, domaintype and rule-set version selects, wildcard on by default, filesave hidden for attachment-only formats; public/ rebuilt. - IndexTemplate.php (no-JS form on /index) caught up with the frontend. - README.md, README.en.md, CLAUDE.md, ROADMAP.md, .env.example. - Dockerfile: sing-box from the release tarball (-glibc), v2fly/geoip built on golang:1.25 with a pinned tag; the apt Go 1.19 stage was the broken build. https://github.com/itdoginfo/podkop/issues/418
34 KiB
IP Address Collection and Management Service with multiple formats
For english readme: README.en.md
Основной портал: https://iplist.opencck.org
Портал с прочими сервисами: https://beta.iplist.opencck.org
Портал с российскими сервисами: https://russia.iplist.opencck.org
Сервис сбора IP-адресов и CIDR зон
Данный сервис предназначен для сбора и обновления IP-адресов (IPv4 и IPv6), а также их CIDR зон для указанных доменов.
Это асинхронный PHP веб-сервер на основе AMPHP и Linux-утилит whois и ipcalc.
Сервис предоставляет интерфейсы для получения списков зон ip адресов указанных доменов (IPv4 адресов, IPv6 адресов, а также CIDRv4 и CIDRv6 зон) в различных форматах, включая текстовый, JSON, форматы скриптов для добавления в "Address List" на роутерах Mikrotik (RouterOS), Keenetic KVAS\BAT, SwitchyOmega, Amnezia и др.
Основные возможности
- Сбор и автоматическое обновление IP-адресов и CIDR зон для доменов.
- Поддержка вывода данных в различных форматах (JSON, lst, Mikrotik, OpenWRT, ipset и т.д).
- Интеграция с внешними источниками данных (поддержка импорта начальных данных из внешних URL).
- Легкое развертывание с помощью Docker Compose.
- Настройка через JSON файлы для управления доменами.
Используемые технологии
- PHP 8.1+ (amphp, revolt)
- whois, ipcalc (linux)
Форматы выгрузки
| формат | описание |
|---|---|
| json | JSON формат |
| text | Разделение новой строкой |
| comma | Разделение запятыми |
| geoip | v2rayGeoIPDat |
| geosite | v2rayGeoSiteDat |
| singbox | sing-box rule-set (JSON) |
| srs | sing-box rule-set (бинарный) |
| mikrotik | MikroTik Script |
| switchy | SwitchyOmega RuleList |
| nfset | Dnsmasq nfset |
| ipset | Dnsmasq ipset |
| clashx | ClashX |
| kvas | Keenetic KVAS |
| bat | Keenetic Routes .bat |
| wildcard | Keenetic DNS |
| amnezia | Amnezia filter list |
| pac | Proxy Auto-Configuration file |
Настройки
Конфигурационные файлы хранятся в config/<группа>/<портал>.json. Каждый JSON файл представляет собой конфигурацию для конкретного портала, задавая домены для мониторинга и источники начальных данных по IP и CIDR.
{
"domains": [
"youtube.com",
"www.youtube.com",
"m.youtube.com",
"www.m.youtube.com",
"googlevideo.com",
"www.googlevideo.com",
"ytimg.com",
"i.ytimg.com"
],
"dns": ["127.0.0.11:53", "77.88.8.88:53", "8.8.8.8:53"],
"timeout": 43200,
"ip4": [],
"ip6": [],
"cidr4": [],
"cidr6": [],
"external": {
"domains": ["https://raw.githubusercontent.com/nickspaargaren/no-google/master/categories/youtubeparsed"],
"ip4": ["https://raw.githubusercontent.com/touhidurrr/iplist-youtube/main/ipv4_list.txt"],
"ip6": ["https://raw.githubusercontent.com/touhidurrr/iplist-youtube/main/ipv6_list.txt"],
"cidr4": ["https://raw.githubusercontent.com/touhidurrr/iplist-youtube/main/cidr4.txt"],
"cidr6": ["https://raw.githubusercontent.com/touhidurrr/iplist-youtube/main/cidr6.txt"]
}
}
| свойство | тип | описание |
|---|---|---|
| domains | string[] | Список доменов портала |
| dns | string[] | Список DNS серверов для обновления ip-адресов. По мимо локального и google dns, можно использовать публичные российские DNS, например Яндекс |
| timeout | int | Время между обновлением ip-адресов доменов (секунды) |
| ip4 | string[] | Начальный список ipv4 адресов |
| ip6 | string[] | Начальный список ipv6 адресов |
| cidr4 | string[] | Начальный список CIDRv4 зон ipv4 адресов |
| cidr6 | string[] | Начальный список CIDRv6 зон ipv6 адресов |
| external | object | Списки URL для получения данных от сторонних источников |
| replace | object | Замена пересекающихся CIDR зон на более узкие (см. раздел ниже) |
| свойство | тип | описание |
|---|---|---|
| domains | string[] | Список URL для пополнения доменов портала |
| ip4 | string[] | Список URL для пополнения ipv4 адресов |
| ip6 | string[] | Список URL для пополнения ipv6 адресов |
| cidr4 | string[] | Список URL для пополнения CIDRv4 зон ipv4 адресов |
| cidr6 | string[] | Список URL для пополнения CIDRv6 зон ipv6 адресов |
Замена пересекающихся CIDR зон (свойство replace)
Опциональное поле replace в конфиге портала позволяет заменить
«широкие» CIDR-зоны, принадлежащие нескольким порталам
(например, 172.217.0.0/16 у google и yandex), на более узкие
CIDR-блоки, известные только этому порталу. При
включённой опции SYS_REPLACE_AGGREGATE_SUBNETS блоки дополнительно
агрегируются (supernet), а четыре порога SYS_REPLACE_COLLAPSE_THRESHOLD_*
включают «пирамидальное» плотностное схлопывание.
Все подробности — в отдельном документе: docs/REPLACE.md.
Настройка и запуск под docker
git clone https://github.com/rekryt/iplist.git
cd iplist
cp .env.example .env
Если требуется отредактируйте .env файл
| свойство | значение по умолчанию | описание |
|---|---|---|
| COMPOSE_PROJECT_NAME | iplist | Имя compose проекта |
| STORAGE_SAVE_INTERVAL | 120 | Период сохранения кеша whois (секунды) |
| SYS_DNS_RESOLVE_IP4 | true | Получать ipv4 адреса |
| SYS_DNS_RESOLVE_IP6 | true | Получать ipv6 адреса |
| SYS_DNS_RESOLVE_CHUNK_SIZE | 10 | Размер чанка для получения dns записей |
| SYS_DNS_RESOLVE_DELAY | 100 | Задержка между получением dns записей (миллисекунды) |
| SYS_IP6_SUBNET_PREFIX_CAP | 64 | Максимально допустимая длина префикса IPv6-подсети |
| SYS_REPLACE_ESCALATE_IPS | true | Эскалировать ip4/ip6 в replace на этапе reload |
| SYS_REPLACE_AGGREGATE_SUBNETS | false | Агрегировать (supernet) value-массивы replace на reload |
| SYS_REPLACE_COLLAPSE_THRESHOLD_IP4_24 | 0 | Порог /24-схлопывания (v4, узкий tier). 0 — выключено |
| SYS_REPLACE_COLLAPSE_THRESHOLD_IP4_16 | 0 | Порог /16-схлопывания (v4, широкий tier). 0 — выключено |
| SYS_REPLACE_COLLAPSE_THRESHOLD_IP6_64 | 0 | Порог /64-схлопывания (v6, узкий tier). 0 — выключено |
| SYS_REPLACE_COLLAPSE_THRESHOLD_IP6_32 | 0 | Порог /32-схлопывания (v6, широкий tier). 0 — выключено |
| SYS_MEMORY_LIMIT | 1024M | Предельное кол-во памяти. |
| SYS_TIMEZONE | Europe/Moscow | Список URL для получения начальных CIDRv4 зон ipv4 адресов |
| SYS_TMP_PATH | storage/tmp | Каталог временных файлов генераторов (см. ниже) |
| SYS_TMP_TTL | 900 | Возраст, после которого осиротевший временный каталог удаляется (секунды) |
| SYS_TMP_SWEEP_INTERVAL | 600 | Период уборки осиротевших временных каталогов (секунды). 0 — выключено |
| SYS_ENCODE_WORKER_THRESHOLD | 20000 | Порог по числу записей, выше которого сборка .dat уходит в отдельный процесс. 0 — всегда в отдельный процесс |
| SYS_GEOIP_NATIVE | true | Собирать geoip.dat самим сервисом. false — путь через утилиту v2fly/geoip |
| HTTP_HOST | 0.0.0.0 | IP сетевого интерфейса (по умолчанию все интерфейсы) |
| HTTP_PORT | 8080 | Сетевой порт сервера (по умолчанию 8080) |
| GEOIP_PATH | ./geoip/ | Каталог с бинарником geoip. Нужен только при SYS_GEOIP_NATIVE=false |
| SINGBOX_PATH | /usr/local/bin/sing-box | Путь к бинарнику sing-box. Нужен формату srs, без него формат отдаст ошибку |
| DEBUG | true | Определяет уровень логирования |
docker compose up -d
Открыть сервис можно в браузере по протоколу http, порт 8080
http://0.0.0.0:8080/
http://0.0.0.0:8080/?format=json
http://0.0.0.0:8080/?format=json&site=youtube.com&data=domains
http://0.0.0.0:8080/?format=text&site=youtube.com&data=ip4
http://0.0.0.0:8080/?format=mikrotik&data=cidr4
http://0.0.0.0:8080/?format=mikrotik&site=youtube.com&data=cidr4
http://0.0.0.0:8080/?format=comma&data=cidr4
| get параметр | описание | пример |
|---|---|---|
| format | Формат выгрузки данных | ?format=text |
| data | Данные для выгрузки | ?data=cidr4 |
| site | Портал для выгрузки данных | ?site=youtube.com |
| group | Группа для выгрузки данных | ?group=youtube |
| exclude[ip4] | Исключить ipv4 адреса | ?exclude[ip4]=1.1.1.1&exclude[ip4]=2.2.2.2 |
| exclude[ip6] | Исключить ipv6 адреса | ?exclude[ip6]=2a06:98c1:3121::a |
| exclude[cidr4] | Исключить CIDRv4 зоны | ?exclude[cidr4]=1.1.1.0/24 |
| exclude[cidr6] | Исключить CIDRv6 зоны | ?exclude[cidr6]=2a06:98c1::/32 |
| exclude[group] | Исключить группы | ?exclude[group]=youtube&exclude[group]=casino |
| exclude[site] | Исключить порталы | ?exclude[site]=youtube.com |
| exclude[domain] | Исключить домены | ?exclude[domain]=youtube.com |
| wildcard | Оставлять только wildcard домены | ?wildcard=1 |
| filesave | Сохранять как файл | ?filesave=1 |
| native | Отдавать исходные cidr4/cidr6 портала без применения replace (см. docs/REPLACE.md) |
?data=cidr4&native=1 |
| domaintype | Тип доменного правила: suffix (по умолчанию), full, keyword, regex — для geosite, singbox, srs |
?domaintype=full |
| version | Версия формата rule-set 1…5 (по умолчанию 1) — для singbox, srs |
?version=3 |
| template | Шаблон выгрузки | ?format=custom&template=подробнее |
Настройка SSL
Для настройки SSL сертификата вам понадобится домен настроенный на ваш сервер. Если у вас нет собственного домена - как вариант бесплатный домен можно получить например на https://noip.com. Актуальность такого домена придётся подтверждать раз в месяц.
- Установите и настройте реверс-прокси, например NginxProxyManager
- Создайте виртуальную сеть docker
docker network create web
- Настройте её в docker-compose.yml файлах реверс-прокси и данного проекта
services:
...
app:
networks:
- web
networks:
web:
external: true
name: web
- Удалите свойство ports из docker-compose.yml (этого проекта)
- Примените изменения:
docker compose up -d
- Имя контейнера можно посмотреть командой
docker compose ps - В панели администрирования реверс-прокси настройте домен на него
iplist-app-1порт8080и включите SSL - NginxProxyManager будет продлевать ssl сертификат автоматически
Ручной запуск (PHP 8.1+)
apt-get install -y ntpsec whois dnsutils ipcalc
cp .env.example .env
composer install
php index.php
geoip.dat и geosite.dat собираются самим сервисом, внешние утилиты для них не нужны.
Отдельный бинарник нужен только формату srs — им компилируется бинарный rule-set:
# sing-box (для формата srs)
SINGBOX_VERSION=1.13.15
curl -fsSL -o /tmp/sing-box.tar.gz "https://github.com/SagerNet/sing-box/releases/download/v${SINGBOX_VERSION}/sing-box-${SINGBOX_VERSION}-linux-amd64-glibc.tar.gz"
tar -xzf /tmp/sing-box.tar.gz -C /tmp
install -m 0755 "/tmp/sing-box-${SINGBOX_VERSION}-linux-amd64-glibc/sing-box" /usr/local/bin/sing-box
Если нужна сборка geoip.dat через утилиту v2fly (SYS_GEOIP_NATIVE=false),
понадобится Go 1.25+:
git clone --depth 1 https://github.com/v2fly/geoip.git
cd geoip && go build . && cd ../
Кастомный формат вывода
Для получения выгрузки данных по заданному шаблону используются get параметры: format=custom и template=шаблон, где шаблон может содержать такие паттерны как:
| свойство | описание |
|---|---|
| {group} | Имя группы |
| {site} | Имя сайта |
| {data} | Выбранные данные |
| {shortmask} | Маска подсети (короткая) (для ip и cidr) |
| {mask} | Маска подсети (полная) (для ip и cidr) |
Примеры:
Wildcard домены twitter для dns static add под mikrotik для forward-to=localhost:
https://iplist.opencck.org/?format=custom&data=domains&site=x.com&wildcard=1&template=%2Fip%20dns%20static%20add%20name%3D%7Bdata%7D%20type%3DFWD%20address-list%3D%7Bgroup%7D_%7Bsite%7D%20match-subdomain%3Dyes%20forward-to%3Dlocalhost
Wildcard домены в кастомном формате:
https://iplist.opencck.org/?format=custom&data=domains&wildcard=1&template=data%3A%20%7Bdata%7D%20group%3A%20%7Bgroup%7D%20site%3A%20%7Bsite%7D
Маска подсети в кастомном формате:
https://iplist.opencck.org/?format=custom&data=cidr4&template=data%3A%20%7Bdata%7D%20group%3A%20%7Bgroup%7D%20site%3A%20%7Bsite%7D%20shortmask%3A%20%7Bshortmask%7D%20mask%3A%20%7Bmask%7D
Настройка маршрутизации Xray/V2Ray
Скачайте iplist.dat файл в рабочий каталог:
https://iplist.opencck.org/?format=geoip&data=cidr4
Пример routing конфигурации:
{
"routing": {
"rules": [
{
"type": "field",
"outboundTag": "vpn",
"ip": ["ext:iplist.dat"]
},
...
]
},
...
}
Пример использования тегов (по имени портала или группы) в конфигурации:
{
"routing": {
"rules": [
{
"type": "field",
"outboundTag": "vpn",
"ip": ["ext:iplist.dat:youtube.com"]
},
{
"type": "field",
"outboundTag": "vpn",
"ip": ["ext:iplist.dat:anime"]
},
...
]
},
...
}
Домены отдаются файлом geosite.dat (те же теги — по имени портала и по группе):
https://iplist.opencck.org/?format=geosite&data=domains
{
"routing": {
"rules": [
{
"type": "field",
"outboundTag": "vpn",
"domain": ["ext:geosite.dat:youtube.com"]
},
{
"type": "field",
"outboundTag": "vpn",
"domain": ["ext:geosite.dat:anime"]
},
...
]
},
...
}
По умолчанию домены пишутся как RootDomain — правило срабатывает и на сам домен, и на все его
поддомены. Другое поведение выбирается параметром domaintype: full — только точное совпадение,
keyword — вхождение подстроки, regex — регулярное выражение.
Настройка sing-box (rule-set)
Сервис отдаёт rule-set в двух видах: singbox — исходный JSON, srs — скомпилированный бинарный
файл (меньше размер и быстрее загрузка). Оба варианта sing-box умеет забирать по ссылке:
{
"route": {
"rule_set": [
{
"type": "remote",
"tag": "iplist-ip",
"format": "binary",
"url": "https://iplist.opencck.org/?format=srs&data=cidr4&group=youtube",
"download_detour": "direct",
"update_interval": "1d"
},
{
"type": "remote",
"tag": "iplist-domains",
"format": "source",
"url": "https://iplist.opencck.org/?format=singbox&data=domains&group=youtube",
"download_detour": "direct",
"update_interval": "1d"
}
],
"rules": [
{
"rule_set": ["iplist-ip", "iplist-domains"],
"outbound": "vpn"
}
]
}
}
Версия формата задаётся параметром version (по умолчанию 1 — её читают все sing-box начиная
с 1.8). Для format=srs версия исходника является верхней границей: sing-box компилирует
минимальную достаточную версию бинарного файла.
Настройка Mikrotik
- В администраторской панели роутера (или через winbox) откройте раздел System -> Scripts
- Создайте новый скрипт "Add new" с произвольным именем, например
iplist_v4_cidr - В поле
Sourceвведите следующий код (используйтеurlадрес вашего сервера, протокол вmodeтоже может отличаться):
/tool fetch url="https://iplist.opencck.org/?format=mikrotik&data=cidr4&append=timeout%3D1d" mode=https dst-path=iplist_v4_cidr.rsc
:delay 5s
:log info "Downloaded iplist_v4_cidr.rsc succesfully";
/import file-name=iplist_v4_cidr.rsc
:delay 10s
:log info "New iplist_v4_cidr added successfully";
- Сохраните скрипт
- Откройте раздел планировщика System -> Scheduler
- Создайте новое задание с произвольным именем, например
iplist_v4_cidr - В качестве
Start timeукажите время для старта задания (пример:00:05:00). ДляIntervalвведите значение1d 00:00:00. - В поле
On eventвведите имя скрипта
iplist_v4_cidr
- Откройте скрипт в разделе System -> Scripts и запустите его нажатием на кнопку
Run Script - В разделе Logs вы должны увидеть сообщение
New iplist_v4_cidr added successfully - А в разделе IP -> Firewall -> Address Lists должны появиться новые списоки (в примере с именем
youtube)
Через GET-параметр template для формата mikrotik можно указывать шаблон для имени списка:
https://iplist.opencck.org/?format=mikrotik&data=cidr4&append=timeout%3D1d&template={group}_{data}
По умолчанию шаблон имеет значение: {group}_{data}
Настройка HomeProxy (sing-box)
Включите "Routing mode" в "Only proxy mainland China":
Подключитесь к роутеру по ssh и выполните следующие команды:
# переименовываем старый скрипт обновления
mv /etc/homeproxy/scripts/update_resources.sh /etc/homeproxy/scripts/update_resources.sh.origin
# загружаем новый скрипт
wget https://iplist.opencck.org/scripts/homeproxy/update_resources.sh -O /etc/homeproxy/scripts/update_resources.sh
# добавляем права на выполнение
chmod +x /etc/homeproxy/scripts/update_resources.sh
# отменяем стирание cron после перезапуска homeproxy
sed -i '/sed -i/s/^/\t#/; /\/etc\/init.d\/cron restart >/s/^/\t#/' /etc/init.d/homeproxy
# вы захостили это решение? - тогда раскомментируйте следующую строку и поменяйте "example.com" на ваш домен
# sed -i 's/iplist.opencck.org/example.com/g' /etc/homeproxy/scripts/update_resources.sh
Откройте административную панель OpenWRT раздел "System" - "Sсheduled Tasks". Добавьте строку, чтобы автоматически запускать скрипт обновления при старте, а также в 00:05:00 и 12:05:00
5 0,12 * * * /etc/homeproxy/scripts/update_crond.sh
Настройка дополнения для Chrome - Proxy SwitchySharp
Установить можно по ссылке
Подробнее о формате Switchy RuleList
License
The MIT License (MIT). Please see LICENSE for more information.