From f35aa6987e314b6794985738b5fb6add725066c7 Mon Sep 17 00:00:00 2001 From: "a.kazantsev" Date: Wed, 1 Jul 2026 17:11:00 +0300 Subject: [PATCH] gigacode --- README.md | 34 ++++++++++++ config.env.example | 34 ++++++++++++ get-ip.sh | 126 ++++++++++++++++++++++++++++++++------------- 3 files changed, 157 insertions(+), 37 deletions(-) create mode 100644 config.env.example diff --git a/README.md b/README.md index 716cc68..dccb24c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ # get-ip-prefix +Скрипт для скачивания списков IPv4-адресов и генерации конфигурации BIRD. + +## Установка + +1. Скопируйте `config.env.example` в `config.env` и настройте параметры: + - URL-адреса списков + - Директории для хранения файлов + - Имена выходных файлов + +2. Установите зависимости: + - `bash` + - `wget` + - `md5sum` + - `bird` (для перезагрузки конфигурации) + +## Использование + +```bash +./get-ip.sh +``` + +Скрипт автоматически: +- Скачивает списки IP-адресов +- Проверяет изменение данных через MD5-хеш +- Генерирует конфигурацию BIRD +- Перезагружает службу BIRD + +## Настройка cron + +Добавьте в crontab для автоматического обновления: + +```cron +0 */6 * * * /path/to/get-ip.sh >> /var/log/get-ip.log 2>&1 +``` diff --git a/config.env.example b/config.env.example new file mode 100644 index 0000000..f5e36fa --- /dev/null +++ b/config.env.example @@ -0,0 +1,34 @@ +#!/bin/bash + +# Рабочая директория +WORKDIR="/var/lib/bird" + +# Директория для хранения скачанных списков +LIST_DIR="$WORKDIR/lists" + +# Файл для хранения MD5 хеша +MD5_FILE="$WORKDIR/md5sum.txt" + +# Директория для конфигурации BIRD +BIRD_DIR="/etc/bird/conf.d" + +# Имена выходных файлов для BIRD +RU_OUT="ru_routes.conf" +IP_OUT="ip_routes.conf" +META_OUT="meta_routes.conf" +GOOGLE_OUT="google_routes.conf" +MICROSOFT_OUT="microsoft_routes.conf" +TELEGRAM_OUT="telegram_routes.conf" +FACEBOOK_OUT="facebook_routes.conf" + +# URL для скачивания списков (примерные URL, укажите ��вои) +RU_URL="https://example.com/ru.lst" +IP_URL="https://example.com/ip.lst" +META_URL="https://example.com/meta.lst" +GOOGLE_URL="https://example.com/google.lst" +MICROSOFT_URL="https://example.com/microsoft.lst" +TELEGRAM_URL="https://example.com/telegram.lst" +FACEBOOK_URL="https://example.com/facebook.lst" + +# Удалять комментарии из RU.lst перед генерацией конфига (true/false) +CLEAN_RU="true" diff --git a/get-ip.sh b/get-ip.sh index b276213..a03f6d2 100644 --- a/get-ip.sh +++ b/get-ip.sh @@ -1,41 +1,93 @@ #!/bin/bash -# Скрипт для скачивания IPv4 адресов и добавления их в bird + +# Скрипт для скачивания IPv4-адресов и добавления их в BIRD # Основан на https://habr.com/ru/articles/359268/ # Доработал AlexandrLinux (собака) bafista.ru -# Основной список адресов взят тут: https://github.com/lord-alfred/ipranges/tree/main?tab=readme-ov-file -workdir=/opt/get-ip -cd $workdir/list -wget -N -O RU.lst https://github.com/ipverse/rir-ip/raw/refs/heads/master/country/ru/ipv4-aggregated.txt -#wget -N https://antifilter.download/list/ipsum.lst -#wget -N https://antifilter.download/list/subnet.lst -wget -N -O ip.lst https://antifilter.network/download/ip.lst -wget -N -O Meta.lst https://raw.githubusercontent.com/SecOps-Institute/FacebookIPLists/master/facebook_ip_list.lst -wget -N -O Google.lst https://raw.githubusercontent.com/lord-alfred/ipranges/main/google/ipv4.txt -wget -N -O Microsoft.lst https://raw.githubusercontent.com/lord-alfred/ipranges/main/microsoft/ipv4.txt -wget -N -O Telegram.lst https://github.com/lord-alfred/ipranges/raw/refs/heads/main/telegram/ipv4.txt -wget -N -O Facebook.lst https://github.com/lord-alfred/ipranges/raw/refs/heads/main/facebook/ipv4.txt -old=$(cat $workdir/md5.txt); -new=$(cat $workdir/list/*.lst | md5sum | head -c 32); -if [ "$old" != "$new" ] -then -echo "md5 chandge" -#cat $workdir/list/ipsum.lst | sed 's_.*_route & reject;_' > /etc/bird/ipsum.txt -#cat $workdir/list/subnet.lst | sed 's_.*_route & reject;_' > /etc/bird/subnet.txt -echo "Configure bird start" -sed -i '/^#/d' $workdir/list/RU.lst && cat $workdir/list/RU.lst | sed 's_.*_route & reject;_' > /etc/bird/RU.txt -cat $workdir/list/ip.lst | sed 's_.*_route & reject;_' > /etc/bird/ip.txt -cat $workdir/list/Meta.lst | sed 's_.*_route & reject;_' > /etc/bird/Meta.txt -cat $workdir/list/Google.lst | sed 's_.*_route & reject;_' > /etc/bird/Google.txt -cat $workdir/list/Microsoft.lst | sed 's_.*_route & reject;_' > /etc/bird/Microsoft.txt -cat $workdir/list/Telegram.lst | sed 's_.*_route & reject;_' > /etc/bird/Telegram.txt -cat $workdir/list/Facebook.lst | sed 's_.*_route & reject;_' > /etc/bird/Facebook.txt -/usr/sbin/birdc configure; -logger "BGP list reconfigured"; -echo "Configure bird done" -echo $new > $workdir/md5.txt; -echo "New md5 write" -exit 0 +# Переписан с выносом параметров в config.env + +set -euo pipefail # exit on error, undefined var, fail pipe + +# Load config +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="$SCRIPT_DIR/config.env" + +if [[ ! -f "$CONFIG_FILE" ]]; then + echo "❌ Ошибка: не найден конфигурационный файл $CONFIG_FILE" + exit 1 fi -echo "MD5 not change" -echo "Bird not reconfigure" -exit 0 + +# shellcheck source=config.env +source "$CONFIG_FILE" + +# Validate required variables +for var in WORKDIR LIST_DIR MD5_FILE BIRD_DIR; do + [[ -z "${!var:-}" ]] && { echo "❌ Переменная $var не установлена в config.env"; exit 1; } +done + +# Create directories if missing +mkdir -p "$LIST_DIR" + +echo "ℹ️ Работаем в $WORKDIR" + +# Скачиваем списки +download_list() { + local url="$1" + local output="$LIST_DIR/$2" + echo "⬇️ Скачивание $2..." + wget -N -O "$output" "$url" || { echo "⚠️ Ошибка при скачивании $2"; return 1; } +} + +download_list "$RU_URL" "RU.lst" +download_list "$IP_URL" "ip.lst" +download_list "$META_URL" "Meta.lst" +download_list "$GOOGLE_URL" "Google.lst" +download_list "$MICROSOFT_URL" "Microsoft.lst" +download_list "$TELEGRAM_URL" "Telegram.lst" +download_list "$FACEBOOK_URL" "Facebook.lst" + +# Считаем md5 от всех .lst-файлов +old=$(cat "$MD5_FILE" 2>/dev/null || true) +new=$(cat "$LIST_DIR"/*.lst 2>/dev/null | md5sum | cut -c1-32 || true) + +# Обновляем только если изменились данные +if [[ "$old" != "$new" ]]; then + echo "✅ MD5 изменился, обновляем конфигурацию BIRD..." + + # Генерируем конфиги для BIRD + gen_bird_route() { + local src="$1" + local out="$2" + local clean="$3" + if [[ "$clean" == "true" ]] && [[ -f "$src" ]]; then + sed -i '/^#/d' "$src" + fi + cat "$src" | sed 's_.*_route & reject;_' > "$out" + echo "🔧 Сгенерирован $out" + } + + # ru - может содержать комментарии, опционально удаляем + gen_bird_route "$LIST_DIR/RU.lst" "$BIRD_DIR/$RU_OUT" "${CLEAN_RU:-true}" + gen_bird_route "$LIST_DIR/ip.lst" "$BIRD_DIR/$IP_OUT" "false" + gen_bird_route "$LIST_DIR/Meta.lst" "$BIRD_DIR/$META_OUT" "false" + gen_bird_route "$LIST_DIR/Google.lst" "$BIRD_DIR/$GOOGLE_OUT" "false" + gen_bird_route "$LIST_DIR/Microsoft.lst" "$BIRD_DIR/$MICROSOFT_OUT" "false" + gen_bird_route "$LIST_DIR/Telegram.lst" "$BIRD_DIR/$TELEGRAM_OUT" "false" + gen_bird_route "$LIST_DIR/Facebook.lst" "$BIRD_DIR/$FACEBOOK_OUT" "false" + + # Перезагружаем BIRD + if /usr/sbin/birdc configure; then + logger "BGP list reconfigured" + echo "✅ Конфигурация BIRD применена успешно" + else + echo "❌ Ошибка при применении конфигурации BIRD" + exit 1 + fi + + # Сохраняем новый md5 + echo "$new" > "$MD5_FILE" + echo "💾 Новый MD5 сохранён: $new" +else + echo "ℹ️ MD5 не изменился, перенастройка BIRD не требуется" +fi + +echo "🎉 Готово."