Моя шпаргалка :)

Мануалы и настройки => Сетевое оборудование => Тема начата: George от Нояб. 13, 2026, 08:54

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

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

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

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

https://raw.githubusercontent.com/ipverse/country-ip-blocks/master/country/ru/ipv4-aggregated.txt
Обновление будет выполняться один раз в сутки с Linux-сервера.

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

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

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

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

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

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

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

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

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

/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:

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-сервера:

sftp ADMIN_USER@192.168.0.1
Вместо ADMIN_USER укажите существующего пользователя MikroTik.

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

put /root/.ssh/mikrotik-geoip.pub
ls
quit

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

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

/user ssh-keys import user=geoip-updater public-key-file=mikrotik-geoip.pub
После успешного импорта временный файл публичного ключа можно удалить:

/file remove [find where name="mikrotik-geoip.pub"]
6. Проверка SSH-подключения

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

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

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

echo "SFTP test" > /tmp/geoip-test.txt
Подключаемся уже под новым пользователем с использованием созданного ключа:

sftp -i /root/.ssh/mikrotik-geoip
-o IdentitiesOnly=yes
geoip-updater@192.168.0.1

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

put /tmp/geoip-test.txt
ls
quit

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

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

/file remove [find where name="geoip-test.txt"]
8. Создание скрипта обновления

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

vi /usr/local/bin/update-ru-mikrotik.sh
Вставляем следующее содержимое:

#!/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 "===== Обновление завершено успешно ====="

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

chmod 700 /usr/local/bin/update-ru-mikrotik.sh
9. Ручной запуск и проверка

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

/usr/local/bin/update-ru-mikrotik.sh
При успешном завершении в конце увидим примерно следующее:

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

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

/ip firewall address-list print count-only where list="RussianIP"
Проверить наличие частных сетей:

/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

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

vi /etc/cron.d/update-ru-mikrotik
Содержимое:

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:

chmod 644 /etc/cron.d/update-ru-mikrotik
systemctl enable --now cron

Проверяем:

cat /etc/cron.d/update-ru-mikrotik
systemctl status cron --no-pager

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

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

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

tail -n 40 /var/log/update-ru-mikrotik.log
Наблюдать за журналом в реальном времени:

tail -f /var/log/update-ru-mikrotik.log
12. Важные замечания


Готово!

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