package firewall import ( "fmt" "os" "github.com/1Panel-dev/1Panel/agent/app/dto" "github.com/1Panel-dev/1Panel/agent/app/repo" "github.com/1Panel-dev/1Panel/agent/app/service" "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/firewall" firewallClient "github.com/1Panel-dev/1Panel/agent/utils/firewall/client" "github.com/1Panel-dev/1Panel/agent/utils/firewall/client/iptables" ) func Init() { if !needInit() { return } global.LOG.Info("initializing firewall settings...") client, err := firewall.NewFirewallClient() if err != nil { return } clientName := client.Name() settingRepo := repo.NewISettingRepo() if clientName == "ufw" || clientName == "iptables" { if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelForward, iptables.ForwardFileName); err != nil { global.LOG.Errorf("load forward rules from file failed, err: %v", err) return } if err := iptables.LoadRulesFromFile(iptables.NatTab, iptables.Chain1PanelPreRouting, iptables.ForwardFileName1); err != nil { global.LOG.Errorf("load prerouting rules from file failed, err: %v", err) return } if err := iptables.LoadRulesFromFile(iptables.NatTab, iptables.Chain1PanelPostRouting, iptables.ForwardFileName2); err != nil { global.LOG.Errorf("load postrouting rules from file failed, err: %v", err) return } global.LOG.Infof("loaded iptables rules for forward from file successfully") iptablesForwardStatus, _ := settingRepo.GetValueByKey("IptablesForwardStatus") if iptablesForwardStatus == constant.StatusEnable { if err := firewallClient.EnableIptablesForward(); err != nil { global.LOG.Errorf("enable iptables forward failed, err: %v", err) return } } } if clientName != "iptables" { return } if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelBasicBefore, iptables.BasicBeforeFileName); err != nil { global.LOG.Errorf("load basic before rules from file failed, err: %v", err) return } if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelBasic, iptables.BasicFileName); err != nil { global.LOG.Errorf("load basic rules from file failed, err: %v", err) return } if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelBasicAfter, iptables.BasicAfterFileName); err != nil { global.LOG.Errorf("load basic after rules from file failed, err: %v", err) return } panelPort := service.LoadPanelPort() if len(panelPort) == 0 { global.LOG.Errorf("find 1panel service port failed") return } if err := iptables.AddRule(iptables.FilterTab, iptables.Chain1PanelBasicBefore, fmt.Sprintf("-p tcp -m tcp --dport %v -j ACCEPT", panelPort)); err != nil { global.LOG.Errorf("add port accept rule %v failed, err: %v", panelPort, err) return } global.LOG.Infof("loaded iptables rules for basic from file successfully") iptablesService := service.IptablesService{} iptablesStatus, _ := settingRepo.GetValueByKey("IptablesStatus") if iptablesStatus == constant.StatusEnable { if err := iptablesService.Operate(dto.IptablesOp{Operate: "bind-base"}); err != nil { global.LOG.Errorf("bind base chains failed, err: %v", err) return } } if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelInput, iptables.InputFileName); err != nil { global.LOG.Errorf("load input rules from file failed, err: %v", err) return } if err := iptables.LoadRulesFromFile(iptables.FilterTab, iptables.Chain1PanelOutput, iptables.OutputFileName); err != nil { global.LOG.Errorf("load output rules from file failed, err: %v", err) return } global.LOG.Infof("loaded iptables rules for input and output from file successfully") iptablesInputStatus, _ := settingRepo.GetValueByKey("IptablesInputStatus") if iptablesInputStatus == constant.StatusEnable { if err := iptablesService.Operate(dto.IptablesOp{Name: iptables.Chain1PanelInput, Operate: "bind"}); err != nil { global.LOG.Errorf("bind input chains failed, err: %v", err) return } } iptablesOutputStatus, _ := settingRepo.GetValueByKey("IptablesOutputStatus") if iptablesOutputStatus == constant.StatusEnable { if err := iptablesService.Operate(dto.IptablesOp{Name: iptables.Chain1PanelOutput, Operate: "bind"}); err != nil { global.LOG.Errorf("bind output chains failed, err: %v", err) return } } } func needInit() bool { file, err := os.OpenFile("/run/1panel_boot_mark", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0644) if err != nil { if os.IsExist(err) { return false } global.LOG.Errorf("check boot mark file failed: %v", err) return true } defer file.Close() fmt.Fprintf(file, "Boot Mark for 1panel\n") return true }