go-nftables-client

Go-низкоуровневая обёртка для управления nftables через командную строку.

Возможности

  • Добавление и удаление таблиц (add table, delete table)
  • Добавление и удаление цепочек (add chain, delete chain, настройка hook/policy)
  • Добавление, удаление, очистка правил (add rule, delete rule, flush)
  • Абстракции для работы с IP/IP6/inet/arp/bridge/netdev families
  • Интерфейс для выполнения CLI-команд nftables напрямую
  • Простой и минималистичный API для быстрой интеграции
  • Добавлена возможность формировать batch-команды и отправлять их в nftables одним вызовом.

Установка

go get git.kor-elf.net/kor-elf-shield/go-nftables-client

Пример использования

package main

import (
    "log"
    "git.kor-elf.net/kor-elf-shield/go-nftables-client"
    "git.kor-elf.net/kor-elf-shield/go-nftables-client/family"
	"git.kor-elf.net/kor-elf-shield/go-nftables-client/chain"
)

func main() {
	nftClient, err := nft.New()
    if err != nil {
        log.Fatalf("nft not found: %v", err)
    }

    // Добавить таблицу
    if err := nftClient.Table().Add(family.IP, "test"); err != nil {
        log.Fatalf("table add failed: %v", err)
    }

    chainType := chain.NewBaseChainOptions(chain.TypeFilter)
    chainType.Hook = chain.HookOutput
    chainType.Priority = 0
    chainType.Policy = chain.PolicyAccept
    if err := nftClient.Chain().Add(family.IP, "test", "test", chainType); err != nil {
        log.Fatalf("table add failed: %v", err)
    }

    // Добавить правило (пример: дропать пакеты от 1.2.3.4)
    if err := nftClient.Rule().Add(family.IP, "test", "test", "ip", "saddr", "1.2.3.4", "drop"); err != nil {
        log.Fatalf("rule add failed: %v", err)
    }
}

Batch commands

Библиотека поддерживает отправку команд в nft через batch-файлы.

Это позволяет заранее сформировать набор команд, например для таблиц, цепочек и правил, а затем выполнить их одной операцией.

Пример использования

package main

import (
    "log"
    "git.kor-elf.net/kor-elf-shield/go-nftables-client"
    "git.kor-elf.net/kor-elf-shield/go-nftables-client/family"
    "git.kor-elf.net/kor-elf-shield/go-nftables-client/chain"
)

func main() {
	nftClient, err := nft.New()
	if err != nil {
		log.Fatalf("nft not found: %v", err)
	}

	batchBuilder, err := nft.NewBatchBuilder("/tmp/nft_batch")
	if err != nil {
		log.Fatalf("batch builder init failed: %v", err)
	}
	defer func() {
		_ = batchBuilder.Close()
	}()

	// Добавить таблицу
	if err := batchBuilder.Table().Add(family.IP, "test"); err != nil {
		log.Fatalf("table add failed: %v", err)
	}

	chainType := chain.NewBaseChainOptions(chain.TypeFilter)
	chainType.Hook = chain.HookOutput
	chainType.Priority = 0
	chainType.Policy = chain.PolicyAccept
	if err := batchBuilder.Chain().Add(family.IP, "test", "test", chainType); err != nil {
		log.Fatalf("table add failed: %v", err)
	}

	// Добавить правило (пример: дропать пакеты от 1.2.3.4)
	if err := batchBuilder.Rule().Add(family.IP, "test", "test", "ip", "saddr", "1.2.3.4", "drop"); err != nil {
		log.Fatalf("rule add failed: %v", err)
	}

	batch := batchBuilder.Build()
	defer func() {
		_ = batch.Close()
	}()

	// Выполняет пакет команд после проверки их корректности
	if err := nftClient.ExecuteBatchAfterCheck(batch); err != nil {
		log.Fatalf("batch execute failed: %v", err)
	}
}

Краткое описание API

nft.Table().Add(family.Type, tableName string) error
nft.Table().Delete(family.Type, tableName string) error
nft.Table().Clear(family.Type, tableName string) error

nft.Chain().Add(family.Type, table, chain string, baseChain chain.ChainOptions) error
nft.Chain().Create(family family.Type, table, chain string, baseChain chain.ChainOptions) error
nft.Chain().Rename(family family.Type, table, oldChainName, newChainName string) error
nft.Chain().Delete(family.Type, table, chain string) error
nft.Chain().Clear(family.Type, table, chain string) error

nft.Rule().Add(family.Type, table, chain string, expr ...string) error
nft.Rule().Insert(family family.Type, table, chain string, expr ...string) error
nft.Rule().Replace(family family.Type, table, chain string, handle uint64, expr ...string) error
nft.Rule().Delete(family family.Type, table, chain string, handle uint64) error


nft.Clear() error           // flush ruleset
nft.Version() (Version, error) // информация о версии nftables
nft.Command() command.NFT   // ручное выполнение любых nft-команд

// ExecuteBatchAfterCheck Выполняет пакет команд после проверки их корректности
nft.ExecuteBatchAfterCheck(batch Batch) error

// ExecuteBatch Выполняет пакет команд
nft.ExecuteBatch(batch Batch) error

Требования

  • Go 1.25+
  • Установленный nft (/usr/sbin/nft, /sbin/nft или доступен через PATH)

Лицензия

MIT

S
Description
No description provided
Readme MIT 115 KiB
v0.2.0 Latest
2026-04-26 16:51:32 +05:00
Languages
Go 100%