diff --git a/README.md b/README.md index 8f75399..3999875 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Go-низкоуровневая обёртка для управления [nfta - Абстракции для работы с IP/IP6/inet/arp/bridge/netdev families - Интерфейс для выполнения CLI-команд nftables напрямую - Простой и минималистичный API для быстрой интеграции +- Добавлена возможность формировать batch-команды и отправлять их в nftables одним вызовом. ## Установка ```sh @@ -29,13 +30,13 @@ import ( ) func main() { - nft, err := nft.New() + nftClient, err := nft.New() if err != nil { log.Fatalf("nft not found: %v", err) } // Добавить таблицу - if err := nft.Table().Add(family.IP, "test"); err != nil { + if err := nftClient.Table().Add(family.IP, "test"); err != nil { log.Fatalf("table add failed: %v", err) } @@ -43,16 +44,78 @@ func main() { chainType.Hook = chain.HookOutput chainType.Priority = 0 chainType.Policy = chain.PolicyAccept - if err := nft.Chain().Add(family.IP, "test", "test", chainType); err != nil { + 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 := nft.Rule().Add(family.IP, "test", "test", "ip", "saddr", "1.2.3.4", "drop"); err != nil { + 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 @@ -76,6 +139,12 @@ 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 ``` ## Требования