From 032a88e83540fe4ce2a789f461ce4187de010924 Mon Sep 17 00:00:00 2001 From: dnomd343 Date: Thu, 18 Aug 2022 20:40:34 +0800 Subject: [PATCH] update: complete radvd package --- cmd/config/decode.go | 21 +++++----- cmd/config/main.go | 8 ++-- cmd/controller.go | 5 --- cmd/radvd/radvd.go | 98 ++++++++++++++++++++++++++++++++++++-------- cmd/xproxy.go | 26 +++++------- 5 files changed, 106 insertions(+), 52 deletions(-) diff --git a/cmd/config/decode.go b/cmd/config/decode.go index bfc7a89..8b8fab5 100644 --- a/cmd/config/decode.go +++ b/cmd/config/decode.go @@ -2,6 +2,7 @@ package config import ( "XProxy/cmd/common" + "XProxy/cmd/radvd" log "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" ) @@ -34,11 +35,7 @@ type yamlConfig struct { IPv4 yamlNetConfig `yaml:"ipv4"` // ipv4 network configure IPv6 yamlNetConfig `yaml:"ipv6"` // ipv6 network configure } `yaml:"network"` - Radvd struct { - Enable bool `yaml:"enable"` - Options map[string]string `yaml:"options"` - Prefix map[string]map[string]string `yaml:"prefix"` - } `yaml:"radvd"` + Radvd radvd.Config `yaml:"radvd"` } func yamlDecode(raw []byte) yamlConfig { @@ -122,12 +119,14 @@ func decodeProxy(rawConfig *yamlConfig, config *Config) { } func decodeRadvd(rawConfig *yamlConfig, config *Config) { - config.RadvdEnable = rawConfig.Radvd.Enable - log.Debugf("Radvd enable -> %t", config.RadvdEnable) - config.RadvdOptions = rawConfig.Radvd.Options - log.Debugf("Radvd options -> %v", config.RadvdOptions) - config.RadvdPrefix = rawConfig.Radvd.Prefix - log.Debugf("Radvd prefix -> %v", config.RadvdPrefix) + config.Radvd = rawConfig.Radvd + log.Debugf("Radvd enable -> %t", config.Radvd.Enable) + log.Debugf("Radvd options -> %v", config.Radvd.Option) + log.Debugf("Radvd prefix -> %v", config.Radvd.Prefix) + log.Debugf("Radvd route -> %v", config.Radvd.Route) + log.Debugf("Radvd clients -> %v", config.Radvd.Client) + log.Debugf("Radvd RDNSS -> %v", config.Radvd.RDNSS) + log.Debugf("Radvd DNSSL -> %v", config.Radvd.DNSSL) } func decodeUpdate(rawConfig *yamlConfig) (string, map[string]string) { diff --git a/cmd/config/main.go b/cmd/config/main.go index 92fc863..2b6c545 100644 --- a/cmd/config/main.go +++ b/cmd/config/main.go @@ -2,6 +2,7 @@ package config import ( "XProxy/cmd/common" + "XProxy/cmd/radvd" log "github.com/sirupsen/logrus" "os" ) @@ -27,9 +28,10 @@ type Config struct { SocksInbounds map[string]int AddOnInbounds []interface{} - RadvdEnable bool - RadvdOptions map[string]string - RadvdPrefix map[string]map[string]string + Radvd radvd.Config + //RadvdEnable bool + //RadvdOptions map[string]string + //RadvdPrefix map[string]map[string]string } func Load(configFile string) Config { diff --git a/cmd/controller.go b/cmd/controller.go index 49331dd..02f14c8 100644 --- a/cmd/controller.go +++ b/cmd/controller.go @@ -6,7 +6,6 @@ import ( "XProxy/cmd/config" "XProxy/cmd/network" "XProxy/cmd/proxy" - "XProxy/cmd/radvd" log "github.com/sirupsen/logrus" ) @@ -47,10 +46,6 @@ func loadNetwork(settings *config.Config) { network.Load(settings.DNS, v4Settings, v6Settings) } -func loadRadvd(settings *config.Config) { - radvd.Load(settings.RadvdOptions, settings.RadvdPrefix) -} - func runScript(settings *config.Config) { for _, script := range settings.Script { log.Infof("Run script command -> %s", script) diff --git a/cmd/radvd/radvd.go b/cmd/radvd/radvd.go index 48e2715..eb394c1 100644 --- a/cmd/radvd/radvd.go +++ b/cmd/radvd/radvd.go @@ -6,28 +6,92 @@ import ( "strings" ) -func optionList(options map[string]string, intendNum int) string { - var result string - intend := strings.Repeat(" ", intendNum) +type Config struct { + Enable bool `yaml:"enable" json:"enable"` + Client []string `yaml:"client" json:"client"` + Option map[string]string `yaml:"option" json:"option"` + Route struct { + Cidr string `yaml:"cidr" json:"cidr"` + Option map[string]string `yaml:"option" json:"option"` + } `yaml:"route" json:"route"` + Prefix struct { + Cidr string `yaml:"cidr" json:"cidr"` + Option map[string]string `yaml:"option" json:"option"` + } `yaml:"prefix" json:"prefix"` + DNSSL struct { // DNS Search List + Suffix []string `yaml:"suffix" json:"suffix"` + Option map[string]string `yaml:"option" json:"option"` + } `yaml:"dnssl" json:"dnssl"` + RDNSS struct { // Recursive DNS Server + IP []string `yaml:"ip" json:"ip"` + Option map[string]string `yaml:"option" json:"option"` + } `yaml:"rdnss" json:"rdnss"` +} + +func genSpace(num int) string { + return strings.Repeat(" ", num) +} + +func loadOption(options map[string]string, intend int) string { // load options into radvd config format + var ret string for option, value := range options { - result += intend + option + " " + value + ";\n" + ret += genSpace(intend) + option + " " + value + ";\n" } - return result + return ret } -func loadPrefix(prefix string, options map[string]string) string { - result := " prefix " + prefix + " {\n" - result += optionList(options, 8) - return result + " };\n" +func loadClient(clients []string) string { + if len(clients) == 0 { // without client settings + return "" + } + ret := genSpace(4) + "clients {\n" + for _, client := range clients { + ret += genSpace(8) + client + ";\n" + } + return ret + genSpace(4) + "};\n" +} + +func loadPrefix(prefix string, option map[string]string) string { // load radvd prefix configure + if prefix == "" { // without prefix settings + return "" + } + header := genSpace(4) + "prefix " + prefix + " {\n" + return header + loadOption(option, 8) + genSpace(4) + "};\n" } -func Load(options map[string]string, prefixes map[string]map[string]string) { - radvdConfig := "interface eth0 {\n" - radvdConfig += optionList(options, 4) - for prefix, prefixOptions := range prefixes { - radvdConfig += loadPrefix(prefix, prefixOptions) +func loadRoute(cidr string, option map[string]string) string { // load radvd route configure + if cidr == "" { // without route settings + return "" } - radvdConfig += "};\n" - log.Debugf("Radvd configure -> \n%s", radvdConfig) - common.WriteFile("/etc/radvd.conf", radvdConfig, true) + header := genSpace(4) + "route " + cidr + " {\n" + return header + loadOption(option, 8) + genSpace(4) + "};\n" +} + +func loadRdnss(ip []string, option map[string]string) string { + if len(ip) == 0 { // without rdnss settings + return "" + } + header := genSpace(4) + "RDNSS " + strings.Join(ip, " ") + " {\n" + return header + loadOption(option, 8) + genSpace(4) + "};\n" +} + +func loadDnssl(suffix []string, option map[string]string) string { + if len(suffix) == 0 { // without dnssl settings + return "" + } + header := genSpace(4) + "DNSSL " + strings.Join(suffix, " ") + " {\n" + return header + loadOption(option, 8) + genSpace(4) + "};\n" +} + +func Load(Radvd *Config) { + config := "interface eth0 {\n" + config += loadOption(Radvd.Option, 4) + config += loadPrefix(Radvd.Prefix.Cidr, Radvd.Prefix.Option) + config += loadRoute(Radvd.Route.Cidr, Radvd.Route.Option) + config += loadClient(Radvd.Client) + config += loadRdnss(Radvd.RDNSS.IP, Radvd.RDNSS.Option) + config += loadDnssl(Radvd.DNSSL.Suffix, Radvd.DNSSL.Option) + config += "};\n" + log.Debugf("Radvd configure -> \n%s", config) + common.WriteFile("/etc/radvd.conf", config, true) } diff --git a/cmd/xproxy.go b/cmd/xproxy.go index 4bcf55d..24057ef 100644 --- a/cmd/xproxy.go +++ b/cmd/xproxy.go @@ -3,6 +3,7 @@ package main import ( "XProxy/cmd/config" "XProxy/cmd/process" + "XProxy/cmd/radvd" log "github.com/sirupsen/logrus" "os" "os/signal" @@ -24,18 +25,11 @@ var configFile = exposeDir + "/config.yml" var subProcess []*process.Process -func runProxy() { - proxy := process.New("xray", "-confdir", configDir) - proxy.Run(true) - proxy.Daemon() - subProcess = append(subProcess, proxy) -} - -func runRadvd() { - radvd := process.New("radvd", "-n", "-m", "logfile", "-l", exposeDir+"/log/radvd.log") - radvd.Run(true) - radvd.Daemon() - subProcess = append(subProcess, radvd) +func runProcess(command ...string) { + sub := process.New(command...) + sub.Run(true) + sub.Daemon() + subProcess = append(subProcess, sub) } func blockWait() { @@ -58,12 +52,12 @@ func main() { loadNetwork(&settings) loadProxy(&settings) loadAsset(&settings) - loadRadvd(&settings) + radvd.Load(&settings.Radvd) runScript(&settings) - runProxy() - if settings.RadvdEnable { - runRadvd() + runProcess("xray", "-confdir", configDir) + if settings.Radvd.Enable { + runProcess("radvd", "-n", "-m", "logfile", "-l", exposeDir+"/log/radvd.log") } blockWait() process.Exit(subProcess...)