new naming
All checks were successful
Build and Package OPKG / Build for aarch64-3.10 (push) Successful in 2m5s
Build and Package OPKG / Build for armv5-3.2 (push) Successful in 53s
Build and Package OPKG / Build for armv7-2.6 (push) Successful in 55s
Build and Package OPKG / Build for armv7-3.2 (push) Successful in 53s
Build and Package OPKG / Build for mips-3.4 (push) Successful in 55s
Build and Package OPKG / Build for mipsel-3.4 (push) Successful in 55s

This commit is contained in:
Vladimir Avtsenov 2025-02-14 17:16:20 +03:00
parent 6a2c5e6c11
commit 1967d4e0dc
11 changed files with 163 additions and 36 deletions

View File

@ -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

View File

@ -1,5 +1,5 @@
# Contributors
# Коллабораторы
## Consultants
## Консультация
- **nesteroff561** - [GitHub](https://github.com/nesteroff561) - "Help with understanding `iptables`"
- **nesteroff561** ([GitHub](https://github.com/nesteroff561)) - Помощь с `iptables`

View File

@ -1,4 +1,4 @@
APP_NAME = kvas2
APP_NAME = magitrickle
APP_DESCRIPTION = DNS-based routing application
APP_MAINTAINER = Vladimir Avtsenov <vladimir.lsk.cool@gmail.com>
@ -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

131
README.md
View File

@ -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
```

View File

@ -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")

2
go.mod
View File

@ -1,4 +1,4 @@
module kvas2
module magitrickle
go 1.21

View File

@ -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"

View File

@ -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)

View File

@ -1,7 +1,7 @@
#!/bin/sh
ENABLED=yes
PROCS=kvas2d
PROCS=magitrickled
ARGS=""
PREARGS=""
DESC=$PROCS

View File

@ -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

View File

@ -12,9 +12,9 @@ app:
disableDropAAAA: false
netfilter:
iptables:
chainPrefix: KVAS2_
chainPrefix: MT_
ipset:
tablePrefix: kvas2_
tablePrefix: mt_
additionalTTL: 3600
link:
- br0