Автоматическое обновление списка российских IP-адресов RussianIP на MikroTik

Автор George, Нояб. 13, 2026, 08:54

« назад - далее »

George

Автоматическое обновление списка российских IP-адресов RussianIP на MikroTik
Настройка Linux-сервера, SSH/SFTP и ежедневного обновления через cron

1. Что мы будем делать

Настроим автоматическое обновление Address List RussianIP на MikroTik.

Список российских IPv4-подсетей будет загружаться из репозитория IPverse:

Код: bash
https://raw.githubusercontent.com/ipverse/country-ip-blocks/master/country/ru/ipv4-aggregated.txt

Обновление будет выполняться один раз в сутки с Linux-сервера.

Дополнительно в RussianIP будут включены три частные сети RFC1918:

Код: bash
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

Это необходимо, чтобы обращения к локальным адресам не попадали под маршрутизацию через VPN, если в правилах используется условие
Код: bash
dst-address-list=!RussianIP
.

2. Исходные данные

Для примера используем следующие адреса:

Код: bash
MikroTik:        192.168.0.1
Linux-сервер:    192.168.0.10
SSH-пользователь: geoip-updater
SSH-ключ:        /root/.ssh/mikrotik-geoip

Замените адреса на свои.

3. Создание отдельной группы и пользователя на MikroTik

Откройте терминал RouterOS и выполните:

Код: bash
/user group add name=geoip-updater policy=ssh,read,write,ftp
/user add name=geoip-updater group=geoip-updater address=192.168.0.10/32

Пользователь будет иметь отдельную учётную запись и ограничение по IP-адресу Linux-сервера.

4. Создание SSH-ключа на Linux

Выполните от имени root:

Код: bash
mkdir -p /root/.ssh
chmod 700 /root/.ssh

ssh-keygen -t ed25519 -f /root/.ssh/mikrotik-geoip -C geoip-updater

При запросе пароля ключа оставьте его пустым, нажав Enter два раза.

5. Передача публичного ключа на MikroTik через SFTP

Публичный ключ необходимо передать на MikroTik с помощью уже имеющейся учётной записи администратора, у которой есть доступ к SFTP.

Подключаемся с Linux-сервера:

Код: bash
sftp ADMIN_USER@192.168.0.1

Вместо
Код: bash
ADMIN_USER
укажите существующего пользователя MikroTik.

В открывшейся консоли SFTP выполняем:

Код: bash
put /root/.ssh/mikrotik-geoip.pub
ls
quit

Публичный ключ будет загружен в файловое хранилище MikroTik.

Теперь импортируем его для созданного пользователя:

Код: bash
/user ssh-keys import user=geoip-updater public-key-file=mikrotik-geoip.pub

После успешного импорта временный файл публичного ключа можно удалить:

Код: bash
/file remove [find where name="mikrotik-geoip.pub"]

6. Проверка SSH-подключения

На Linux-сервере выполняем:

Код: bash
ssh -i /root/.ssh/mikrotik-geoip 
-o IdentitiesOnly=yes 
-o BatchMode=yes 
-o ConnectTimeout=10 
geoip-updater@192.168.0.1 
'/system identity print'

Должно отобразиться имя MikroTik.

7. Проверка SFTP

Создаём тестовый файл:

Код: bash
echo "SFTP test" > /tmp/geoip-test.txt

Подключаемся уже под новым пользователем с использованием созданного ключа:

Код: bash
sftp -i /root/.ssh/mikrotik-geoip 
-o IdentitiesOnly=yes 
geoip-updater@192.168.0.1

Внутри SFTP выполняем:

Код: bash
put /tmp/geoip-test.txt
ls
quit

Если файл успешно загружен, SFTP работает.

После проверки тестовый файл можно удалить на MikroTik:

Код: bash
/file remove [find where name="geoip-test.txt"]

8. Создание скрипта обновления

На Linux-сервере создаём файл:

Код: bash
vi /usr/local/bin/update-ru-mikrotik.sh

Вставляем следующее содержимое:

Код: bash
#!/bin/bash
set -Eeuo pipefail

URL="https://raw.githubusercontent.com/ipverse/country-ip-blocks/master/country/ru/ipv4-aggregated.txt"
ROUTER="192.168.0.1"
SSH_USER="geoip-updater"
SSH_KEY="/root/.ssh/mikrotik-geoip"
LIST_NAME="RussianIP"

WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT

# Не допускаем параллельного запуска
exec 9>/run/lock/update-ru-mikrotik.lock
flock -n 9 || {
    echo "Обновление уже выполняется. Выход."
    exit 0
}

SSH_OPTS=(
    -i "$SSH_KEY"
    -o IdentitiesOnly=yes
    -o BatchMode=yes
    -o ConnectTimeout=10
    -o ServerAliveInterval=15
    -o ServerAliveCountMax=3
)

echo "===== $(date '+%F %T') Начало обновления $LIST_NAME ====="

# 1. Скачиваем список
curl -fLsS --retry 3 --retry-delay 5 
    --connect-timeout 10 --max-time 180 
    "$URL" -o "$WORKDIR/source.txt"

# 2. Проверяем подсети и формируем RSC
GEN="geoip-$(date -u +%Y%m%dT%H%M%SZ)"
export GEN

python3 - "$WORKDIR/source.txt" "$WORKDIR/update.rsc" <<'PY'
import ipaddress
import os
import sys

source, target = sys.argv[1:3]
generation = os.environ["GEN"]

nets = []

with open(source) as f:
    for number, line in enumerate(f, 1):
        line = line.strip()
        if not line or line.startswith("#"):
            continue

        try:
            net = ipaddress.ip_network(line.split()[0], strict=True)
            if net.version != 4:
                raise ValueError("не IPv4")
            nets.append(str(net))
        except ValueError as e:
            raise SystemExit(
                f"Ошибка в строке {number}: {line}: {e}"
            )

# Добавляем частные сети RFC1918
nets.extend([
    "10.0.0.0/8",
    "172.16.0.0/12",
    "192.168.0.0/16",
])

if len(nets) < 1000:
    raise SystemExit(f"Слишком мало подсетей: {len(nets)}")

if len(nets) != len(set(nets)):
    raise SystemExit("В списке обнаружены дубликаты")

with open(target, "w") as f:
    for net in nets:
        f.write(
            f"/ip firewall address-list add "
            f"list=RussianIP address={net} comment={generation}\n"
        )

with open(target + ".count", "w") as f:
    f.write(str(len(nets)))

print(
    f"Проверка пройдена: "
    f"{len(nets)} уникальных IPv4-подсетей"
)
PY

COUNT="$(cat "$WORKDIR/update.rsc.count")"
REMOTE_FILE="geoip-russian-${GEN}.rsc"

# 3. Передаём файл на MikroTik
printf 'put %s /%s\n' "$WORKDIR/update.rsc" "$REMOTE_FILE" |
    sftp -b - "${SSH_OPTS[@]}" "${SSH_USER}@${ROUTER}"

echo "Файл передан: $REMOTE_FILE"

# 4. Удаляем старые записи RussianIP
ssh "${SSH_OPTS[@]}" "${SSH_USER}@${ROUTER}" 
    "/ip firewall address-list remove [find where list=\"${LIST_NAME}\"]"

echo "Старые записи удалены."

# 5. Импортируем новый список
ssh "${SSH_OPTS[@]}" "${SSH_USER}@${ROUTER}" 
    "/import file-name=${REMOTE_FILE}"

# 6. Проверяем количество записей
ACTUAL="$(
    ssh "${SSH_OPTS[@]}" "${SSH_USER}@${ROUTER}" 
        "/ip firewall address-list print count-only where list=\"${LIST_NAME}\"" |
    tr -d '\r' | tr -d '[:space:]'
)"

if [[ ! "$ACTUAL" =~ ^[0-9]+$ ]] || [[ "$ACTUAL" != "$COUNT" ]]; then
    echo "ОШИБКА: ожидалось $COUNT записей, получено: $ACTUAL"
    exit 1
fi

echo "Проверка успешна: $ACTUAL записей в $LIST_NAME"

# 7. Удаляем загруженный файл
ssh "${SSH_OPTS[@]}" "${SSH_USER}@${ROUTER}" 
    "/file remove [find where name=\"${REMOTE_FILE}\"]"

echo "===== Обновление завершено успешно ====="

Сохраняем файл и устанавливаем права:

Код: bash
chmod 700 /usr/local/bin/update-ru-mikrotik.sh

9. Ручной запуск и проверка

Первый запуск выполняем вручную:

Код: bash
/usr/local/bin/update-ru-mikrotik.sh

При успешном завершении в конце увидим примерно следующее:

Код: bash
Проверка пройдена: N уникальных IPv4-подсетей
Файл передан: geoip-russian-....rsc
Старые записи удалены.
Script file loaded and executed successfully
Проверка успешна: N записей в RussianIP
===== Обновление завершено успешно =====

Проверить количество записей непосредственно на MikroTik:

Код: bash
/ip firewall address-list print count-only where list="RussianIP"

Проверить наличие частных сетей:

Код: bash
/ip firewall address-list print where list="RussianIP" and address="10.0.0.0/8"
/ip firewall address-list print where list="RussianIP" and address="172.16.0.0/12"
/ip firewall address-list print where list="RussianIP" and address="192.168.0.0/16"

10. Настройка ежедневного запуска через cron

Создаём файл:

Код: bash
vi /etc/cron.d/update-ru-mikrotik

Содержимое:

Код: bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
CRON_TZ=Europe/Moscow

0 4 * * * root /usr/local/bin/update-ru-mikrotik.sh >> /var/log/update-ru-mikrotik.log 2>&1

Устанавливаем права и запускаем cron:

Код: bash
chmod 644 /etc/cron.d/update-ru-mikrotik
systemctl enable --now cron

Проверяем:

Код: bash
cat /etc/cron.d/update-ru-mikrotik
systemctl status cron --no-pager

Теперь обновление будет выполняться ежедневно в 04:00 по московскому времени.

11. Просмотр журнала обновлений

Посмотреть последние записи:

Код: bash
tail -n 40 /var/log/update-ru-mikrotik.log

Наблюдать за журналом в реальном времени:

Код: bash
tail -f /var/log/update-ru-mikrotik.log

12. Важные замечания

  • Linux-сервер должен иметь доступ к интернету и MikroTik по SSH/SFTP.
  • На MikroTik должен быть доступен SSH и импорт RSC-файлов.
  • В скрипте предусмотрена проверка корректности IPv4-подсетей, отсутствия дубликатов и минимального количества записей.
  • Частные диапазоны RFC1918 добавляются при каждом формировании файла, поэтому они не пропадут после очередного обновления.
  • Скрипт удаляет старые записи RussianIP перед импортом нового списка. Если импорт завершится ошибкой, список может оказаться пустым или неполным. После первого запуска обязательно проверьте результат.
  • Скрипт удаляет только собственный временный RSC-файл и не затрагивает остальные файлы MikroTik.

Готово!

Теперь MikroTik ежедневно получает актуальный список российских IPv4-подсетей и частных сетей RFC1918.
  •  

🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.