Настало время модернизировать инструмент для генерации списков обхода блокировок. Давно планировал переписать его на Go, и наконец-то нашёл возможность воплотить эту идею в жизнь. В этом посте я расскажу о SSAntifilter — удобном и функциональном веб-приложении для автоматического скачивания, конвертации и обслуживания списков прокси из источников Antifilter и пользовательских списков.

SSAntifilter представляет собой мощный веб-инструмент, который автоматически загружает, конвертирует и предоставляет списки прокси в различных форматах, включая Clash, Shadowrocket и базы данных v2ray GeoIP/GeoSite.


Особенности

  • 🔄 Автоматическое обновление: скачивает свежие списки с Antifilter каждые 12 часов
  • 📝 Веб-редактор: редактирование списков прокси, доменов и IP через удобный веб-интерфейс
  • 🌓 Тёмная/светлая тема: автоматическое переключение темы в зависимости от системных настроек
  • 📊 Логи в реальном времени: мониторинг всех операций с живыми логами активности
  • 🔒 Безопасность: доступ по паролю с шифрованием bcrypt
  • 📱 Адаптивный интерфейс: удобен для мобильных устройств
  • 🚀 Поддержка множества форматов:
    • Текстовые списки Clash/Shadowrocket
    • Конфигурации Clash YAML
    • Базы данных v2ray GeoIP/GeoSite (.dat файлы)

Поддерживаемые источники

Списки IP Antifilter: allyouneed.lst, community.lst
Списки доменов Antifilter: domains.lst
Пользовательские списки: прокси/прямые домены и IP-адреса

Быстрый старт

Использование Docker (рекомендуется)

Настройка HTTP

# Создание директории для данных
mkdir -p /data/ssantifilter/rawdata
chown -R 1000:1000 /data/ssantifilter

# Запуск контейнера
docker run -d \
  --name ssantifilter \
  --restart=unless-stopped \
  -e PORT=8080 \
  -e SESSION_SECRET_KEY=your-secret-key-here \
  -v /data/ssantifilter/rawdata:/app/rawdata \
  -p 8080:8080 \
  zerolabnet/ssantifilter:latest

Настройка HTTPS с Let's Encrypt

Генерация SSL-сертификата:

# Укажите Lets Encrypt в качестве центра сертификации ACME
docker run --rm -it -v /data/acme:/acme.sh neilpang/acme.sh --set-default-ca --server letsencrypt
docker run --rm -it \
  -v /data/acme:/acme.sh \
  -p 80:80 \
  neilpang/acme.sh \
  --issue --standalone -d ssa.example.com --email [email protected] -k 2048

Установка разрешений:

mkdir -p /data/ssantifilter/rawdata
chown -R 1000:1000 /data/ssantifilter
chown -R 1000:1000 /data/acme/ssa.example.com

Запуск с HTTPS:

docker run -d \
  --name ssantifilter \
  --restart=unless-stopped \
  -e PORT=443 \
  -e USE_HTTPS=1 \
  -e HTTPS_CERT_FILE=/acme/fullchain.cer \
  -e HTTPS_KEY_FILE=/acme/ssa.example.com.key \
  -e SESSION_SECRET_KEY=your-secret-key-here \
  -v /data/acme/ssa.example.com:/acme:ro \
  -v /data/ssantifilter/rawdata:/app/rawdata \
  -p 443:443 \
  zerolabnet/ssantifilter:latest

Сборка из исходного кода

# Клонирование репозитория
git clone https://github.com/zerolabnet/ssantifilter.git
cd ssantifilter

# Сборка Docker-образа
docker build --no-cache -t zerolabnet/ssantifilter:latest .

# Запуск контейнера
docker run -d \
  --name ssantifilter \
  --restart=unless-stopped \
  -e PORT=8080 \
  -e SESSION_SECRET_KEY=your-secret-key-here \
  -v /data/ssantifilter/rawdata:/app/rawdata \
  -p 8080:8080 \
  zerolabnet/ssantifilter:latest

Переменные окружения

Переменная Описание По умолчанию Обязательная
PORT Порт сервера 8080 Нет
SESSION_SECRET_KEY Ключ шифрования сессии Автогенерация Рекомендуется
USE_HTTPS Включить HTTPS (установить 1) 0 Нет
HTTPS_CERT_FILE Путь к SSL-сертификату - При включённом HTTPS
HTTPS_KEY_FILE Путь к приватному ключу SSL - При включённом HTTPS

Использование

Доступ к веб-интерфейсу: откройте http://localhost:8080 (или ваш домен)
Вход в систему: используйте пароль, показанный в логах контейнера при первом запуске
Редактирование списков: используйте веб-редактор для изменения прокси/прямых доменов и IP
Скачивание списков: получайте сгенерированные списки через веб-интерфейс и вставляйте ссылки в конфигурацию программы для обхода блокировок

Доступные эндпоинты

Текстовые списки Clash/Shadowrocket

  • /antifilter-ip.list - IP-адреса, заблокированные в России от сервиса Antifilter
  • /antifilter-community-ip.list - IP-адреса, поддерживаемые сообществом Antifilter
  • /antifilter-community-domain.list - Поддерживаемые сообществом Antifilter заблокированные домены
  • /proxy-domain.list - Пользовательские прокси-домены
  • /direct-domain.list - Пользовательские прямые домены
  • /proxy-ip.list - Пользовательские прокси-IP
  • /direct-ip.list - Пользовательские прямые IP

Конфигурации Clash YAML

  • /antifilter-ip.yaml - IP-адреса, заблокированные в России от сервиса Antifilter
  • /antifilter-community-ip.yaml - IP-адреса, поддерживаемые сообществом Antifilter
  • /antifilter-community-domain.yaml - Поддерживаемые сообществом Antifilter заблокированные домены
  • /proxy-domain.yaml - Пользовательские прокси-домены
  • /direct-domain.yaml - Пользовательские прямые домены
  • /proxy-ip.yaml - Пользовательские прокси-IP
  • /direct-ip.yaml - Пользовательские прямые IP

Базы данных v2ray

  • /geoip.dat - База данных GeoIP
  • /geosite.dat - База данных GeoSite

Категории списков v2ray v2rayGeoIPDat

Списки IP-адресов (geoip.dat)

  • antifilter-ip - IP-адреса, заблокированные в России от сервиса Antifilter
  • antifilter-community-ip - IP-адреса, поддерживаемые сообществом Antifilter
  • proxy-ip - Пользовательские прокси-IP
  • direct-ip - Пользовательские прямые IP

Списки доменов (geosite.dat)

  • antifilter-community-domain - Поддерживаемые сообществом Antifilter заблокированные домены
  • proxy-domain - Пользовательские прокси-домены
  • direct-domain - Пользовательские прямые домены

Примеры форматов файлов

Списки доменов

# Стандартные домены (будет использоваться сопоставление суффикса домена)
example.com

# С префиксами для расширенного сопоставления
domain:example.com      # Сопоставление суффикса домена (может быть опущено, см. выше)
keyword:google          # Сопоставление по ключевому слову
full:www.example.com    # Полное сопоставление домена

Списки IP

# Отдельные IP
192.168.1.1
10.0.0.1

# CIDR-диапазоны
192.168.0.0/24
10.0.0.0/8

Сохранение данных

Приложение хранит данные в /app/rawdata внутри контейнера. Подключите эту директорию для сохранения ваших пользовательских списков:

-v /data/ssantifilter/rawdata:/app/rawdata

Безопасность

  • Все пароли хешируются с помощью bcrypt
  • Сессионные куки только HTTP и безопасные
  • Доступ к файлам ограничен назначенными директориями
  • Поддержка HTTPS с пользовательскими сертификатами

Горячие клавиши

  • Ctrl+S - Сохранить текущий файл
  • Ctrl+U - Обновить списки Antifilter

Устранение неполадок

Контейнер не запускается

  • Проверьте доступность порта: netstat -tlnp | grep :8080
  • Проверьте разрешения директории: ls -la /data/ssantifilter

Проблемы с SSL-сертификатом

  • Убедитесь, что файлы сертификата читаемы пользователем контейнера (UID 1000)
  • Проверьте действительность сертификата: openssl x509 -in cert.pem -text -noout

Списки не обновляются

  • Проверьте интернет-соединение из контейнера
  • Убедитесь в наличии достаточного дискового пространства