Skip to content

Keenetic PBR (Policy Based Routing) toolkit / Инструменты для выборочной маршрутизации на роутерах Keenetic

License

Notifications You must be signed in to change notification settings

maksimkurb/keenetic-pbr

Repository files navigation

keenetic-pbr

workflow status release

keenetic-pbr не является официальным продуктом компании Keenetic и никак с ней не связан. Этот пакет создан сторонним разработчиком и предоставляется "как есть" без какой-либо гарантии, автор не несёт ответственности за повреждение Вашего устройства, все действия Вы выполняете на свой страх и риск.

Вопросы и предложения касательно пакета можно направлять в GitHub Issue и в Telegram-чат: https://t.me/keenetic_pbr.

⚠️Для владельцев роутеров Keenetic без USB-разъёма:

Всё это поможет предотвратить излишний износ NAND-памяти роутера.


keenetic-pbr — это пакет для маршрутизации на основе правил для роутеров Keenetic.

Telegram-чат проекта: https://t.me/keenetic_pbr

С помощью этого пакета можно настроить выборочную маршрутизацию для указанных IP-адресов, подсетей и доменов. Это необходимо, если вам понадобилось организовать защищенный доступ к определенным ресурсам, либо выборочно разделить трафик на несколько провайдеров (напр. трафик до сайта А идёт через одного оператора, а остальной трафик - через другого)

Пакет использует ipset для того, чтобы хранить большое количество адресов в памяти роутера без существенного увеличения нагрузки, а также dnsmasq для того, чтобы пополнять данный ipset IP-адресами, которые резолвят клиенты локальной сети.

Для настройки маршрутизации пакет создает скрипты в директории /opt/etc/ndm/netfilter.d и /opt/etc/ndm/ifstatechanged.d.

Особенности

  • Маршрутизация на основе доменов через dnsmasq
  • Маршрутизация на основе IP-адресов через ipset
  • Настраиваемые таблицы маршрутизации и приоритеты
  • Автоматическая настройка для списков dnsmasq

Принцип работы

Данный пакет содержит следующие скрипты и утилиты:

/opt
├── /usr
│   └── /bin
│       └── keenetic-pbr                    # Утилита для скачивания и обработки списков, их импорта в ipset, а также генерации файлов конфигурации для dnsmasq
└── /etc
    ├── /keenetic-pbr
    │   ├── /keenetic-pbr.conf              # Файл конфигурации keenetic-pbr
    │   └── /lists.d                        # В эту папку keenetic-pbr будет помещать скачанные и локальные списки. Не кладите сюда ничего сами, т.к. файлы из этой папки удаляются после каждого запуска команды "keenetic-pbr download".
    ├── /ndm
    │   ├── /netfilter.d
    │   │   └── 50-keenetic-pbr-fwmarks.sh  # Скрипт добавляет iptables правило для маркировки пакетов в ipset с определённым fwmark
    │   └── /ifstatechanged.d
    │       └── 50-keenetic-pbr-routing.sh  # Скрипт добавляет ip rule для направления пакетов с fwmark в нужную таблицу маршрутизации и создаёт её с нужным default gateway
    ├── /cron.daily
    │   └── 50-keenetic-pbr-lists-update.sh # Скрипт для автоматического ежедневного обновления списков
    └── /dnsmasq.d
        └── (config files)                  # Папка с сгенерированными конфигурациями для dnsmasq, заставляющими его класть IP-адреса доменов из списков в нужный ipset

Маршрутизация пакетов на основе IP-адресов и подсетей

keenetic-pbr автоматически загружает ip-адреса и подсети из списков в нужные ipset. Далее пакеты на IP-адреса, которые попадают в этот ipset, маркируются определённым fwmark и на основе правил маршрутизации переадресовываются на конкретный интерфейс.

Схема процесса: IP routing scheme

Маршрутизация пакетов на основе доменов

Для маршрутизации на основе доменов используется dnsmasq. Каждый раз, когда клиенты локальной сети делают DNS-запрос, dnsmasq проверяет, есть ли домен в списках, и если есть, то добавляет его ip-адреса в ipset.

Note

Чтобы маршрутизация доменов работала, клиентские устройства не должны использовать собственные DNS-сервера. Их DNS-сервером должен быть IP роутера, иначе dnsmasq не увидит эти пакеты и не добавит ip-адреса в нужный ipset.

Important

Некоторые приложения и игрушки используют собственные способы получения ip-адресов для своих серверов. Для таких приложений маршрутизация по доменам не будет работать, т.к. эти приложения не делают DNS-запросов. Вам придётся узнавать IP-адреса/подсети серверов этих приложений и добавлять их в списки самостоятельно.

Схема процесса: Domain routing scheme

Предварительная подготовка роутера

  1. Работоспособность пакета проверялась на Keenetic OS версии 4.2.1. Работоспособность на версии 3.x.x возможна, но не гарантируется.
  2. Необходимо установить дополнительные компоненты на ваш роутер в разделе Управление -> Параметры системы:
    • Сетевые функции / Протокол IPv6
      • Этот компонент необходим для возможности установки компонента "Модули ядра подсистемы Netfilter".
    • Пакеты OPKG / Поддержка открытых пакетов
    • Пакеты OPKG / Модули ядра подсистемы Netfilter
    • Пакеты OPKG / Пакет расширения Xtables-addons для Netfilter
      • На данный момент этот пакет не обязателен, поскольку его возможности не используются keenetic-pbr, но его возможности могут пригодиться в будущем. Инструкция к модулю доступна по ссылке.
  3. Вам необходимо установить среду Entware на Keenetic (инструкция), для этого понадобится USB-накопитель, который будет постоянно вставлен в роутер
  4. Также необходимо настроить второе (третье, четвёртое, ...) соединение, через которое вы хотите направить трафик попадающий под списки. Это может быть VPN-соединение или второй провайдер (multi-WAN).
  5. Ваши устройства должны быть в Политике доступа в интернет по умолчанию (раздел Приоритеты подключений -> Применение политик). В противном случае устройство может игнорировать все правила, применённые keenetic-pbr.

Установка и обновление

Автоматическая установка/обновление

Подключитесь к вашему OPKG по SSH и выполните следующую команду:

opkg install curl jq && curl -sOfL https://raw.githubusercontent.com/maksimkurb/keenetic-pbr/refs/heads/main/install.sh && sh install.sh

Caution

Если Entware установлен на внутреннюю память роутера, обязательно отключите автообновление списков, чтобы предотвратить износ памяти!

Ручная установка/обновление

  1. Перейдите на страницу релизов и скопируйте URL .ipk файла для вашей архитектуры для последней версии.

  2. Скачайте .ipk файл на ваш маршрутизатор:

    curl -LO <URL-to-latest-ipk-file-for-your-architecture>
  3. Установите его с помощью OPKG:

    opkg install keenetic-pbr-*-entware.ipk

Во время установки пакет keenetic-pbr заменяет оригинальный файл конфигурации dnsmasq. Резервная копия будет сохранена в /opt/etc/dnsmasq.conf.orig.

Caution

Если Entware установлен на внутреннюю память роутера, обязательно отключите автообновление списков, чтобы предотвратить износ памяти!

Настройка

Отредактируйте следующие файлы конфигурации в соответствии с вашими потребностями:

  • (обязательно) Конфигурация keenetic-pbr: /opt/etc/keenetic-pbr/keenetic-pbr.conf
    • В данном файле вы должны настроить необходимые ipset, списки и выходные интерфейсы
  • (опционально) Отключение автообновления списков: /opt/etc/cron.daily/50-keenetic-pbr-lists-update.sh
  • (опционально) Конфигурация dnsmasq: /opt/etc/dnsmasq.conf
    • Данный файл можно перенастроить под свои нужды, например заменить upstream DNS сервер на свой
    • Рекомендуется поставить и настроить пакет dnscrypt-proxy2, а затем указать в dnsmasq.conf настройку server=127.0.0.1#9153, чтобы DNS-запросы были защищены DNS-over-HTTPS (DoH)

1. Редактирование keenetic-pbr.conf

Откройте /opt/etc/keenetic-pbr/keenetic-pbr.conf и отредактируйте его по мере необходимости:

  1. Необходимо поправить поле interface, указав туда интерфейс, через который будет идти исходящий трафик, попавший под критерии списков.
  2. Также необходимо добавить списки (локальный или удалённый по URL)

Пример конфигурации: (вам не нужно копировать этот пример себе, можно просто редактировать файл, который входит в комплект поставки с пакетом)

#---------------------#
#   Общие настройки   #
#---------------------#
[general]
lists_output_dir = "/opt/etc/keenetic-pbr/lists.d"   # В эту папку будут скачиваться списки
dnsmasq_lists_dir = "/opt/etc/dnsmasq.d"             # Загруженные списки будут сохранены в этом каталоге для dnsmasq
use_keenetic_api = true                              # Если true, keenetic-pbr будет делать запросы к Keenetic API (RCI), чтобы проверить, что интерфейс активен

#-------------#
#   IPSET 1   #
#-------------#
[[ipset]]
ipset_name = "vpn"              # Название ipset
ip_version = 4                  # IPv4 или IPv6
flush_before_applying = true    # Очищать ipset каждый раз перед его заполнением

   [ipset.routing]
   interfaces = ["nwg1", "nwg2"]   # Куда будет направляться трафик для IP, попавших в этот ipset
                                   # keenetic-pbr будет выбирать ПЕРВЫЙ включённый интерфейс из этого списка.
                                   # Если включена опция use_keenetic_api, то также будет проверяться наличие соединения на этом интерфейсе.  

   kill_switch = false             # Если kill-switch включен, но при этом не доступен ни один интерфейс из списка выше, то трафик на адреса из списка будет блокироваться (чтобы избежать утечки трафика)
   fwmark = 1001                   # Этот fwmark будет применяться к пакетам, попавшим под критерии списков
   table = 1001                    # Номер таблицы маршрутизации (ip route table), туда будет добавляться default gateway на интерфейс, указанный выше
   priority = 1001                 # Приоритет правила маршрутизации (ip rule priority), чем число меньше, тем выше приоритет

   # Настройки для продвинутых: можно указывать собственные правила iptables, которые будут применяться для ipset.
   #   Доступные переменные:
   #   {{ipset_name}} - название ipset
   #   {{fwmark}} - fwmark
   #   {{table}} - номер таблицы маршрутизации
   #   {{priority}} - приоритет правила маршрутизации
   #
   #[[ipset.iptables_rule]]
   #chain = "PREROUTING"
   #table = "mangle"
   #rule = ["-m", "set", "--match-set", "{{ipset_name}}", "dst,src", "-j", "MARK", "--set-mark", "{{fwmark}}"]

   # Список 1 (ручное перечисление адресов)
   [[ipset.list]]
   name = "local"
   hosts = [
       "ifconfig.co",
       "myip2.ru",
       "1.2.3.4",
       "141.201.11.0/24",
   ]

    # Список 2 (из локального файла)
    [[ipset.list]]
    name = "local-file"
    file = "/opt/etc/keenetic-pbr/my-list.lst"

   # Список 3 (скачивание через URL)
   [[ipset.list]]
   name = "remote-list-1"
   url = "https://some-url/list1.lst"  # Файл должен содержать домены, IP адреса и CIDR, по одному на каждой строчке

    # Список 4 (скачивание через URL)
   [[ipset.list]]
   name = "remote-list-2"
   url = "https://some-url/list2.lst"

# Вы можете добавлять столько ipset, сколько хотите:
# [[ipset]]
# ipset_name = "direct"
# ...

2. Скачивание и обработка списков

После редактирования конфигурационного файла введите данную команду, чтобы скачать файлы списков:

keenetic-pbr download

3. Отключение автообновления списков

Caution

Если Entware установлен на внутреннюю память роутера, обязательно отключите ежедневное автоматическое обновление списков, чтобы предотвратить износ памяти.

Эту команду нужно выполнять после каждого обновления пакета keenetic-pbr!

Для того, чтобы отключить автообновление списков, удалите файл /opt/etc/cron.daily/50-keenetic-pbr-lists-update.sh:

rm /opt/etc/cron.daily/50-keenetic-pbr-lists-update.sh

Вы всегда сможете обновить списки вручную.

4. Настройка DNS over HTTPS (DoH)

Tip

Обычный протокол DNS является не безопасным, поскольку все запросы передаются в открытом виде. Это значит, что провайдер или злоумышленники могут перехватить и подменить ваши DNS-запросы (DNS spoofing), направив вас на ненастоящий веб-сайт.

Чтобы обезопасить себя от этого, рекомендуется настроить пакет dnscrypt-proxy2, который будет использовать протокол DNS-over-HTTPS (DoH) для шифрования DNS-запросов. Подробнее о DoH можно прочитать здесь.

Для настройки DoH на роутере необходимо выполнить следующие действия:

  1. Скачиваем dnscrypt-proxy2

    opkg install dnscrypt-proxy2
  2. Редактируем файл /opt/etc/dnscrypt-proxy.toml

    # ... (здесь другие строчки конфига, их удалять не нужно)
    
    # Указываем upstream-серверы (необходимо убрать решётку перед server_names)
    server_names = ['adguard-dns-doh', 'cloudflare-security', 'google']
    
    # Указываем порт 9153 для прослушивания DNS-запросов
    listen_addresses = ['[::]:9153']
    
    # ... (здесь другие строчки конфига, их удалять не нужно)
  3. Редактируем файл /opt/etc/dnsmasq.conf

    # ... (здесь другие строчки конфига, их удалять не нужно)
    
    # Меняем сервер по умолчанию 8.8.8.8 на наш dnscrypt-proxy2
    server=127.0.0.1#9153
    
    # ... (здесь другие строчки конфига, их удалять не нужно)
  4. Перезапускаем dnscrypt-proxy2 и dnsmasq

    /opt/etc/init.d/S09dnscrypt-proxy2 restart
    /opt/etc/init.d/S56dnsmasq restart

5. Включение DNS Override

Для того, чтобы Keenetic использовал dnsmasq в качестве DNS-сервера, необходимо включить DNS Override.

Note

Данный этап не нужен, если ваши списки содержат только IP-адреса и CIDR и не указывают доменных имён.

  1. Откройте следующий URL в браузере:
    http://<router-ip-address>/a
    
  2. Введите следующие команды по очереди:
    • opkg dns-override
    • system configuration save
  3. Обязательно перезагрузите роутер.

Tip

Если вы решите отключить DNS-Override в будущем, выполните команды no opkg dns-override и system configuration save.

6. Проверка работы маршрутизации

Убедитесь, что маршрутизация на основе политики работает должным образом.

Для этого откройте адрес, которого нет в ваших списках (напр. https://2ip.ru) и адрес, который есть в ваших списках (напр. https://ifconfig.co) и сравните IP-адреса, они должны быть разными.

Обновление списков

  • Списки обновляются автоматически ежедневно с помощью cron.

В случае, если вы редактировали настройки keenetic-pbr.conf и хотите обновить списки вручную, выполните следующие команды по SSH:

keenetic-pbr download
/opt/etc/init.d/S80keenetic-pbr restart

Устранение неполадок

Если возникают проблемы, проверьте ваши конфигурационные файлы и логи. Убедитесь, что списки были загружены правильно, и dnsmasq работает с обновленной конфигурацией.

Перед проверкой работоспособности на клиентской машине необходимо очистить DNS-кеш. Сделать это выполнив команду в консоли (для Windows): ipconfig /flushdns.

Также выполните следующую команду, чтобы проверить, правильно ли работает Keenetic-PBR (вывод этой команды будет очень полезен, если вы хотите получить помощь в Telegram-чате):

keenetic-pbr self-check

Вы можете задать вопросы в Telegram-чате проекта: https://t.me/keenetic_pbr

Я всё поломал, интернет пропал вовсе

Можно временно отключить данную конфигурацию, выключив OPKG в настройках (выбрав раздел="не указан") и перезагрузив роутер.

Если желаете полностью удалить пакет, необходимо выполнить следующие шаги:

  1. По SSH выполниить: opkg remove keenetic-pbr dnsmasq dnscrypt-proxy2
  2. Отключить DNS-override (http:///a):
    • no opkg dns-override
    • system configuration save
  3. Выключить OPKG (если не пользуетесь им для других нужд)
  4. Перезагрузить роутер

Приятного использования маршрутизации на основе политики с Keenetic-PBR!

About

Keenetic PBR (Policy Based Routing) toolkit / Инструменты для выборочной маршрутизации на роутерах Keenetic

Topics

Resources

License

Stars

Watchers

Forks