MagiTrickle/netfilter-helper/iptables-cleaner.go

56 lines
1.3 KiB
Go
Raw Normal View History

2024-10-21 23:11:59 +03:00
package netfilterHelper
import (
"fmt"
"strings"
)
2025-02-11 15:22:08 +03:00
func (nh *NetfilterHelper) CleanIPTables(chainPrefix string) error {
2024-10-21 23:11:59 +03:00
jumpToChainPrefix := fmt.Sprintf("-j %s", chainPrefix)
2025-02-11 15:22:08 +03:00
for _, table := range []string{"nat", "mangle", "filter"} {
2024-10-21 23:11:59 +03:00
chainListToDelete := make([]string, 0)
chains, err := nh.IPTables.ListChains(table)
if err != nil {
return fmt.Errorf("listing chains error: %w", err)
}
for _, chain := range chains {
if strings.HasPrefix(chain, chainPrefix) {
chainListToDelete = append(chainListToDelete, chain)
continue
}
rules, err := nh.IPTables.List(table, chain)
if err != nil {
return fmt.Errorf("listing rules error: %w", err)
}
for _, rule := range rules {
2025-02-12 04:07:45 +03:00
if !strings.Contains(rule, jumpToChainPrefix) {
continue
}
ruleSlice := strings.Split(rule, " ")
if len(ruleSlice) < 2 || ruleSlice[0] != "-A" || ruleSlice[1] != chain {
continue
}
err = nh.IPTables.Delete(table, chain, ruleSlice[2:]...)
if err != nil {
return fmt.Errorf("rule deletion error: %w", err)
2024-10-21 23:11:59 +03:00
}
}
}
for _, chain := range chainListToDelete {
2025-02-11 15:22:08 +03:00
err = nh.IPTables.ClearAndDeleteChain(table, chain)
2024-10-21 23:11:59 +03:00
if err != nil {
return fmt.Errorf("deleting chain error: %w", err)
}
}
}
return nil
}