Автоматическое обновление списка российских 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.sh9. Ручной запуск и проверкаПервый запуск выполняем вручную:
/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.log12. Важные замечания- Linux-сервер должен иметь доступ к интернету и MikroTik по SSH/SFTP.
- На MikroTik должен быть доступен SSH и импорт RSC-файлов.
- В скрипте предусмотрена проверка корректности IPv4-подсетей, отсутствия дубликатов и минимального количества записей.
- Частные диапазоны RFC1918 добавляются при каждом формировании файла, поэтому они не пропадут после очередного обновления.
- Скрипт удаляет старые записи RussianIP перед импортом нового списка. Если импорт завершится ошибкой, список может оказаться пустым или неполным. После первого запуска обязательно проверьте результат.
- Скрипт удаляет только собственный временный RSC-файл и не затрагивает остальные файлы MikroTik.
Готово!
Теперь MikroTik ежедневно получает актуальный список российских IPv4-подсетей и частных сетей RFC1918.