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