get-ip-prefix/README_DOMAIN_ROUTING.md
2026-07-03 16:21:48 +03:00

186 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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