# go-nftables-client Go-низкоуровневая обёртка для управления [nftables](https://wiki.nftables.org/wiki-nftables/index.php/Main_Page) через командную строку. ## Возможности - Добавление и удаление таблиц (`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 одним вызовом. ## Установка ```sh go get git.kor-elf.net/kor-elf-shield/go-nftables-client ``` ## Пример использования ```go 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-файлы. Это позволяет заранее сформировать набор команд, например для таблиц, цепочек и правил, а затем выполнить их одной операцией. ## Пример использования ```go 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 ```go 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](https://git.kor-elf.net/kor-elf-shield/go-nftables-client/src/branch/main/LICENSE)