Gateway switch - небольшой сервис для быстрого переключения маршрутов средствами маршрутизатора под управлением RouterOS. Пользователь может самостоятельно зайти на страницу сервиса и выбрать нужный маршрут для его IP, например через VPN.
Есть 2 режима работы:
route-tables
- создание правил маршрутизации для IP пользователя (режим по умолчанию)ip-lists
- добавление IP пользователя в нужный список фаервола (address-list
)
Сборка и запуск приложения (для работы требуется минимум 11 версия java):
- Делаем копию репозитория в нужный каталог:
git clone https://github.com/Haw41k/gw-switch.git
- В каталоге скачанного проекта используем mvnw (Maven Wrapper):
mvnw spring-boot:run
для запуска сервиса без упаковки в JAR.mvnw package
для упаковки приложения в JAR. Последующий запускjava -jar [путь к jar файлу]
.- После сборки файлы будут находиться в каталоге
target
- Для работы потребуется конфигурационный файл, который нужно поместить в домашний каталог пользователя:
[домашний каталог пользователя]/gw-switch/config/application.yml
Пример конфигурационного файла:
gw-switch:
# режим работы сервиса: ip-lists или route-tables, по умолчанию route-tables
mode: route-tables
# раз в сутки (00:00) чистит правила или списки, по умолчанию false.
auto-clean: true
# активирует защищённое соединение с маршрутизатором, по умолчанию false
# требует от маршрутизатора использования валидного сертификата
tls-enabled: true
# сервис помечает комментарием созданные им записи, используется при автоочистке.
# по умолчанию значение "gw-switch"
comment: gw-switch
routers:
- ip: 192.168.50.10
user: api
password: api
gateways:
# id - имя таблицы машрутизации
# name - название в интерфейсе пользователя
- id: rtab-1
name: gw1
- id: rtab-2
name: gw2
Сервис по умолчанию запускается на 8080
порту, для изменения, в конфигурацию нужно добавить:
server:
port: [порт]
Для работы с reverse proxy требуется передача http заголовка: X-Forwarded-For
Для работы с API стоит создать отдельного пользователя и отдельную группу для него, с политиками: read, write, api
Для работы с API через TLS потребуется валидный сертификат, либо можно использовать самоподписанный сертификат, который нужно добавить в хранилище JDK (JRE).
Самый простой способ сделать самоподписанный сертификат на стороне RouterOS:
- Создаём CA:
/certificate/add name=local-ca common-name=mikrotik key-usage=key-cert-sign days-valid=3650
- Подписываем CA:
/certificate/sign local-ca
- Сертификат должен быть
Trusted
, если такой отметки нет то делаем:/certificate/set local-ca trusted=yes
- Создаём рабочий сертификат:
/certificate/add name=tls-cert common-name=mikrotik-tls subject-alt-name=IP:<IP маршрутизатора>
- Подписываем его при помощи CA:
/certificate/sign tls-cert ca=local-ca
- Сертификат должен быть
Trusted
, если такой отметки нет то делаем:/certificate/set tls-cert trusted=yes
Теперь настраиваем сервис защищённый API:
/ip/service/set api-ssl certificate=tls-cert disabled=no
После всех настроек нужно экспортировать сертификат CA:
/certificate/export-certificate local-ca
Подробнее о работе с сертификатами в RouterOS.
Скачиваем наш CA сертификат, после чего добавляем его в хранилище JDK, используя штатную утилиту keytool:
keytool -importcert -alias <имя под которым будет храниться сертификат> -cacerts -file <путь к файлу>
Для доступа к хранилищу используйте пароль по умолчанию changeit
.
После импорта можно использовать защищённое соединение.
У каждой версии JDK своё хранилище доверенных центров сертификации (вы можете рядом держать несколько версий). По этому будьте внимательны, сертификат должен быть установлен в той версии, при помощи которой вы запускаете приложение.
- Утилита KeyTool:
<путь до JDK>/bin/keytool
- Файл хранилища:
<путь до JDK>/lib/security/cacerts