mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-09-26 08:00:55 +00:00
93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
package iptables_helper
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/constant"
|
|
"github.com/1Panel-dev/1Panel/agent/global"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/firewall/lifecycle"
|
|
)
|
|
|
|
func (m *Manager) EnsureIPv6BaseChains() error {
|
|
return EnsureIPv6BaseChains(m.panelPort())
|
|
}
|
|
|
|
func RepairIPv6BaseChains(panelPort string) error {
|
|
initialized, bound, err := LoadFamilyInitStatus(constant.FirewallFamilyIPv6, "base")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return repairIPv6BaseChains(initialized, bound, BindIPv6BaseChains, func() error {
|
|
return EnsureIPv6BaseChains(panelPort)
|
|
})
|
|
}
|
|
|
|
func repairIPv6BaseChains(initialized, bound bool, bind, ensure func() error) error {
|
|
if initialized {
|
|
if bound {
|
|
return nil
|
|
}
|
|
return bind()
|
|
}
|
|
return ensure()
|
|
}
|
|
|
|
func EnsureIPv6BaseChains(panelPort string) error {
|
|
commands, err := lifecycle.ResolveIptablesCommands()
|
|
if err != nil || !commands.IPv6Available() {
|
|
return fmt.Errorf("ip6tables and ip6tables-restore are required")
|
|
}
|
|
if panelPort == "" {
|
|
return fmt.Errorf("panel port is required")
|
|
}
|
|
if err := ensureBaseChainsFamily(true); err != nil {
|
|
return err
|
|
}
|
|
script, err := buildBaseChainsRestoreScript(global.Dir.FirewallDir, panelPort, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
protectedRules := []string{
|
|
"-A " + BasicBeforeChain + " " + IoRuleIn,
|
|
"-A " + BasicBeforeChain + " " + EstablishedRule,
|
|
}
|
|
for _, rule := range protectedRules {
|
|
if !containsIptablesRule(script, rule) {
|
|
script = strings.Replace(script, "COMMIT\n", rule+"\nCOMMIT\n", 1)
|
|
}
|
|
}
|
|
if err := restoreRules(commands.Restore6, script); err != nil {
|
|
return fmt.Errorf("batch initialize IPv6 base chains: %w", err)
|
|
}
|
|
if err := setBaseChainBindings(true, true); err != nil {
|
|
return err
|
|
}
|
|
for _, chain := range []struct{ name, file string }{
|
|
{BasicBeforeChain, IPv6FileName(BasicBeforeFileName)},
|
|
{BasicChain, IPv6FileName(BasicFileName)},
|
|
{BasicAfterChain, IPv6FileName(BasicAfterFileName)},
|
|
} {
|
|
if err := SaveIPv6RulesToFile(FilterTab, chain.name, chain.file); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func UnbindIPv6BaseChains() error {
|
|
commands, err := lifecycle.ResolveIptablesCommands()
|
|
if err != nil || !commands.IPv6Available() {
|
|
return nil
|
|
}
|
|
return setBaseChainBindings(true, false)
|
|
}
|
|
|
|
func BindIPv6BaseChains() error {
|
|
commands, err := lifecycle.ResolveIptablesCommands()
|
|
if err != nil || !commands.IPv6Available() {
|
|
return nil
|
|
}
|
|
return setBaseChainBindings(true, true)
|
|
}
|