186 lines
5.8 KiB
Markdown
186 lines
5.8 KiB
Markdown
# 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
|