March 9

📱 mobile443 - Фильтрация 443 порта по мобильным сетям РФ

📋 Содержание

  1. Назначение
  2. Принцип работы
  3. Системные требования
  4. Установка
  5. Проверка работы
  6. Мониторинг и логи
  7. Управление
  8. Удаление
  9. Настройка AS-списка
  10. Устранение неполадок

🎯 Назначение

Скрипт создает систему фильтрации входящих подключений на TCP/UDP порт 443 (HTTPS/QUIC), разрешая трафик только из мобильных сетей России (MTS, Beeline, MegaFon, Tele2, Yota и др.) и блокируя все остальные подключения.

Идеально подходит для:

  • Защиты от ботов и сканеров из зарубежных дата-центров
  • Ограничения доступа к сервисам только для мобильных абонентов РФ
  • Снижения нагрузки от автоматических атак

⚙️ Принцип работы

  1. Сбор префиксов - ежедневно в 00:00 скрипт запрашивает у RIPEstat (статистика RIPE) все объявленные префиксы для указанных AS-номеров
  2. Фильтрация и валидация - собранные префиксы сортируются, проверяются на валидность
  3. Защита от ошибок - система не применит обновление, если префиксов слишком мало или их количество упало более чем на 30%
  4. Применение правил - создается ipset с подсетями, iptables цепочка FILTER_MOBILE_443, которая разрешает трафик только из этих подсетей
  5. Автоматическое восстановление - при загрузке системы применяется последний успешно загруженный кеш префиксов

Схема работы:

text

RIPEstat API (список префиксов AS) → mobile443-update.sh → ipset → iptables
                                          ↓
                                  /var/lib/mobile443/prefixes.txt (кеш)

💻 Системные требования

  • ОС: Ubuntu 18.04+, Debian 10+, CentOS 7+ (с поддержкой systemd)
  • Ядро: с поддержкой ipset и iptables
  • Память: от 256 MB RAM
  • Диск: от 50 MB свободного места
  • Зависимости: curl, jq, ipset, iptables, util-linux (flock)

🚀 Установка

1. Сохраните скрипт

Сохраните полный код скрипта (который начинается с #!/usr/bin/env bash) в файл:

bash

sudo nano /usr/local/bin/mobile443-installer.sh

Вставьте код и сохраните (Ctrl+X, Y, Enter).

2. Сделайте скрипт исполняемым

bash

sudo chmod +x /usr/local/bin/mobile443-installer.sh

3. Запустите установку

bash

sudo /usr/local/bin/mobile443-installer.sh install

4. Что происходит при установке:

✅ Создаются директории:

  • /opt/mobile443/ - конфигурация (asns.conf)
  • /var/lib/mobile443/ - состояние (кеш префиксов, lock-файл)
  • /usr/local/sbin/ - исполняемые скрипты

✅ Устанавливаются скрипты:

  • mobile443-common.sh - общие функции
  • mobile443-update.sh - обновление списка префиксов
  • mobile443-apply-cache.sh - применение кеша при загрузке

✅ Создаются systemd-юниты:

  • mobile443-update.service - разовое обновление
  • mobile443-update.timer - ежедневное обновление в 00:00
  • mobile443-apply.service - применение кеша при старте

✅ Запускается первое обновление


🔍 Проверка работы

После установки выполните следующие проверки:

Статус служб

bash

# Статус таймера (должен быть active и waiting)
systemctl status mobile443-update.timer

# Статус последнего обновления
systemctl status mobile443-update.service --no-pager

# Статус службы применения кеша
systemctl status mobile443-apply.service --no-pager

Проверка ipset

bash

# Информация о множестве
ipset list allowed_mobile_443 | head -20

# Количество подсетей (должно быть несколько тысяч)
ipset list allowed_mobile_443 | grep -c "^[0-9]"

Проверка iptables

bash

# Просмотр правил
iptables -L FILTER_MOBILE_443 -n -v --line-numbers

# Где применяется цепочка
iptables -L INPUT -n -v | grep -A 2 FILTER_MOBILE_443
iptables -L FORWARD -n -v | grep -A 2 FILTER_MOBILE_443

Тестирование фильтрации

bash

# С сервера, который НЕ в мобильной сети (например, зарубежный VPS):
curl -I https://ваш-сервер.com

# С мобильного телефона РФ (через мобильный интернет):
curl -I https://ваш-сервер.com

📊 Мониторинг и логи

Просмотр логов обновлений

bash

# Последние обновления
journalctl -u mobile443-update.service -n 30 --no-pager

# Следить за обновлениями в реальном времени
journalctl -u mobile443-update.service -f

# Логи применения кеша
journalctl -u mobile443-apply.service -n 30

Статистика по трафику

bash

# Сколько пакетов пропущено/заблокировано
iptables -L FILTER_MOBILE_443 -n -v -x

# Сброс счетчиков (если нужно)
iptables -Z FILTER_MOBILE_443

Проверка кеша

bash

# Размер кеша (количество подсетей)
wc -l /var/lib/mobile443/prefixes.txt

# Просмотр первых записей
head -20 /var/lib/mobile443/prefixes.txt

🛠️ Управление

Ручное обновление списка префиксов

bash

sudo systemctl start mobile443-update.service
journalctl -u mobile443-update.service -f  # следить за процессом

Применение кеша (если правила "слетели")

bash

sudo systemctl start mobile443-apply.service

Временное отключение фильтрации (для отладки)

bash

# Удалить правила из INPUT/FORWARD/DOCKER-USER (фильтрация отключится)
sudo iptables -D INPUT -p tcp --dport 443 -j FILTER_MOBILE_443
sudo iptables -D INPUT -p udp --dport 443 -j FILTER_MOBILE_443

# Вернуть обратно
sudo /usr/local/sbin/mobile443-apply-cache.sh

Полная перезагрузка правил

bash

# Очистить и пересоздать всё
sudo ipset destroy allowed_mobile_443
sudo ipset destroy allowed_mobile_443_tmp
sudo /usr/local/sbin/mobile443-apply-cache.sh

🗑️ Удаление

bash

sudo /usr/local/bin/mobile443-installer.sh remove

Что будет удалено:

  • Все systemd-юниты (mobile443-*)
  • Все iptables правила и цепочки
  • Все ipset множества
  • Скрипты в /usr/local/sbin/
  • Директории /opt/mobile443/ и /var/lib/mobile443/

⚙️ Настройка AS-списка

Список AS-номеров находится в /opt/mobile443/asns.conf

Текущий состав (по умолчанию):

  • MTS (8359)
  • Beeline (3216)
  • MegaFon (31133, 8263, и др.)
  • Tele2 (12958, 15378, и др.)
  • Ростелеком (12389) - добавлен для расширения покрытия
  • Yandex Cloud (205638)
  • Другие мобильные операторы

Редактирование списка:

bash

sudo nano /opt/mobile443/asns.conf

Формат: один AS-номер на строку, строки начинающиеся с # игнорируются.

Пример добавления нового AS:

bash

echo "12345  # Новый оператор" | sudo tee -a /opt/mobile443/asns.conf

После изменения списка необходимо выполнить обновление:

bash

sudo systemctl start mobile443-update.service
journalctl -u mobile443-update.service -f

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

Проблема: "Refusing update: too few prefixes"

Причина: API вернуло менее 500 префиксов (обычно проблема с сетью или API RIPE)
Решение:

bash

# Проверить соединение с RIPE
curl -I https://stat.ripe.net

# Применить последний рабочий кеш
sudo systemctl start mobile443-apply.service

# Проверить логи ошибок
journalctl -u mobile443-update.service -n 50

Проблема: "Refusing update: new prefix count dropped too much"

Причина: Количество префиксов упало более чем на 30% от предыдущего значения (защита от битого обновления)
Решение: Если изменение ожидаемое (например, удалили AS из списка), можно принудительно обновить:

bash

# Удалить старый кеш и запустить обновление
sudo rm /var/lib/mobile443/prefixes.txt
sudo systemctl start mobile443-update.service

Проблема: Нет доступа с мобильных устройств

Причина: Ваш мобильный оператор не в списке AS или использует нестандартные префиксы
Решение:

  1. Узнать AS своего оператора: https://2ip.ru/whois/
  2. Добавить AS в /opt/mobile443/asns.conf
  3. Обновить список

Проблема: Docker контейнеры не могут принимать соединения

Решение: Скрипт автоматически добавляет правила в цепочку DOCKER-USER, если она существует. Проверьте:

bash

# Убедиться, что правила есть
iptables -L DOCKER-USER -n -v | grep FILTER_MOBILE_443

# Если нет - применить кеш заново
sudo systemctl start mobile443-apply.service

Проблема: Не запускается таймер

bash

# Проверить статус
systemctl status mobile443-update.timer

# Перезапустить таймер
sudo systemctl restart mobile443-update.timer
sudo systemctl daemon-reload

📝 Примечания

  • Скрипт использует flock для предотвращения одновременных запусков
  • Применяется защита от "пустого" обновления (минимум 500 префиксов)
  • При падении числа префиксов >30% обновление отклоняется
  • Кеш хранится в /var/lib/mobile443/prefixes.txt
  • Все операции идемпотентны - можно запускать многократно

🆘 Поддержка

Если возникли проблемы:

  1. Проверьте раздел Устранение неполадок
  2. Посмотрите логи: journalctl -u mobile443-update.service -n 100
  3. Проверьте доступность API: curl -I https://stat.ripe.net
  4. Убедитесь, что файл ASNs существует: cat /opt/mobile443/asns.conf