feat: add new command to control firewall in banfogre interface
All checks were successful
CI.yml / build (push) Successful in 1m44s
All checks were successful
CI.yml / build (push) Successful in 1m44s
This commit is contained in:
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
ip string
|
||||||
name string
|
name string
|
||||||
service string
|
service string
|
||||||
path string
|
path string
|
||||||
@@ -136,19 +138,7 @@ var daemonCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
var b blocker.BlockerEngine
|
var b blocker.BlockerEngine
|
||||||
fw := cfg.Firewall.Name
|
fw := cfg.Firewall.Name
|
||||||
switch fw {
|
b = blocker.GetBlocker(fw, cfg.Firewall.Config)
|
||||||
case "ufw":
|
|
||||||
b = blocker.NewUfw(log)
|
|
||||||
case "iptables":
|
|
||||||
b = blocker.NewIptables(log, cfg.Firewall.Config)
|
|
||||||
case "nftables":
|
|
||||||
b = blocker.NewNftables(log, cfg.Firewall.Config)
|
|
||||||
case "firewalld":
|
|
||||||
b = blocker.NewFirewalld(log)
|
|
||||||
default:
|
|
||||||
log.Error("Unknown firewall", "firewall", fw)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
r, err := config.LoadRuleConfig()
|
r, err := config.LoadRuleConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Failed to load rules", "error", err)
|
log.Error("Failed to load rules", "error", err)
|
||||||
@@ -201,6 +191,72 @@ var daemonCmd = &cobra.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var UnbanCmd = &cobra.Command{
|
||||||
|
Use: "unban",
|
||||||
|
Short: "Unban IP",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
cfg, err := config.LoadConfig()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fw := cfg.Firewall.Name
|
||||||
|
b := blocker.GetBlocker(fw, cfg.Firewall.Config)
|
||||||
|
if ip == "" {
|
||||||
|
fmt.Println("IP can't be empty")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if net.ParseIP(ip) == nil {
|
||||||
|
fmt.Println("Invalid IP")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
err = b.Unban(ip)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println("IP unblocked successfully!")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var BanCmd = &cobra.Command{
|
||||||
|
Use: "ban",
|
||||||
|
Short: "Ban IP",
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
|
cfg, err := config.LoadConfig()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fw := cfg.Firewall.Name
|
||||||
|
b := blocker.GetBlocker(fw, cfg.Firewall.Config)
|
||||||
|
if ip == "" {
|
||||||
|
fmt.Println("IP can't be empty")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if net.ParseIP(ip) == nil {
|
||||||
|
fmt.Println("Invalid IP")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
err = b.Ban(ip)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println("IP unblocked successfully!")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rule block
|
||||||
var ruleCmd = &cobra.Command{
|
var ruleCmd = &cobra.Command{
|
||||||
Use: "rule",
|
Use: "rule",
|
||||||
Short: "Manage rules",
|
Short: "Manage rules",
|
||||||
@@ -251,6 +307,10 @@ func Execute() {
|
|||||||
rootCmd.AddCommand(daemonCmd)
|
rootCmd.AddCommand(daemonCmd)
|
||||||
rootCmd.AddCommand(initCmd)
|
rootCmd.AddCommand(initCmd)
|
||||||
rootCmd.AddCommand(ruleCmd)
|
rootCmd.AddCommand(ruleCmd)
|
||||||
|
rootCmd.AddCommand(BanCmd)
|
||||||
|
rootCmd.AddCommand(UnbanCmd)
|
||||||
|
UnbanCmd.Flags().StringVarP(&ip, "ip", "i", "", "ip to unban")
|
||||||
|
BanCmd.Flags().StringVarP(&ip, "ip", "i", "", "ip to ban")
|
||||||
// Rule comand block
|
// Rule comand block
|
||||||
ruleCmd.AddCommand(addCmd)
|
ruleCmd.AddCommand(addCmd)
|
||||||
ruleCmd.AddCommand(listCmd)
|
ruleCmd.AddCommand(listCmd)
|
||||||
|
|||||||
@@ -1,6 +1,27 @@
|
|||||||
package blocker
|
package blocker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/d3m0k1d/BanForge/internal/logger"
|
||||||
|
)
|
||||||
|
|
||||||
type BlockerEngine interface {
|
type BlockerEngine interface {
|
||||||
Ban(ip string) error
|
Ban(ip string) error
|
||||||
Unban(ip string) error
|
Unban(ip string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetBlocker(fw string, config string) BlockerEngine {
|
||||||
|
switch fw {
|
||||||
|
case "ufw":
|
||||||
|
return NewUfw(logger.New(false))
|
||||||
|
case "iptables":
|
||||||
|
return NewIptables(logger.New(false), config)
|
||||||
|
case "nftables":
|
||||||
|
return NewNftables(logger.New(false), config)
|
||||||
|
case "firewalld":
|
||||||
|
return NewFirewalld(logger.New(false))
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("Unknown firewall: %s", fw))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user