From 1967d4e0dcd3aafa6b2c1c36ff8c979ea53fee9b Mon Sep 17 00:00:00 2001 From: Vladimir Avtsenov Date: Fri, 14 Feb 2025 17:16:20 +0300 Subject: [PATCH] new naming --- .github/workflows/build.yml | 4 +- CONTRIBUTORS.md | 6 +- Makefile | 6 +- README.md | 131 +++++++++++++++++- cmd/{kvas2d => magitrickled}/main.go | 18 +-- go.mod | 2 +- group/group.go | 6 +- kvas2.go => magitrickle.go | 18 +-- opt/etc/init.d/{S99kvas2 => S99magitrickle} | 2 +- .../{100-kvas2 => 100-magitrickle} | 2 +- .../config.yaml.example | 4 +- 11 files changed, 163 insertions(+), 36 deletions(-) rename cmd/{kvas2d => magitrickled}/main.go (90%) rename kvas2.go => magitrickle.go (98%) rename opt/etc/init.d/{S99kvas2 => S99magitrickle} (89%) mode change 100755 => 100644 rename opt/etc/ndm/netfilter.d/{100-kvas2 => 100-magitrickle} (75%) mode change 100755 => 100644 rename opt/var/lib/{kvas2 => magitrickle}/config.yaml.example (94%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 651f50f..c7630a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,7 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v3 with: - name: kvas2_${{ matrix.arch }}.ipk.zip - path: .build/kvas2_${{ matrix.arch }}.ipk + name: magitrickle_${{ matrix.arch }}.ipk.zip + path: .build/magitrickle_${{ matrix.arch }}.ipk if-no-files-found: error compression-level: 0 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 06b272f..c1f45a3 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,5 +1,5 @@ -# Contributors +# Коллабораторы -## Consultants +## Консультация -- **nesteroff561** - [GitHub](https://github.com/nesteroff561) - "Help with understanding `iptables`" \ No newline at end of file +- **nesteroff561** ([GitHub](https://github.com/nesteroff561)) - Помощь с `iptables` \ No newline at end of file diff --git a/Makefile b/Makefile index fa31d0d..25e999a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -APP_NAME = kvas2 +APP_NAME = magitrickle APP_DESCRIPTION = DNS-based routing application APP_MAINTAINER = Vladimir Avtsenov @@ -16,12 +16,12 @@ GOARM ?= BUILD_DIR = ./.build PKG_DIR = $(BUILD_DIR)/$(ARCH) BIN_DIR = $(PKG_DIR)/data/opt/bin -PARAMS = -v -a -trimpath -ldflags="-X 'kvas2/constant.Version=$(VERSION)' -X 'kvas2/constant.Commit=$(COMMIT)' -w -s" +PARAMS = -v -a -trimpath -ldflags="-X 'magitrickle/constant.Version=$(VERSION)' -X 'magitrickle/constant.Commit=$(COMMIT)' -w -s" all: build_daemon package build_daemon: - GOOS=$(GOOS) GOARCH=$(GOARCH) GOMIPS=$(GOMIPS) GOARM=$(GOARM) go build $(PARAMS) -o $(BIN_DIR)/kvas2d ./cmd/kvas2d + GOOS=$(GOOS) GOARCH=$(GOARCH) GOMIPS=$(GOMIPS) GOARM=$(GOARM) go build $(PARAMS) -o $(BIN_DIR)/magitrickled ./cmd/magitrickled package: @mkdir -p $(PKG_DIR)/control diff --git a/README.md b/README.md index 4b6914d..809712a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,130 @@ -# kvas2 +# MagiTrickle -Better implementation of [KVAS](https://github.com/qzeleza/kvas) +MagiTrickle - Маршрутизация трафика на основе DNS запросов для роутеров Keenetic (под управлением [Entware](https://github.com/The-BB/Entware-Keenetic)). + +*(Продукт в данный момент находится в состоянии разработки)* + +Данное программное обеспечение реализует маршрутизацию трафика на основе проксирования через себя DNS запросов. Можно указать список доменных имён, которые нужно маршрутизировать на тот, или иной интерфейс, вместо бесконечного накопления IP адресов. + +### Особенности, в сравнении с другим ПО: +1. Не требует отключения встроенного в Keenetic DNS сервера - всё работает методом перенаправления портов. +2. Работает с любыми туннелями, которые умеют поднимать UNIX интерфейс. +3. Несколько типов правил - domain, namespace, wildcard и regex. +4. Не тянет за собой огромное количество сторонних пакетов пакетов. Вся конфигурация находится в одном месте (в одном файле). +5. Возможность создавать несколько групп на разные сети. +6. Моментальное бесшовное включение/выключение сервиса. + +### Roadmap: +1. CLI интерфейс для добавления/удаления записей в режиме реального времени. (Уже заложен функционал обработки записей в реальном времени, необходимо заняться CLI интерфейсом) +2. Дружелюбный к пользователю Web-GUI для конфигурации записей. +3. Поддержка подсетей и диапазона IP адресов. +4. Поддержка автообновляемых "подпискок" на список доменных имён (готовые списки подключаемые несколькими кликами мышки). + +### Установка: +Т.к. в данный момент нету никакого дружелюбного к пользователю интерфейсов - данное руководство рассчитано на тех, кому просто нужна маршрутизация на требуемые для него домены без отключения встроенного в Keenetic DNS сервера. + +Программа не была досканально протестирована, возможны очень редкие "вылеты". Максимально возможный риск заключается в том, что придётся перезапускать роутер, но шанс этого маловероятен. + +1. Устанавливаем пакет: +```bash +opkg install magitrickle_0.1.0-3_mipsel-3.4.ipk +``` +2. Копируем конфиг: +```bash +cp /opt/var/lib/magitrickle/config.yaml.example /opt/var/lib/magitrickle/config.yaml +``` +3. Настраиваем конфиг (если не понимаете что делаете - не трогайте группу "app"!): +```yaml +configVersion: 0.1.0 +app: # Настройки программы - не трогайте, если не знаете что к чему + dnsProxy: + host: + address: '[::]' # Адрес, который будет слушать программа для приёма DNS запросов + port: 3553 # Порт + upstream: + address: 127.0.0.1 # Адрес, используемый для отправки DNS запросов + port: 53 # Порт + disableRemap53: false # Флаг отключения перепривязки 53 порта + disableFakePTR: false # Флаг отключения подделки PTR записи (без неё есть проблемы, может быть будет исправлено в будущем) + disableDropAAAA: false # Флаг отключения откидывания AAAA записей + netfilter: + iptables: + chainPrefix: MT_ # Префикс для названий цепочек IPTables + ipset: + tablePrefix: mt_ # Префикс для названий таблиц IPSet + additionalTTL: 3600 # Дополнительный TTL (если от DNS пришел TTL 300, то к этому числу прибавится указанный TTL) + link: # Список адресов где будет подменяться DNS + - br0 + - br1 + logLevel: info # Уровень логов (trace, debug, info, warn, error) +groups: # Список групп + - id: d663876a # Уникальный ID группы (8 символов в диапозоне "0123456789abcdef") + name: Routing 1 # Человеко-читаемое имя (для будущего CLI и Web-GUI) + interface: nwg0 # Интерфейс, на который будет выполняться маршрутизация + fixProtect: false # Подключение интерфейса в список для выхода в интернет (для неподдерживаемых Keenetic туннелей) + rules: # Список правил + - id: 6f34ee91 # Уникальный ID правила (8 символов в диапозоне "0123456789abcdef") + name: Wildcard Example # Человеко-читаемое имя (для будущего CLI и Web-GUI) + type: wildcard # Тип правила + rule: '*.example.com' # Правило + enable: true # Флаг активации + - id: 00ae5f7c + name: RegEx Example + type: regex + rule: '^.*.regex.example.com$' + enable: true + - id: d663876b + name: Routing 2 + interface: nwg1 + fixProtect: false + rules: + - id: 6120dc8a + name: Domain Example + type: domain + rule: 'domain.example.com' + enable: true +``` +Примеры правил: +* Domain (один домен без поддоменов) +```yaml + - id: 6120dc8a + name: Domain Example + type: domain + rule: 'example.com' + enable: true +``` +* Namespace (домен и все его поддомены) +```yaml + - id: b9751782 + name: Namespace Example + type: namespace + rule: 'example.com' + enable: true +``` +* Wildcard +```yaml + - id: 6f34ee91 + name: Wildcard Example + type: wildcard + rule: '*.example.com' + enable: true +``` +* RegEx +```yaml + - id: 00ae5f7c + name: RegEx Example + type: regex + rule: '^.*.regex.example.com$' + enable: true +``` +4. Запускаем сервис: +```bash +/opt/etc/init.d/S99magitrickle start +``` + +### Отладка +Если вам нужна отладка, то останавливаем сервис и запускаем "демона" руками: +```bash +/opt/etc/init.d/S99magitrickle stop +magitrickled +``` diff --git a/cmd/kvas2d/main.go b/cmd/magitrickled/main.go similarity index 90% rename from cmd/kvas2d/main.go rename to cmd/magitrickled/main.go index ce7e732..d41f618 100644 --- a/cmd/kvas2d/main.go +++ b/cmd/magitrickled/main.go @@ -10,18 +10,18 @@ import ( "sync" "syscall" - "kvas2" - "kvas2/constant" - "kvas2/models" + "magitrickle" + "magitrickle/constant" + "magitrickle/models" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "gopkg.in/yaml.v3" ) -const cfgFolderLocation = "/opt/var/lib/kvas2" +const cfgFolderLocation = "/opt/var/lib/magitrickle" const cfgFileLocation = cfgFolderLocation + "/config.yaml" -const pidFileLocation = "/opt/var/run/kvas2.pid" +const pidFileLocation = "/opt/var/run/magitrickle.pid" func checkPIDFile() error { data, err := os.ReadFile(pidFileLocation) @@ -59,10 +59,10 @@ func main() { log.Info(). Str("version", constant.Version). Str("commit", constant.Commit). - Msg("starting kvas2 daemon") + Msg("starting MagiTrickle daemon") if err := checkPIDFile(); err != nil { - log.Fatal().Err(err).Msg("failed to start kvas2 daemon") + log.Fatal().Err(err).Msg("failed to start MagiTrickle daemon") } if err := createPIDFile(); err != nil { @@ -78,7 +78,7 @@ func main() { } cfg = models.Config{ ConfigVersion: "0.1.0", - App: kvas2.DefaultAppConfig, + App: magitrickle.DefaultAppConfig, } out, err := yaml.Marshal(cfg) if err != nil { @@ -122,7 +122,7 @@ func main() { zerolog.SetGlobalLevel(zerolog.InfoLevel) } - app := kvas2.New() + app := magitrickle.New() err = app.ImportConfig(cfg) if err != nil { log.Fatal().Err(err).Msg("failed to import config") diff --git a/go.mod b/go.mod index 2c1dd53..a7a12dc 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module kvas2 +module magitrickle go 1.21 diff --git a/group/group.go b/group/group.go index 25faec7..ab7e98b 100644 --- a/group/group.go +++ b/group/group.go @@ -5,9 +5,9 @@ import ( "net" "time" - "kvas2/models" - "kvas2/netfilter-helper" - "kvas2/records" + "magitrickle/models" + "magitrickle/netfilter-helper" + "magitrickle/records" "github.com/coreos/go-iptables/iptables" "github.com/rs/zerolog/log" diff --git a/kvas2.go b/magitrickle.go similarity index 98% rename from kvas2.go rename to magitrickle.go index dbd0ba9..79640a5 100644 --- a/kvas2.go +++ b/magitrickle.go @@ -1,4 +1,4 @@ -package kvas2 +package magitrickle import ( "context" @@ -9,11 +9,11 @@ import ( "strings" "time" - "kvas2/dns-mitm-proxy" - "kvas2/group" - "kvas2/models" - "kvas2/netfilter-helper" - "kvas2/records" + "magitrickle/dns-mitm-proxy" + "magitrickle/group" + "magitrickle/models" + "magitrickle/netfilter-helper" + "magitrickle/records" "github.com/miekg/dns" "github.com/rs/zerolog/log" @@ -38,10 +38,10 @@ var DefaultAppConfig = models.App{ }, Netfilter: models.Netfilter{ IPTables: models.IPTables{ - ChainPrefix: "KVAS2_", + ChainPrefix: "MT_", }, IPSet: models.IPSet{ - TablePrefix: "kvas2_", + TablePrefix: "mt_", AdditionalTTL: 3600, }, }, @@ -254,7 +254,7 @@ func (a *App) start(ctx context.Context) (err error) { /* Socket (for netfilter.d events) */ - socketPath := "/opt/var/run/kvas2.sock" + socketPath := "/opt/var/run/magitrickle.sock" err = os.Remove(socketPath) if err != nil && !errors.Is(err, os.ErrNotExist) { return fmt.Errorf("failed to remove existed UNIX socket: %w", err) diff --git a/opt/etc/init.d/S99kvas2 b/opt/etc/init.d/S99magitrickle old mode 100755 new mode 100644 similarity index 89% rename from opt/etc/init.d/S99kvas2 rename to opt/etc/init.d/S99magitrickle index 25f01a7..15e0aec --- a/opt/etc/init.d/S99kvas2 +++ b/opt/etc/init.d/S99magitrickle @@ -1,7 +1,7 @@ #!/bin/sh ENABLED=yes -PROCS=kvas2d +PROCS=magitrickled ARGS="" PREARGS="" DESC=$PROCS diff --git a/opt/etc/ndm/netfilter.d/100-kvas2 b/opt/etc/ndm/netfilter.d/100-magitrickle old mode 100755 new mode 100644 similarity index 75% rename from opt/etc/ndm/netfilter.d/100-kvas2 rename to opt/etc/ndm/netfilter.d/100-magitrickle index 52d46c5..5eb76cf --- a/opt/etc/ndm/netfilter.d/100-kvas2 +++ b/opt/etc/ndm/netfilter.d/100-magitrickle @@ -1,5 +1,5 @@ #!/bin/sh -SOCKET_PATH="/opt/var/run/kvas2.sock" +SOCKET_PATH="/opt/var/run/magitrickle.sock" if [ ! -S "$SOCKET_PATH" ]; then exit fi diff --git a/opt/var/lib/kvas2/config.yaml.example b/opt/var/lib/magitrickle/config.yaml.example similarity index 94% rename from opt/var/lib/kvas2/config.yaml.example rename to opt/var/lib/magitrickle/config.yaml.example index 3022c9c..58d692a 100644 --- a/opt/var/lib/kvas2/config.yaml.example +++ b/opt/var/lib/magitrickle/config.yaml.example @@ -12,9 +12,9 @@ app: disableDropAAAA: false netfilter: iptables: - chainPrefix: KVAS2_ + chainPrefix: MT_ ipset: - tablePrefix: kvas2_ + tablePrefix: mt_ additionalTTL: 3600 link: - br0