Удалил лишнее, добавил скрипт
This commit is contained in:
parent
0b8bae3ab0
commit
8e04f74c55
12 changed files with 14 additions and 1238 deletions
36
README.md
36
README.md
|
|
@ -1,36 +0,0 @@
|
||||||
# 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
|
|
||||||
```
|
|
||||||
|
|
@ -1,185 +0,0 @@
|
||||||
# Domain-Based Routing для RHEL
|
|
||||||
|
|
||||||
Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием `firewalld`, `ipset` и `dnsmasq`.
|
|
||||||
|
|
||||||
## Возможности
|
|
||||||
|
|
||||||
- Автоматическое разрешение доменных имён в IP-адреса
|
|
||||||
- Добавление IP-адресов в `ipset` для быстрой фильтрации
|
|
||||||
- Настройка правил `firewalld` для перенаправления трафика
|
|
||||||
- Интеграция с `dnsmasq` для локального DNS-кэширования
|
|
||||||
- Автовосстановление `ipset` при перезагрузке
|
|
||||||
|
|
||||||
## Требования
|
|
||||||
|
|
||||||
- RHEL/CentOS 8+ с `firewalld`, `ipset`, `dnsmasq`
|
|
||||||
- `dig` (пакет `bind-utils`)
|
|
||||||
- `root` права
|
|
||||||
|
|
||||||
## Установка
|
|
||||||
|
|
||||||
1. Скопируйте `domain-routing.sh` на сервер:
|
|
||||||
```bash
|
|
||||||
cp domain-routing.sh /usr/local/bin/
|
|
||||||
chmod +x /usr/local/bin/domain-routing.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Создайте конфигурационный файл:
|
|
||||||
```bash
|
|
||||||
cp domain-routing.env.example /opt/domain-routing/domain-routing.env
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Отредактируйте `domain-routing.env`:
|
|
||||||
```bash
|
|
||||||
DOMAINS_FILE="/opt/domain-routing/domains.txt"
|
|
||||||
DNSMASQ_CONF_DIR="/etc/dnsmasq.d"
|
|
||||||
IPSET_NAME="domain_routing"
|
|
||||||
FIREWALL_ZONE="domain_routing"
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Создайте файл со списком доменов:
|
|
||||||
```bash
|
|
||||||
cat > /opt/domain-routing/domains.txt << 'EOF'
|
|
||||||
google.com
|
|
||||||
amazon.com
|
|
||||||
cloudflare.com
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Запустите скрипт:
|
|
||||||
```bash
|
|
||||||
sudo /usr/local/bin/domain-routing.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Использование
|
|
||||||
|
|
||||||
### Базовое использование
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### С параметрами командной строки
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing.sh \
|
|
||||||
--domains-file /path/to/domains.txt \
|
|
||||||
--ipset-name custom_ipset \
|
|
||||||
--firewall-zone custom_zone
|
|
||||||
```
|
|
||||||
|
|
||||||
### Просмотр справки
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing.sh --help
|
|
||||||
```
|
|
||||||
|
|
||||||
## Конфигурация
|
|
||||||
|
|
||||||
### Основные переменные в `domain-routing.env`
|
|
||||||
|
|
||||||
| Переменная | Описание | Обязательная |
|
|
||||||
|------------|----------|-------------|
|
|
||||||
| `DOMAINS_FILE` | Путь к файлу со списком доменов | Да |
|
|
||||||
| `IPSET_NAME` | Имя создаваемого ipset | Да |
|
|
||||||
| `FIREWALL_ZONE` | Имя зоны firewalld | Да |
|
|
||||||
| `DNSMASQ_CONF_DIR` | Директория для конфигов dnsmasq | Да |
|
|
||||||
| `RESOLV_CONF` | Путь к resolv.conf | Нет |
|
|
||||||
|
|
||||||
### Формат файла доменов
|
|
||||||
|
|
||||||
Один домен на строку, комментарии начинаются с `#`:
|
|
||||||
```
|
|
||||||
# Комментарий
|
|
||||||
google.com
|
|
||||||
www.example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## Как это работает
|
|
||||||
|
|
||||||
1. Скрипт читает список доменов из файла
|
|
||||||
2. Разрешает каждый домен в IP-адреса через `dig`
|
|
||||||
3. Создаёт `ipset` и добавляет в него IP-адреса
|
|
||||||
4. Настраивает `firewalld` для использования ipset
|
|
||||||
5. Генерирует конфиг для `dnsmasq`
|
|
||||||
6. Сохраняет ipset для автовосстановления при перезагрузке
|
|
||||||
|
|
||||||
## Управление ipset
|
|
||||||
|
|
||||||
### Просмотр ipset
|
|
||||||
```bash
|
|
||||||
ipset list domain_routing
|
|
||||||
```
|
|
||||||
|
|
||||||
### Удаление ipset
|
|
||||||
```bash
|
|
||||||
ipset destroy domain_routing
|
|
||||||
```
|
|
||||||
|
|
||||||
### Пересоздание ipset
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Автовосстановление
|
|
||||||
|
|
||||||
При установке создаётся systemd-сервис `ipset-restore@domain_routing.service`, который восстанавливает ipset при каждом запуске системы.
|
|
||||||
|
|
||||||
### Управление сервисом
|
|
||||||
```bash
|
|
||||||
# Проверка статуса
|
|
||||||
systemctl status ipset-restore@domain_routing.service
|
|
||||||
|
|
||||||
# Запуск вручную
|
|
||||||
systemctl start ipset-restore@domain_routing.service
|
|
||||||
|
|
||||||
# Отключение автовосстановления
|
|
||||||
systemctl disable ipset-restore@domain_routing.service
|
|
||||||
```
|
|
||||||
|
|
||||||
## Устранение неполадок
|
|
||||||
|
|
||||||
### Ошибка: "Не удалось разрешить ни один домен"
|
|
||||||
- Проверьте доступность DNS: `dig google.com`
|
|
||||||
- Убедитесь, что в файле доменов нет опечаток
|
|
||||||
|
|
||||||
### Ошибка: "firewalld: no zone"
|
|
||||||
- Создайте зону вручную: `firewall-cmd --new-zone=test --permanent`
|
|
||||||
|
|
||||||
### Dnsmasq не перезагружается
|
|
||||||
- Убедитесь, что dnsmasq установлен: `dnsmasq --version`
|
|
||||||
- Запустите вручную: `systemctl start dnsmasq`
|
|
||||||
|
|
||||||
## Примеры
|
|
||||||
|
|
||||||
### Маршрутизация трафика Google через VPN
|
|
||||||
```bash
|
|
||||||
# В domain-routing.env
|
|
||||||
DOMAINS_FILE="/etc/domain-routing/google-domains.txt"
|
|
||||||
IPSET_NAME="google_via_vpn"
|
|
||||||
FIREWALL_ZONE="vpn_routing"
|
|
||||||
|
|
||||||
# В /etc/domain-routing/google-domains.txt
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
maps.google.com
|
|
||||||
```
|
|
||||||
|
|
||||||
### Маршрутизация рекламных доменов в "чёрную дыру"
|
|
||||||
```bash
|
|
||||||
# В domain-routing.env
|
|
||||||
DOMAINS_FILE="/etc/domain-routing/ads-domains.txt"
|
|
||||||
IPSET_NAME="ads_block"
|
|
||||||
FIREWALL_ZONE="ads_block"
|
|
||||||
|
|
||||||
# Добавьте правило в firewalld для блокировки
|
|
||||||
firewall-cmd --zone=ads_block --add-rich-rule='rule family="ipv4" source ipset="ads_block" drop' --permanent
|
|
||||||
firewall-cmd --reload
|
|
||||||
```
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
- Скрипт должен запускаться от имени `root`
|
|
||||||
- Файлы конфигурации содержат пути к системным ресурсам - храните их в защищённых местах
|
|
||||||
- ipset используется только для IPv4 (можно расширить для IPv6)
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|
@ -1,223 +0,0 @@
|
||||||
# Domain-Based Routing для BIRD BGP
|
|
||||||
|
|
||||||
Скрипт для настройки маршрутизации трафика на основе доменных имён с использованием `BIRD BGP`.
|
|
||||||
|
|
||||||
## Возможности
|
|
||||||
|
|
||||||
- Автоматическое разрешение доменных имён в IP-адреса (IPv4 и IPv6)
|
|
||||||
- Генерация конфигурационного файла для BIRD с route statements
|
|
||||||
- Автоматическая перезагрузка BIRD после изменения конфига
|
|
||||||
- MD5 хеш для отслеживания изменений
|
|
||||||
- Автовосстановление конфига при перезагрузке через systemd
|
|
||||||
|
|
||||||
## Требования
|
|
||||||
|
|
||||||
- RHEL/CentOS 8+ с `BIRD`
|
|
||||||
- `dig` (пакет `bind-utils`)
|
|
||||||
- `root` права
|
|
||||||
|
|
||||||
## Установка
|
|
||||||
|
|
||||||
1. Скопируйте `domain-routing-bird.sh` на сервер:
|
|
||||||
```bash
|
|
||||||
cp domain-routing-bird.sh /usr/local/bin/
|
|
||||||
chmod +x /usr/local/bin/domain-routing-bird.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Создайте конфигурационный файл:
|
|
||||||
```bash
|
|
||||||
cp domain-routing-bird.env.example /opt/domain-routing/domain-routing-bird.env
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Отредактируйте `domain-routing-bird.env`:
|
|
||||||
```bash
|
|
||||||
DOMAINS_FILE="/opt/domain-routing/domains.txt"
|
|
||||||
BIRD_CONF_DIR="/etc/bird/conf.d"
|
|
||||||
BIRD_CONF_FILE="domain-routing.conf"
|
|
||||||
ROUTE_GATEWAY="10.0.0.1"
|
|
||||||
ROUTE_INTERFACE="eth0"
|
|
||||||
ENABLE_IPV4="true"
|
|
||||||
ENABLE_IPV6="false"
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Создайте файл со списком доменов:
|
|
||||||
```bash
|
|
||||||
cat > /opt/domain-routing/domains.txt << 'EOF'
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
amazon.com
|
|
||||||
cloudflare.com
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Запустите скрипт:
|
|
||||||
```bash
|
|
||||||
sudo /usr/local/bin/domain-routing-bird.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Использование
|
|
||||||
|
|
||||||
### Базовое использование
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing-bird.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### С параметрами командной строки
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing-bird.sh \
|
|
||||||
--domains-file /path/to/domains.txt \
|
|
||||||
--bird-conf-dir /etc/bird/conf.d \
|
|
||||||
--bird-conf-file domain-routing.conf \
|
|
||||||
--gateway 10.0.0.1 \
|
|
||||||
--interface eth0
|
|
||||||
```
|
|
||||||
|
|
||||||
### Просмотр справки
|
|
||||||
```bash
|
|
||||||
sudo ./domain-routing-bird.sh --help
|
|
||||||
```
|
|
||||||
|
|
||||||
## Конфигурация
|
|
||||||
|
|
||||||
### Основные переменные в `domain-routing-bird.env`
|
|
||||||
|
|
||||||
| Переменная | Описание | Обязательная |
|
|
||||||
|------------|----------|-------------|
|
|
||||||
| `DOMAINS_FILE` | Путь к файлу со списком доменов | Да |
|
|
||||||
| `BIRD_CONF_DIR` | Директория конфигов BIRD | Да |
|
|
||||||
| `BIRD_CONF_FILE` | Имя файла конфига | Да |
|
|
||||||
| `ROUTE_GATEWAY` | Шлюз для маршрутов | Да |
|
|
||||||
| `ROUTE_INTERFACE` | Интерфейс для маршрутов | Да |
|
|
||||||
| `ENABLE_IPV4` | Включить IPv4 (true/false) | Нет (по умолчанию true) |
|
|
||||||
| `ENABLE_IPV6` | Включить IPv6 (true/false) | Нет (по умолчанию false) |
|
|
||||||
|
|
||||||
### Формат файла доменов
|
|
||||||
|
|
||||||
Один домен на строку, комментарии начинаются с `#`:
|
|
||||||
```
|
|
||||||
# Комментарий
|
|
||||||
google.com
|
|
||||||
www.example.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## Как это работает
|
|
||||||
|
|
||||||
1. Скрипт читает список доменов из файла
|
|
||||||
2. Разрешает каждый домен в IP-адреса через `dig` (A и AAAA записи)
|
|
||||||
3. Генерирует конфигурационный файл для BIRD с route statements
|
|
||||||
4. Перезагружает BIRD через `birdc configure`
|
|
||||||
5. Сохраняет MD5 хеш для отслеживания изменений
|
|
||||||
6. Создаёт systemd-сервис для автовосстановления при перезагрузке
|
|
||||||
|
|
||||||
## Структура конфига BIRD
|
|
||||||
|
|
||||||
```
|
|
||||||
# Auto-generated domain routing config
|
|
||||||
# Generated: 2026-07-03
|
|
||||||
# Source: /opt/domain-routing/domains.txt
|
|
||||||
|
|
||||||
route 8.8.8.0/24 via 10.0.0.1 on eth0;
|
|
||||||
route 1.1.1.0/24 via 10.0.0.1 on eth0;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Управление конфигом
|
|
||||||
|
|
||||||
### Просмотр конфига BIRD
|
|
||||||
```bash
|
|
||||||
cat /etc/bird/conf.d/domain-routing.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
### Просмотр маршрутов в BIRD
|
|
||||||
```bash
|
|
||||||
birdc show route all
|
|
||||||
```
|
|
||||||
|
|
||||||
### Перезагрузка BIRD вручную
|
|
||||||
```bash
|
|
||||||
sudo /usr/sbin/birdc configure
|
|
||||||
```
|
|
||||||
|
|
||||||
### Удаление конфига
|
|
||||||
```bash
|
|
||||||
rm /etc/bird/conf.d/domain-routing.conf
|
|
||||||
sudo /usr/sbin/birdc configure
|
|
||||||
```
|
|
||||||
|
|
||||||
## systemd-сервис
|
|
||||||
|
|
||||||
При установке создаётся systemd-сервис `bird-domain-routing.service`, который перезагружает BIRD при каждом запуске системы.
|
|
||||||
|
|
||||||
### Управление сервисом
|
|
||||||
```bash
|
|
||||||
# Проверка статуса
|
|
||||||
systemctl status bird-domain-routing.service
|
|
||||||
|
|
||||||
# Запуск вручную
|
|
||||||
systemctl start bird-domain-routing.service
|
|
||||||
|
|
||||||
# Отключение автовосстановления
|
|
||||||
systemctl disable bird-domain-routing.service
|
|
||||||
```
|
|
||||||
|
|
||||||
## Устранение неполадок
|
|
||||||
|
|
||||||
### Ошибка: "Не удалось разрешить ни один домен"
|
|
||||||
- Проверьте доступность DNS: `dig google.com`
|
|
||||||
- Убедитесь, что в файле доменов нет опечаток
|
|
||||||
|
|
||||||
### Ошибка: "birdc: connect: No such file or directory"
|
|
||||||
- Убедитесь, что BIRD запущен: `systemctl status bird`
|
|
||||||
- Запустите BIRD: `systemctl start bird`
|
|
||||||
|
|
||||||
### Ошибка: "route X.X.X.X: Invalid argument"
|
|
||||||
- Проверьте, что шлюз `ROUTE_GATEWAY` доступен на интерфейсе `ROUTE_INTERFACE`
|
|
||||||
- Проверьте маршруты: `ip route show`
|
|
||||||
|
|
||||||
### BIRD не применяет конфиг
|
|
||||||
- Проверьте синтаксис: `birdc check`
|
|
||||||
- Посмотрите логи: `journalctl -u bird`
|
|
||||||
|
|
||||||
## Примеры
|
|
||||||
|
|
||||||
### Маршрутизация трафика Google через VPN
|
|
||||||
```bash
|
|
||||||
# В domain-routing-bird.env
|
|
||||||
DOMAINS_FILE="/etc/domain-routing/google-domains.txt"
|
|
||||||
BIRD_CONF_FILE="google-routes.conf"
|
|
||||||
ROUTE_GATEWAY="10.8.0.1"
|
|
||||||
ROUTE_INTERFACE="tun0"
|
|
||||||
|
|
||||||
# В /etc/domain-routing/google-domains.txt
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
maps.google.com
|
|
||||||
```
|
|
||||||
|
|
||||||
### Маршрутизация рекламных доменов в "чёрную дыру" (через null0)
|
|
||||||
```bash
|
|
||||||
# В domain-routing-bird.env
|
|
||||||
ROUTE_GATEWAY="null0"
|
|
||||||
|
|
||||||
# Конфиг будет содержать:
|
|
||||||
route 8.8.8.0/24 via null0;
|
|
||||||
```
|
|
||||||
|
|
||||||
## Сравнение с domain-routing.sh (firewalld/ipset)
|
|
||||||
|
|
||||||
| Функция | domain-routing.sh | domain-routing-bird.sh |
|
|
||||||
|---------|-------------------|------------------------|
|
|
||||||
| Технология | firewalld + ipset | BIRD BGP |
|
|
||||||
| Гибкость | Ограничена правилами firewalld | Полный контроль маршрутов |
|
|
||||||
| Поддержка IPv6 | Ограничена | Полная |
|
|
||||||
| Интеграция | Системный firewall | BGP routing |
|
|
||||||
| Сложность | Простая | Более сложная |
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
- Скрипт должен запускаться от имени `root`
|
|
||||||
- Файлы конфигурации содержат пути к системным ресурсам - храните их в защищённых местах
|
|
||||||
- Рассмотрите использование `birdc check` для валидации конфига перед применением
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
MIT
|
|
||||||
11
config.env
11
config.env
|
|
@ -1,16 +1,16 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Рабочая директория
|
# Рабочая директория
|
||||||
WORKDIR="/opt/get-ip"
|
WORKDIR="/opt/get-ip-prefix"
|
||||||
|
|
||||||
# Директория для хранения скачанных списков
|
# Директория для хранения скачанных списков
|
||||||
LIST_DIR="$WORKDIR/lists"
|
LIST_DIR="$WORKDIR"
|
||||||
|
|
||||||
# Файл для хранения MD5 хеша
|
# Файл для хранения MD5 хеша
|
||||||
MD5_FILE="$WORKDIR/md5sum.txt"
|
MD5_FILE="$WORKDIR/md5sum.txt"
|
||||||
|
|
||||||
# Директория для конфигурации BIRD
|
# Директория для конфигурации BIRD
|
||||||
BIRD_DIR="/etc/bird/conf.d"
|
BIRD_DIR="/etc/bird"
|
||||||
|
|
||||||
# Имена выходных файлов для BIRD
|
# Имена выходных файлов для BIRD
|
||||||
RU_OUT="ru_routes.conf"
|
RU_OUT="ru_routes.conf"
|
||||||
|
|
@ -20,6 +20,8 @@ GOOGLE_OUT="google_routes.conf"
|
||||||
MICROSOFT_OUT="microsoft_routes.conf"
|
MICROSOFT_OUT="microsoft_routes.conf"
|
||||||
TELEGRAM_OUT="telegram_routes.conf"
|
TELEGRAM_OUT="telegram_routes.conf"
|
||||||
FACEBOOK_OUT="facebook_routes.conf"
|
FACEBOOK_OUT="facebook_routes.conf"
|
||||||
|
YOUTUBE_OUT="youtube_routes.conf"
|
||||||
|
CLOUDFLARE_OUT="cloudflare_routes.conf"
|
||||||
|
|
||||||
# URL для скачивания списков (примерные URL, укажите <20><>вои)
|
# URL для скачивания списков (примерные URL, укажите <20><>вои)
|
||||||
RU_URL="https://github.com/ipverse/rir-ip/raw/refs/heads/master/country/ru/ipv4-aggregated.txt"
|
RU_URL="https://github.com/ipverse/rir-ip/raw/refs/heads/master/country/ru/ipv4-aggregated.txt"
|
||||||
|
|
@ -29,6 +31,9 @@ GOOGLE_URL="https://raw.githubusercontent.com/lord-alfred/ipranges/main/google/i
|
||||||
MICROSOFT_URL="https://raw.githubusercontent.com/lord-alfred/ipranges/main/microsoft/ipv4.txt"
|
MICROSOFT_URL="https://raw.githubusercontent.com/lord-alfred/ipranges/main/microsoft/ipv4.txt"
|
||||||
TELEGRAM_URL="https://github.com/lord-alfred/ipranges/raw/refs/heads/main/telegram/ipv4.txt"
|
TELEGRAM_URL="https://github.com/lord-alfred/ipranges/raw/refs/heads/main/telegram/ipv4.txt"
|
||||||
FACEBOOK_URL="https://github.com/lord-alfred/ipranges/raw/refs/heads/main/facebook/ipv4.txt"
|
FACEBOOK_URL="https://github.com/lord-alfred/ipranges/raw/refs/heads/main/facebook/ipv4.txt"
|
||||||
|
YOUTUBE_URL="https://raw.githubusercontent.com/touhidurrr/iplist-youtube/refs/heads/main/lists/cidr4.txt"
|
||||||
|
CLOUDFLARE_URL="https://github.com/rezmoss/cloud-provider-ip-addresses/raw/refs/heads/main/cloudflare/cloudflare_ips_v4.txt"
|
||||||
|
|
||||||
# Удалять комментарии из RU.lst перед генерацией конфига (true/false)
|
# Удалять комментарии из RU.lst перед генерацией конфига (true/false)
|
||||||
CLEAN_RU="true"
|
CLEAN_RU="true"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Конфигурационный файл для domain-based routing с BIRD BGP
|
|
||||||
# Скопируйте этот файл в domain-routing-bird.env и настройте под ваши нужды
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ПУТИ И ФАЙЛЫ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Файл со списком доменов для маршрутизации (один домен на строку)
|
|
||||||
# DOMAINS_FILE="/opt/domain-routing/domains.txt"
|
|
||||||
|
|
||||||
# Директория для конфигов BIRD
|
|
||||||
# BIRD_CONF_DIR="/etc/bird/conf.d"
|
|
||||||
|
|
||||||
# Имя выходного файла конфига BIRD
|
|
||||||
# BIRD_CONF_FILE="domain-routing.conf"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# МАРШРУТИЗАЦИЯ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Шлюз для маршрутов (IP-адрес шлюза на локальном интерфейсе)
|
|
||||||
# ROUTE_GATEWAY="10.0.0.1"
|
|
||||||
|
|
||||||
# Интерфейс для маршрутов
|
|
||||||
# ROUTE_INTERFACE="eth0"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# IP VERSIONS
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Включить IPv4 маршруты (true/false)
|
|
||||||
# ENABLE_IPV4="true"
|
|
||||||
|
|
||||||
# Включить IPv6 маршруты (true/false)
|
|
||||||
# ENABLE_IPV6="false"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# СУММАРИЗАЦИЯ МАРШРУТОВ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Суммаризировать IPv4 маршруты до /24 (true/false)
|
|
||||||
# AGGREGATE_TO_24="true"
|
|
||||||
|
|
@ -1,344 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Скрипт для domain-based routing под RHEL с BIRD BGP
|
|
||||||
# Направляет трафик определённых доменов через отдельный маршрут в BIRD
|
|
||||||
# С поддержкой суммаризации маршрутов до /24
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# КОНФИГУРАЦИЯ
|
|
||||||
# ============================================
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
CONFIG_FILE="$SCRIPT_DIR/domain-routing-bird.env"
|
|
||||||
|
|
||||||
# Загрузка конфигурации
|
|
||||||
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
||||||
echo "❌ Ошибка: не найден конфигурационный файл $CONFIG_FILE"
|
|
||||||
echo "Создайте файл на основе domain-routing-bird.env.example"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# shellcheck source=domain-routing-bird.env
|
|
||||||
source "$CONFIG_FILE"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ВАЛИДАЦИЯ ПЕРЕМЕННЫХ
|
|
||||||
# ============================================
|
|
||||||
required_vars=(
|
|
||||||
"DOMAINS_FILE"
|
|
||||||
"BIRD_CONF_DIR"
|
|
||||||
"BIRD_CONF_FILE"
|
|
||||||
"ROUTE_GATEWAY"
|
|
||||||
"ROUTE_INTERFACE"
|
|
||||||
)
|
|
||||||
|
|
||||||
for var in "${required_vars[@]}"; do
|
|
||||||
[[ -z "${!var:-}" ]] && { echo "❌ Переменная $var не установлена в $CONFIG_FILE"; exit 1; }
|
|
||||||
done
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ФУНКЦИИ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
log_info() {
|
|
||||||
echo "ℹ️ $1"
|
|
||||||
logger -t "domain-routing-bird" "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo "❌ $1"
|
|
||||||
logger -t "domain-routing-bird" "ERROR: $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
check_dependencies() {
|
|
||||||
log_info "Проверка зависимостей..."
|
|
||||||
|
|
||||||
local missing=()
|
|
||||||
|
|
||||||
for cmd in birdc dig; do
|
|
||||||
if ! command -v "$cmd" &> /dev/null; then
|
|
||||||
missing+=("$cmd")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
||||||
log_error "Отсутствуют команды: ${missing[*]}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "Все зависимости установлены"
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve_domains_to_ips() {
|
|
||||||
log_info "Разрешение доменов в IP-адреса..."
|
|
||||||
|
|
||||||
local temp_file=$(mktemp)
|
|
||||||
local ipv4_file=$(mktemp)
|
|
||||||
local ipv6_file=$(mktemp)
|
|
||||||
|
|
||||||
while IFS= read -r domain || [[ -n "$domain" ]]; do
|
|
||||||
# Пропускаем комментарии и пустые строки
|
|
||||||
[[ -z "$domain" ]] && continue
|
|
||||||
[[ "$domain" =~ ^[[:space:]]*# ]] && continue
|
|
||||||
|
|
||||||
# Очищаем домен от лишних символов
|
|
||||||
domain=$(echo "$domain" | tr -d '[:space:]')
|
|
||||||
|
|
||||||
# Разрешаем домен в IPv4
|
|
||||||
if [[ "${ENABLE_IPV4:-true}" == "true" ]]; then
|
|
||||||
local ipv4
|
|
||||||
ipv4=$(dig +short "$domain" A 2>/dev/null || true)
|
|
||||||
if [[ -n "$ipv4" ]]; then
|
|
||||||
echo "$ipv4" >> "$ipv4_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Разрешаем домен в IPv6
|
|
||||||
if [[ "${ENABLE_IPV6:-false}" == "true" ]]; then
|
|
||||||
local ipv6
|
|
||||||
ipv6=$(dig +short "$domain" AAAA 2>/dev/null || true)
|
|
||||||
if [[ -n "$ipv6" ]]; then
|
|
||||||
echo "$ipv6" >> "$ipv6_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done < "$DOMAINS_FILE"
|
|
||||||
|
|
||||||
# Объединяем результаты
|
|
||||||
if [[ "${ENABLE_IPV4:-true}" == "true" ]] && [[ -s "$ipv4_file" ]]; then
|
|
||||||
cat "$ipv4_file" >> "$temp_file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${ENABLE_IPV6:-false}" == "true" ]] && [[ -s "$ipv6_file" ]]; then
|
|
||||||
cat "$ipv6_file" >> "$temp_file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Удаляем дубликаты
|
|
||||||
local unique_file=$(mktemp)
|
|
||||||
sort -u "$temp_file" > "$unique_file"
|
|
||||||
|
|
||||||
local count=$(wc -l < "$unique_file")
|
|
||||||
log_info "Разрешено $count уникальных IP-адресов"
|
|
||||||
|
|
||||||
rm -f "$temp_file" "$ipv4_file" "$ipv6_file"
|
|
||||||
|
|
||||||
echo "$unique_file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Функция для суммаризации IPv4 маршрутов по маске (до /24)
|
|
||||||
aggregate_routes_ipv4() {
|
|
||||||
local ip_file="$1"
|
|
||||||
local output_file="$2"
|
|
||||||
|
|
||||||
log_info "Суммаризация IPv4 маршрутов до /24..."
|
|
||||||
|
|
||||||
# Создаём временный файл для сетей
|
|
||||||
local network_file=$(mktemp)
|
|
||||||
|
|
||||||
# Преобразуем IP в сети /24
|
|
||||||
while read -r ip; do
|
|
||||||
if [[ -n "$ip" ]] && [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
# Получаем сеть /24 для IP
|
|
||||||
local network=$(echo "$ip" | cut -d. -f1-3)
|
|
||||||
echo "${network}.0/24"
|
|
||||||
fi
|
|
||||||
done < "$ip_file" | sort -u > "$network_file"
|
|
||||||
|
|
||||||
local total_networks=$(wc -l < "$network_file")
|
|
||||||
log_info "Создано $total_networks сетей /24"
|
|
||||||
|
|
||||||
# Копируем в выходной файл
|
|
||||||
cp "$network_file" "$output_file"
|
|
||||||
local aggregated_count=$(wc -l < "$output_file")
|
|
||||||
log_info "После суммаризации: $aggregated_count сетей"
|
|
||||||
|
|
||||||
rm -f "$network_file"
|
|
||||||
}
|
|
||||||
|
|
||||||
generate_bird_config() {
|
|
||||||
local ip_file="$1"
|
|
||||||
local output_file="$BIRD_CONF_DIR/$BIRD_CONF_FILE"
|
|
||||||
|
|
||||||
log_info "Генерация конфига BIRD: $output_file"
|
|
||||||
|
|
||||||
mkdir -p "$BIRD_CONF_DIR"
|
|
||||||
|
|
||||||
# Создаём заголовок
|
|
||||||
echo "# Auto-generated domain routing config" > "$output_file"
|
|
||||||
echo "# Generated: $(date)" >> "$output_file"
|
|
||||||
echo "# Source: $DOMAINS_FILE" >> "$output_file"
|
|
||||||
echo "" >> "$output_file"
|
|
||||||
|
|
||||||
# Если включена суммаризация IPv4, используем агрегированные сети
|
|
||||||
if [[ "${ENABLE_IPV4:-true}" == "true" ]] && [[ "${AGGREGATE_TO_24:-true}" == "true" ]]; then
|
|
||||||
local aggregated_file=$(mktemp)
|
|
||||||
aggregate_routes_ipv4 "$ip_file" "$aggregated_file"
|
|
||||||
|
|
||||||
# Генерируем route statements для суммаризированных IPv4 сетей
|
|
||||||
while read -r network; do
|
|
||||||
if [[ -n "$network" ]]; then
|
|
||||||
echo "route $network via $ROUTE_GATEWAY on $ROUTE_INTERFACE;" >> "$output_file"
|
|
||||||
fi
|
|
||||||
done < "$aggregated_file"
|
|
||||||
|
|
||||||
rm -f "$aggregated_file"
|
|
||||||
else
|
|
||||||
# Без суммаризации - добавляем отдельные IP
|
|
||||||
while read -r ip; do
|
|
||||||
if [[ -n "$ip" ]]; then
|
|
||||||
# Определяем тип IP (IPv4 или IPv6)
|
|
||||||
if [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
if [[ "${ENABLE_IPV4:-true}" == "true" ]]; then
|
|
||||||
if [[ "${AGGREGATE_TO_24:-true}" == "true" ]]; then
|
|
||||||
# Конвертируем в /24 сеть
|
|
||||||
local network=$(echo "$ip" | cut -d. -f1-3)
|
|
||||||
echo "route ${network}.0/24 via $ROUTE_GATEWAY on $ROUTE_INTERFACE;" >> "$output_file"
|
|
||||||
else
|
|
||||||
echo "route $ip via $ROUTE_GATEWAY on $ROUTE_INTERFACE;" >> "$output_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
elif [[ "$ip" =~ : ]]; then
|
|
||||||
if [[ "${ENABLE_IPV6:-false}" == "true" ]]; then
|
|
||||||
echo "route $ip via $ROUTE_GATEWAY on $ROUTE_INTERFACE;" >> "$output_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done < "$ip_file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "Конфиг BIRD сгенерирован: $output_file"
|
|
||||||
}
|
|
||||||
|
|
||||||
reload_bird() {
|
|
||||||
log_info "Перезагрузка BIRD..."
|
|
||||||
|
|
||||||
if /usr/sbin/birdc configure; then
|
|
||||||
logger "BIRD domain routing reconfigured"
|
|
||||||
log_info "BIRD успешно перезагружен"
|
|
||||||
else
|
|
||||||
log_error "Ошибка при перезагрузке BIRD"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
save_config_hash() {
|
|
||||||
local output_file="$BIRD_CONF_DIR/$BIRD_CONF_FILE"
|
|
||||||
local hash_file="$BIRD_CONF_DIR/.${BIRD_CONF_FILE}.md5"
|
|
||||||
|
|
||||||
if [[ -f "$output_file" ]]; then
|
|
||||||
md5sum "$output_file" | cut -c1-32 > "$hash_file"
|
|
||||||
log_info "MD5 хеш сохранён: $hash_file"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_config_on_boot() {
|
|
||||||
log_info "Настройка автовосстановления конфига BIRD..."
|
|
||||||
|
|
||||||
# Создаём systemd service для перезагрузки BIRD
|
|
||||||
local service_file="/etc/systemd/system/bird-domain-routing.service"
|
|
||||||
|
|
||||||
cat > "$service_file" << EOF
|
|
||||||
[Unit]
|
|
||||||
Description=BIRD Domain Routing Configuration
|
|
||||||
After=network.target
|
|
||||||
Wants=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
ExecStart=/usr/sbin/birdc configure
|
|
||||||
RemainAfterExit=yes
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl enable bird-domain-routing.service
|
|
||||||
log_info "Systemd сервис создан и включён: bird-domain-routing.service"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ОСНОВНАЯ ЛОГИКА
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
main() {
|
|
||||||
echo "=============================================="
|
|
||||||
echo "Domain-based Routing for BIRD BGP"
|
|
||||||
echo "=============================================="
|
|
||||||
|
|
||||||
# Проверка прав суперпользователя
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
log_error "Скрипт должен быть запущен от имени root"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Опции командной строки
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
--domains-file)
|
|
||||||
DOMAINS_FILE="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--bird-conf-dir)
|
|
||||||
BIRD_CONF_DIR="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--bird-conf-file)
|
|
||||||
BIRD_CONF_FILE="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--gateway)
|
|
||||||
ROUTE_GATEWAY="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--interface)
|
|
||||||
ROUTE_INTERFACE="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--help)
|
|
||||||
echo "Usage: $0 [OPTIONS]"
|
|
||||||
echo ""
|
|
||||||
echo "Options:"
|
|
||||||
echo " --domains-file FILE Файл со списком доменов"
|
|
||||||
echo " --bird-conf-dir DIR Директория конфигов BIRD"
|
|
||||||
echo " --bird-conf-file FILE Имя файла конфига"
|
|
||||||
echo " --gateway GATEWAY Шлюз для маршрутов"
|
|
||||||
echo " --interface INTERFACE Интерфейс для маршрутов"
|
|
||||||
echo " --help Показать эту справку"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log_error "Неизвестный параметр: $1"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "Конфигурация:"
|
|
||||||
echo " Domains file: $DOMAINS_FILE"
|
|
||||||
echo " BIRD conf dir: $BIRD_CONF_DIR"
|
|
||||||
echo " BIRD conf file: $BIRD_CONF_FILE"
|
|
||||||
echo " Route gateway: $ROUTE_GATEWAY"
|
|
||||||
echo " Route interface: $ROUTE_INTERFACE"
|
|
||||||
echo " IPv4 enabled: ${ENABLE_IPV4:-true}"
|
|
||||||
echo " IPv6 enabled: ${ENABLE_IPV6:-false}"
|
|
||||||
echo " Aggregate to /24: ${AGGREGATE_TO_24:-true}"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Шаги выполнения
|
|
||||||
check_dependencies
|
|
||||||
local ip_file
|
|
||||||
ip_file=$(resolve_domains_to_ips)
|
|
||||||
generate_bird_config "$ip_file"
|
|
||||||
reload_bird
|
|
||||||
save_config_hash
|
|
||||||
restore_config_on_boot
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "=========================================="
|
|
||||||
log_info "Domain-based routing для BIRD настроен!"
|
|
||||||
log_info "=========================================="
|
|
||||||
}
|
|
||||||
|
|
||||||
# Запуск основной функции
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Конфигурационный файл для domain-based routing
|
|
||||||
# Скопируйте этот файл в domain-routing.env и настройте под ваши нужды
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ПУТИ И ФАЙЛЫ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Файл со списком доменов для маршрутизации (один домен на строку)
|
|
||||||
# Domains_FILE="/opt/domain-routing/domains.txt"
|
|
||||||
|
|
||||||
# Директория для конфигов dnsmasq
|
|
||||||
# DNSMASQ_CONF_DIR="/etc/dnsmasq.d"
|
|
||||||
|
|
||||||
# Файл резолва (для DNS)
|
|
||||||
# RESOLV_CONF="/etc/resolv.conf"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# IPSET И FIREWALL
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Имя ipset (до<D0B4><D0BE>жно быть уникальным)
|
|
||||||
# IPSET_NAME="domain_routing"
|
|
||||||
|
|
||||||
# Имя зоны firewalld
|
|
||||||
# FIREWALL_ZONE="domain_routing"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
# Дополнительные параметры ipset (hashsize, timeout и т.д.)
|
|
||||||
# IPSET_OPTIONS="hashsize 4096"
|
|
||||||
|
|
||||||
# Время жизни записей в ipset (в секундах, 0 = бесконечно)
|
|
||||||
# IPSET_TIMEOUT=0
|
|
||||||
|
|
@ -1,303 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Скрипт для domain-based routing под RHEL с firewalld, ipset, dnsmasq
|
|
||||||
# Направляет трафик определённых доменов через отдельный интерфейс/IP-набор
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# КОНФИГУРАЦИЯ
|
|
||||||
# ============================================
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
CONFIG_FILE="$SCRIPT_DIR/domain-routing.env"
|
|
||||||
|
|
||||||
# Загрузка конфигурации
|
|
||||||
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
||||||
echo "❌ Ошибка: не найден конфигурационный файл $CONFIG_FILE"
|
|
||||||
echo "Создайте файл на основе domain-routing.env.example"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# shellcheck source=domain-routing.env
|
|
||||||
source "$CONFIG_FILE"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ВАЛИДАЦИЯ ПЕРЕМЕННЫХ
|
|
||||||
# ============================================
|
|
||||||
required_vars=(
|
|
||||||
"DOMAINS_FILE"
|
|
||||||
"IPSET_NAME"
|
|
||||||
"FIREWALL_ZONE"
|
|
||||||
"DNSMASQ_CONF_DIR"
|
|
||||||
"RESOLV_CONF"
|
|
||||||
)
|
|
||||||
|
|
||||||
for var in "${required_vars[@]}"; do
|
|
||||||
[[ -z "${!var:-}" ]] && { echo "❌ Переменная $var не установлена в $CONFIG_FILE"; exit 1; }
|
|
||||||
done
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ФУНКЦИИ
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
log_info() {
|
|
||||||
echo "ℹ️ $1"
|
|
||||||
logger -t "domain-routing" "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo "❌ $1"
|
|
||||||
logger -t "domain-routing" "ERROR: $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
check_dependencies() {
|
|
||||||
log_info "Проверка зависимостей..."
|
|
||||||
|
|
||||||
local missing=()
|
|
||||||
|
|
||||||
for cmd in firewall-cmd ipset dnsmasq; do
|
|
||||||
if ! command -v "$cmd" &> /dev/null; then
|
|
||||||
missing+=("$cmd")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
||||||
log_error "Отсутствуют команды: ${missing[*]}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "Все зависимости установлены"
|
|
||||||
}
|
|
||||||
|
|
||||||
create_ipset() {
|
|
||||||
log_info "Создание ipset '$IPSET_NAME'..."
|
|
||||||
|
|
||||||
# Удаляем старый ipset если есть
|
|
||||||
if ipset list "$IPSET_NAME" &> /dev/null; then
|
|
||||||
ipset destroy "$IPSET_NAME"
|
|
||||||
log_info "Удалён старый ipset '$IPSET_NAME'"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Создаём новый ipset (hash:net для IP-сетей)
|
|
||||||
ipset create "$IPSET_NAME" hash:net hashsize 4096 family inet
|
|
||||||
log_info "Создан ipset '$IPSET_NAME'"
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve_domains_to_ips() {
|
|
||||||
log_info "Разрешение доменов в IP-адреса..."
|
|
||||||
|
|
||||||
local temp_file=$(mktemp)
|
|
||||||
local resolved_count=0
|
|
||||||
|
|
||||||
while IFS= read -r domain || [[ -n "$domain" ]]; do
|
|
||||||
# Пропускаем комментарии и пустые строки
|
|
||||||
[[ -z "$domain" ]] && continue
|
|
||||||
[[ "$domain" =~ ^[[:space:]]*# ]] && continue
|
|
||||||
|
|
||||||
# Очищаем домен от лишних символов
|
|
||||||
domain=$(echo "$domain" | tr -d '[:space:]')
|
|
||||||
|
|
||||||
# Разрешаем домен в IP
|
|
||||||
local ips
|
|
||||||
ips=$(dig +short "$domain" A 2>/dev/null || true)
|
|
||||||
|
|
||||||
if [[ -n "$ips" ]]; then
|
|
||||||
echo "$ips" | while read -r ip; do
|
|
||||||
if [[ -n "$ip" ]]; then
|
|
||||||
echo "$ip" >> "$temp_file"
|
|
||||||
((resolved_count++)) || true
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
log_error "Не удалось разрешить домен: $domain"
|
|
||||||
fi
|
|
||||||
done < "$DOMAINS_FILE"
|
|
||||||
|
|
||||||
# Добавляем IP в ipset
|
|
||||||
if [[ -s "$temp_file" ]]; then
|
|
||||||
while read -r ip; do
|
|
||||||
ipset add "$IPSET_NAME" "$ip"
|
|
||||||
done < "$temp_file"
|
|
||||||
|
|
||||||
log_info "Добавлено ${resolved_count} IP-адресов в ipset '$IPSET_NAME'"
|
|
||||||
else
|
|
||||||
log_error "Не удалось разрешить ни один домен"
|
|
||||||
rm -f "$temp_file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f "$temp_file"
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_firewall() {
|
|
||||||
log_info "Настройка firewalld..."
|
|
||||||
|
|
||||||
# Проверяем зону
|
|
||||||
if ! firewall-cmd --query-zone="$FIREWALL_ZONE" &> /dev/null; then
|
|
||||||
log_info "Создание новой зоны '$FIREWALL_ZONE'..."
|
|
||||||
firewall-cmd --new-zone="$FIREWALL_ZONE" --permanent
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Добавляем ipset в зону
|
|
||||||
firewall-cmd --zone="$FIREWALL_ZONE" --add-ipset="$IPSET_NAME" --permanent
|
|
||||||
|
|
||||||
# Перезагружаем firewalld
|
|
||||||
firewall-cmd --reload
|
|
||||||
|
|
||||||
log_info "Firewalld настроен для ipset '$IPSET_NAME' в зоне '$FIREWALL_ZONE'"
|
|
||||||
}
|
|
||||||
|
|
||||||
configure_dnsmasq() {
|
|
||||||
log_info "Настройка dnsmasq..."
|
|
||||||
|
|
||||||
# Создаём конфиг для dnsmasq
|
|
||||||
local dnsmasq_config="$DNSMASQ_CONF_DIR/domain-routing.conf"
|
|
||||||
|
|
||||||
mkdir -p "$DNSMASQ_CONF_DIR"
|
|
||||||
|
|
||||||
# Очищаем старый конфиг
|
|
||||||
echo "# Auto-generated domain routing config" > "$dnsmasq_config"
|
|
||||||
echo "# Generated: $(date)" >> "$dnsmasq_config"
|
|
||||||
|
|
||||||
# Добавляем правила для каждого домена
|
|
||||||
while IFS= read -r domain || [[ -n "$domain" ]]; do
|
|
||||||
[[ -z "$domain" ]] && continue
|
|
||||||
[[ "$domain" =~ ^[[:space:]]*# ]] && continue
|
|
||||||
|
|
||||||
domain=$(echo "$domain" | tr -d '[:space:]')
|
|
||||||
|
|
||||||
# Генерируем IP для каждого домена
|
|
||||||
local ips
|
|
||||||
ips=$(dig +short "$domain" A 2>/dev/null || true)
|
|
||||||
|
|
||||||
if [[ -n "$ips" ]]; then
|
|
||||||
echo "$ips" | while read -r ip; do
|
|
||||||
if [[ -n "$ip" ]]; then
|
|
||||||
echo "server=/$domain/$ip" >> "$dnsmasq_config"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done < "$DOMAINS_FILE"
|
|
||||||
|
|
||||||
log_info "Конфиг dnsmasq сгенерирован: $dnsmasq_config"
|
|
||||||
|
|
||||||
# Перезагружаем dnsmasq
|
|
||||||
if systemctl is-active --quiet dnsmasq; then
|
|
||||||
systemctl reload dnsmasq
|
|
||||||
log_info "Dnsmasq перезагружен"
|
|
||||||
else
|
|
||||||
log_info "Dnsmasq не запущен. Запустите: systemctl start dnsmasq"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
save_ipset() {
|
|
||||||
log_info "Сохранение ipset..."
|
|
||||||
|
|
||||||
local save_dir="/etc/ipset"
|
|
||||||
mkdir -p "$save_dir"
|
|
||||||
|
|
||||||
ipset save "$IPSET_NAME" -file "$save_dir/$IPSET_NAME.ipset"
|
|
||||||
log_info "Ipset сохранён в $save_dir/$IPSET_NAME.ipset"
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_ipset_on_boot() {
|
|
||||||
log_info "Настройка автовосстановления ipset..."
|
|
||||||
|
|
||||||
# Создаём systemd service для восстановления ipset
|
|
||||||
local service_file="/etc/systemd/system/ipset-restore@$IPSET_NAME.service"
|
|
||||||
|
|
||||||
cat > "$service_file" << EOF
|
|
||||||
[Unit]
|
|
||||||
Description=Restore ipset $IPSET_NAME on boot
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
ExecStart=/sbin/ipset restore < /etc/ipset/$IPSET_NAME.ipset
|
|
||||||
RemainAfterExit=yes
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl enable "ipset-restore@$IPSET_NAME.service"
|
|
||||||
log_info "Systemd сервис создан и включён"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# ОСНОВНАЯ ЛОГИКА
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
main() {
|
|
||||||
echo "=============================================="
|
|
||||||
echo "Domain-based Routing Setup Script"
|
|
||||||
echo "=============================================="
|
|
||||||
|
|
||||||
# Проверка прав суперпользователя
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
|
||||||
log_error "Скрипт должен быть запущен от имени root"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Опции командной строки
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
--domains-file)
|
|
||||||
DOMAINS_FILE="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--ipset-name)
|
|
||||||
IPSET_NAME="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--firewall-zone)
|
|
||||||
FIREWALL_ZONE="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--dnsmasq-conf)
|
|
||||||
DNSMASQ_CONF_DIR="$2"
|
|
||||||
shift 2
|
|
||||||
;;
|
|
||||||
--help)
|
|
||||||
echo "Usage: $0 [OPTIONS]"
|
|
||||||
echo ""
|
|
||||||
echo "Options:"
|
|
||||||
echo " --domains-file FILE Файл со списком доменов"
|
|
||||||
echo " --ipset-name NAME Имя ipset (по умолчанию из config)"
|
|
||||||
echo " --firewall-zone ZONE Зона firewalld (по умолчанию из config)"
|
|
||||||
echo " --dnsmasq-conf DIR Директория конфигов dnsmasq"
|
|
||||||
echo " --help Показать эту справку"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
log_error "Неизвестный параметр: $1"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "Конфигурация:"
|
|
||||||
echo " Domains file: $DOMAINS_FILE"
|
|
||||||
echo " IPset name: $IPSET_NAME"
|
|
||||||
echo " Firewall zone: $FIREWALL_ZONE"
|
|
||||||
echo " Dnsmasq conf: $DNSMASQ_CONF_DIR"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Шаги выполнения
|
|
||||||
check_dependencies
|
|
||||||
create_ipset
|
|
||||||
resolve_domains_to_ips
|
|
||||||
configure_firewall
|
|
||||||
configure_dnsmasq
|
|
||||||
save_ipset
|
|
||||||
restore_ipset_on_boot
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
log_info "=========================================="
|
|
||||||
log_info "Domain-based routing успешно настроен!"
|
|
||||||
log_info "=========================================="
|
|
||||||
}
|
|
||||||
|
|
||||||
# Запуск основной функции
|
|
||||||
main "$@"
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# Список доменов для domain-based routing с BIRD BGP
|
|
||||||
# Один домен на строку
|
|
||||||
# Строки, начинающиеся с # - комментарии
|
|
||||||
|
|
||||||
# Примеры доменов
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
amazon.com
|
|
||||||
cloudflare.com
|
|
||||||
github.com
|
|
||||||
# Добавьте свои домены здесь
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# Список доменов для domain-based routing
|
|
||||||
# Один домен на строку
|
|
||||||
# Строки, начинающиеся с # - комментарии
|
|
||||||
|
|
||||||
# Примеры доменов
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
amazon.com
|
|
||||||
cloudflare.com
|
|
||||||
github.com
|
|
||||||
# Пример списка доменов для конкретной цели
|
|
||||||
|
|
@ -41,6 +41,8 @@ download_list "$GOOGLE_URL" "Google.lst"
|
||||||
download_list "$MICROSOFT_URL" "Microsoft.lst"
|
download_list "$MICROSOFT_URL" "Microsoft.lst"
|
||||||
download_list "$TELEGRAM_URL" "Telegram.lst"
|
download_list "$TELEGRAM_URL" "Telegram.lst"
|
||||||
download_list "$FACEBOOK_URL" "Facebook.lst"
|
download_list "$FACEBOOK_URL" "Facebook.lst"
|
||||||
|
download_list "$YOUTUBE_URL" "Youtube.lst"
|
||||||
|
download_list "$CLOUDFLARE_URL" "Cloudflare.lst"
|
||||||
|
|
||||||
# Считаем md5 от всех .lst-файлов
|
# Считаем md5 от всех .lst-файлов
|
||||||
old=$(cat "$MD5_FILE" 2>/dev/null || true)
|
old=$(cat "$MD5_FILE" 2>/dev/null || true)
|
||||||
|
|
@ -70,7 +72,9 @@ if [[ "$old" != "$new" ]]; then
|
||||||
gen_bird_route "$LIST_DIR/Microsoft.lst" "$BIRD_DIR/$MICROSOFT_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/Telegram.lst" "$BIRD_DIR/$TELEGRAM_OUT" "false"
|
||||||
gen_bird_route "$LIST_DIR/Facebook.lst" "$BIRD_DIR/$FACEBOOK_OUT" "false"
|
gen_bird_route "$LIST_DIR/Facebook.lst" "$BIRD_DIR/$FACEBOOK_OUT" "false"
|
||||||
|
gen_bird_route "$LIST_DIR/Youtube.lst" "$BIRD_DIR/$YOUTUBE_OUT" "false"
|
||||||
|
gen_bird_route "$LIST_DIR/Cloudflare.lst" "$BIRD_DIR/$CLOUDFLARE_OUT" "false"
|
||||||
|
|
||||||
# Перезагружаем BIRD
|
# Перезагружаем BIRD
|
||||||
if /usr/sbin/birdc configure; then
|
if /usr/sbin/birdc configure; then
|
||||||
logger "BGP list reconfigured"
|
logger "BGP list reconfigured"
|
||||||
|
|
@ -88,3 +92,4 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "🎉 Готово."
|
echo "🎉 Готово."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Пример использования скрипта domain-routing.sh
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Создаём конфигурационный файл
|
|
||||||
cat > domain-routing.env << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Пути и файлы
|
|
||||||
DOMAINS_FILE="/opt/domain-routing/domains.txt"
|
|
||||||
DNSMASQ_CONF_DIR="/etc/dnsmasq.d"
|
|
||||||
RESOLV_CONF="/etc/resolv.conf"
|
|
||||||
|
|
||||||
# IPset и firewall
|
|
||||||
IPSET_NAME="domain_routing"
|
|
||||||
FIREWALL_ZONE="domain_routing"
|
|
||||||
|
|
||||||
# Дополнительные настройки
|
|
||||||
IPSET_OPTIONS="hashsize 4096"
|
|
||||||
IPSET_TIMEOUT=0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Создаём файл со списком доменов
|
|
||||||
cat > domains.txt << 'EOF'
|
|
||||||
# Список доменов для маршрутизации
|
|
||||||
google.com
|
|
||||||
www.google.com
|
|
||||||
amazon.com
|
|
||||||
cloudflare.com
|
|
||||||
github.com
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "✅ Примеры конфигурационных файлов созданы"
|
|
||||||
echo ""
|
|
||||||
echo "Далее:"
|
|
||||||
echo "1. Отредактируйте domain-routing.env под ваши нужды"
|
|
||||||
echo "2. Отредактируйте domains.txt со списком доменов"
|
|
||||||
echo "3. Запустите скрипт: sudo ./domain-routing.sh"
|
|
||||||
Loading…
Reference in a new issue